mirror of
https://github.com/stablyai/orca.git
synced 2026-09-25 00:02:35 +00:00
* feat(orchestration): surface nested worker depth and propagate it across hosts Builds on the depth enforcement in the previous commit, which shipped with the setting reachable only by editing settings.json and with workers never told they could nest. Adds the Settings -> Agents control (a 1/2/3 select rather than a free-form number, which bounds the value without inventing a numeric input primitive). The key stays absent from the SettingsUpdate RPC schema, matching agentSkillSharingEnabled: settings.update is reachable from the CLI, so an RPC-writable depth would let a worker raise its own cap. Adds a SUB-DISPATCH block to the dispatch preamble, emitted only when the worker actually has budget left. A worker told it "usually cannot" delegate still tries and then reports the refusal as a blocker, so the section is omitted entirely rather than softened. Propagates depth to federated worker hosts. Previously the home side computed and stored a depth the remote host never received, so a remote attachment always read as depth 1. That is correct at the default cap and wrong as soon as the cap is raised — precisely when someone starts relying on nesting. The field is optional, so an older Run home simply omits it and the attachment's NOT NULL DEFAULT 1 keeps the fail-closed behaviour. Enforcement still runs on the executing host against that host's own cap, consistent with the SSH execution boundary. * fix(orchestration): close nested depth readiness gaps * fix(settings): defer nested depth translations * fix(orchestration): drop federated depth keys that main already landed The enforcement PR's review pass added the same federated depth propagation before it merged, so replaying this branch onto main produced duplicate object keys. Keep main's versions -- its schema entry validates an integer >= 1 rather than any finite number. * fix(settings): label nested worker depth select * fix(settings): move nested depth to orchestration * fix(settings): refine nested depth placement
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
NESTED_WORKER_MAX_DEPTH_DEFAULT,
|
|
nestedWorkerDepthExceededMessage,
|
|
resolveNestedWorkerMaxDepth
|
|
} from './nested-worker-depth'
|
|
|
|
describe('resolveNestedWorkerMaxDepth', () => {
|
|
it('defaults to 1 when unset', () => {
|
|
expect(resolveNestedWorkerMaxDepth(undefined)).toBe(1)
|
|
expect(resolveNestedWorkerMaxDepth(null)).toBe(1)
|
|
expect(resolveNestedWorkerMaxDepth({})).toBe(1)
|
|
})
|
|
|
|
it('accepts whole numbers at or above 1', () => {
|
|
expect(resolveNestedWorkerMaxDepth({ nestedWorkerMaxDepth: 1 })).toBe(1)
|
|
expect(resolveNestedWorkerMaxDepth({ nestedWorkerMaxDepth: 3 })).toBe(3)
|
|
})
|
|
|
|
// A malformed setting must not become a way to get unlimited nesting, so every
|
|
// rejected shape falls back to the default rather than disabling the cap.
|
|
it.each([
|
|
['a numeric string', '2'],
|
|
['a boolean', true],
|
|
['zero', 0],
|
|
['negative', -1],
|
|
['fractional', 1.5],
|
|
['NaN', Number.NaN],
|
|
['Infinity', Number.POSITIVE_INFINITY],
|
|
['unsafe integer', Number.MAX_SAFE_INTEGER + 1],
|
|
['null', null]
|
|
])('falls back to the default for %s', (_label, value) => {
|
|
expect(resolveNestedWorkerMaxDepth({ nestedWorkerMaxDepth: value as unknown as number })).toBe(
|
|
NESTED_WORKER_MAX_DEPTH_DEFAULT
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('depth-exceeded message', () => {
|
|
it('names both depths and tells the worker to finish the task itself', () => {
|
|
const message = nestedWorkerDepthExceededMessage(2, 1)
|
|
expect(message).toContain('depth 2 (max 1)')
|
|
expect(message).toContain('Complete this task yourself')
|
|
})
|
|
})
|