@iowarp/clio-coder 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +16 -5
- package/dist/{acp-2BEHC4DL.js → acp-SK4MD6MM.js} +10 -10
- package/dist/{agents-LNNFTM53.js → agents-2FN2K6ME.js} +30 -25
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-KXXFI2VS.js → auth-QIYZWM5I.js} +13 -13
- package/dist/{chunk-KHSFENX2.js → chunk-3HAPLH5M.js} +10 -10
- package/dist/{chunk-24I7BN55.js → chunk-465YSENW.js} +2 -2
- package/dist/{chunk-4OC57DA6.js → chunk-4DGYLA73.js} +53 -2
- package/dist/{chunk-CYQKWTG3.js → chunk-4DWFMQDR.js} +4 -4
- package/dist/{chunk-E2ER4LJF.js → chunk-5C3AQNDW.js} +25 -1
- package/dist/{chunk-22NAGB7X.js → chunk-5C77SEEY.js} +5 -94
- package/dist/{chunk-43AOLP7E.js → chunk-5FR74PWO.js} +2 -1
- package/dist/{chunk-K7T3E2SR.js → chunk-5UJ6ECTS.js} +10 -9
- package/dist/{chunk-6US73PDB.js → chunk-6M7VS3J3.js} +5 -5
- package/dist/{chunk-CJUB2JJ2.js → chunk-6TUKSZVF.js} +5 -5
- package/dist/{chunk-5JGRAMKL.js → chunk-AB4XIIVB.js} +8 -6
- package/dist/{chunk-R46L2BIR.js → chunk-BMWK7ZIZ.js} +14 -20
- package/dist/{chunk-4BPJXDWC.js → chunk-C4JBQ5SR.js} +30 -14
- package/dist/{chunk-XXQNGV4M.js → chunk-CEYBNUGC.js} +243 -63
- package/dist/{chunk-VEZEGCGW.js → chunk-D4MDIG46.js} +20 -18
- package/dist/chunk-DJNLUABN.js +843 -0
- package/dist/{chunk-RY3LY4J5.js → chunk-DMD2AGVS.js} +5 -4
- package/dist/{chunk-KOHPCX4K.js → chunk-DOOEX22V.js} +2 -2
- package/dist/chunk-DQA7QLMD.js +123 -0
- package/dist/chunk-DR52UMZW.js +21 -0
- package/dist/{chunk-XF5N4U5A.js → chunk-EBEFWSGL.js} +6 -5
- package/dist/{chunk-EYPA3EGJ.js → chunk-EELBMBT6.js} +120 -13
- package/dist/{chunk-CKXWIANG.js → chunk-EOOQZZDE.js} +16 -14
- package/dist/{chunk-WR67VIZY.js → chunk-FOT2FX5J.js} +63 -5
- package/dist/{chunk-FYYLNIL5.js → chunk-GH5622CP.js} +2 -2
- package/dist/chunk-GWS3VEIW.js +195 -0
- package/dist/{chunk-LYF7OHWH.js → chunk-J7PIKKWC.js} +8 -463
- package/dist/{chunk-NILBFAPG.js → chunk-JNXPYBB4.js} +2 -2
- package/dist/{chunk-4VP4KH3K.js → chunk-JRIO5UD2.js} +4 -4
- package/dist/{chunk-6XXKFVSN.js → chunk-JTSEDYVQ.js} +7 -7
- package/dist/{chunk-QKMUKYO7.js → chunk-KCMKRQX4.js} +236 -84
- package/dist/chunk-KZ2H5X4G.js +1026 -0
- package/dist/{chunk-QNQHSOLF.js → chunk-LADCF22A.js} +12 -12
- package/dist/chunk-M4AKACEO.js +382 -0
- package/dist/{chunk-XYDYPRZI.js → chunk-MXI6J5JF.js} +7 -7
- package/dist/{chunk-G7MUEIGA.js → chunk-OB5HIGJY.js} +1 -1
- package/dist/{chunk-EKY57CSP.js → chunk-OBMAI2DP.js} +61 -767
- package/dist/chunk-PD3MESLB.js +242 -0
- package/dist/{chunk-ZRGEBJ4T.js → chunk-QCTRSGHQ.js} +21 -21
- package/dist/chunk-RVG5JXAL.js +41 -0
- package/dist/{chunk-RD5U66HV.js → chunk-SROCI7ZU.js} +7 -7
- package/dist/{chunk-MFFY33HR.js → chunk-THKY7CD7.js} +466 -205
- package/dist/{chunk-PCZJO5TI.js → chunk-UFQ3F4FW.js} +13 -178
- package/dist/{chunk-AD2SYQYC.js → chunk-UHXRNZ2J.js} +121 -3
- package/dist/chunk-UND3GU2L.js +103 -0
- package/dist/{chunk-QM3F2GKX.js → chunk-UUANF5CR.js} +2247 -2096
- package/dist/chunk-UVDSQ6LW.js +472 -0
- package/dist/{chunk-DJVECN66.js → chunk-VQNODYQ4.js} +14 -14
- package/dist/{chunk-3BPUFZDL.js → chunk-VREKEFLL.js} +3 -3
- package/dist/{chunk-PBTHKCPN.js → chunk-WJHBC77E.js} +6 -6
- package/dist/{chunk-XE2VEJHX.js → chunk-X2KV5FXT.js} +2 -2
- package/dist/{chunk-ZXF4XRKW.js → chunk-XEGB6BCN.js} +157 -7
- package/dist/{chunk-E25LMLRW.js → chunk-YD734TPH.js} +2 -2
- package/dist/{verifiers-NCBTHHN2.js → chunk-YTYFXUI3.js} +65 -322
- package/dist/{chunk-OH3TOQTB.js → chunk-ZGH7FGS5.js} +13 -7
- package/dist/cli/index.js +32 -30
- package/dist/{clio-M2KGYUFZ.js → clio-WBVQEBKO.js} +7 -7
- package/dist/{code-nav-GQNL7XA6.js → code-nav-FGGFIE7L.js} +3 -3
- package/dist/{components-5TTYYX6G.js → components-F7OEATSO.js} +4 -4
- package/dist/{config-XUUYQIWO.js → config-TRBL3RCF.js} +34 -29
- package/dist/{configure-IHJ7YOMV.js → configure-OLCVPHNM.js} +15 -15
- package/dist/{context-74JLXAWD.js → context-MJIJ6GOX.js} +11 -11
- package/dist/{context-ZQ7SIFJV.js → context-WFPKQSM6.js} +19 -3
- package/dist/{context-75MIWW3U.js → context-XEWE3MOJ.js} +31 -26
- package/dist/{context-clear-GYKWNUML.js → context-clear-KNOS2JPB.js} +31 -26
- package/dist/{context-working-set-UX5KEP4J.js → context-working-set-EUXAZI6N.js} +8 -8
- package/dist/{dispatch-runner-GIJBHNFL.js → dispatch-runner-B7MTOVKL.js} +313 -53
- package/dist/{docs-6FZSCG5B.js → docs-FLJTIDSE.js} +4 -4
- package/dist/{doctor-SVJ5BZCW.js → doctor-RN4YKO2X.js} +14 -14
- package/dist/{eval-CG6LLBLD.js → eval-RUBJVSNQ.js} +8 -7
- package/dist/{evidence-ZYFIEN42.js → evidence-JZNBUOQZ.js} +30 -25
- package/dist/{evolve-QGEXEMDW.js → evolve-FJVC4KKI.js} +30 -25
- package/dist/{extensions-ADGNCJJD.js → extensions-IQL36S7K.js} +4 -4
- package/dist/{fleet-S5R4ZOQY.js → fleet-BDKYJFCP.js} +214 -360
- package/dist/fleet-commands-ZFIWZSB3.js +70 -0
- package/dist/fleet-graph-Y6HPXIVF.js +125 -0
- package/dist/fleet-new-RDVJLHHH.js +48 -0
- package/dist/fleet-validate-BIYREGIK.js +79 -0
- package/dist/{init-5DRU55YR.js → init-LQUB5COQ.js} +44 -37
- package/dist/library-NJAHIGG4.js +217 -0
- package/dist/{memory-7YKKR6UC.js → memory-OG6HOYKM.js} +31 -26
- package/dist/{models-ZPOLRU2C.js → models-5ZG5XY7J.js} +21 -20
- package/dist/{monitor-US5F5YGZ.js → monitor-TJ7AMTGB.js} +49 -30
- package/dist/{orchestrator-E2AL4T5N.js → orchestrator-WZYB54DM.js} +3827 -581
- package/dist/{paths-E7KYAQWE.js → paths-XUC7GS6E.js} +4 -4
- package/dist/{reset-KZ652EK6.js → reset-PXQT45IY.js} +7 -7
- package/dist/{run-SRNBKDWD.js → run-FQ74YF62.js} +53 -45
- package/dist/{share-CGZE33UP.js → share-FW7SVCL3.js} +33 -9
- package/dist/{skills-S2X4DLY5.js → skills-7E7IRB3R.js} +24 -8
- package/dist/{skills-eval-W2GGIC4R.js → skills-eval-LI75W6OK.js} +34 -27
- package/dist/{targets-54SWINWB.js → targets-4CIFKCTW.js} +23 -22
- package/dist/{terminal-lease-SAIF2OGY.js → terminal-lease-WUZY7ZV5.js} +4 -4
- package/dist/{uninstall-BVLWXKBT.js → uninstall-7FV7IP4E.js} +4 -4
- package/dist/{upgrade-JKAR27XC.js → upgrade-K2HVIVMQ.js} +20 -19
- package/dist/{usage-MSAWCLX4.js → usage-GTZELZQX.js} +116 -49
- package/dist/verifiers-RLAHT27O.js +336 -0
- package/dist/{verify-X5HDROLA.js → verify-BX3BRKH5.js} +7 -6
- package/dist/{wiki-generate-GUSOQ6ZP.js → wiki-generate-ASIFASCN.js} +45 -37
- package/dist/worker/entry.js +38 -35
- package/docs/README.md +3 -2
- package/docs/acp.md +1 -1
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +10 -6
- package/docs/built-in-agents.md +26 -2
- package/docs/capacity-and-scheduling.md +1 -1
- package/docs/commands-and-modes.md +82 -2
- package/docs/configuration-and-targets.md +79 -2
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +1 -1
- package/docs/dispatch-architecture-rationale.md +1 -1
- package/docs/documentation-coverage.md +3 -3
- package/docs/documentation-guide.md +3 -3
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +5 -5
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +4 -1
- package/docs/extensions-and-sharing.md +6 -2
- package/docs/fleet-demo-runbook.md +2 -2
- package/docs/fleet-dispatch.md +197 -10
- package/docs/git-commit-provenance.md +2 -2
- package/docs/glossary.md +1 -1
- package/docs/installation-and-lifecycle.md +2 -2
- package/docs/middleware-and-components.md +2 -1
- package/docs/model-catalog.md +1 -1
- package/docs/observability.md +55 -8
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +79 -64
- package/docs/resource-library.md +59 -0
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +37 -1
- package/docs/skills-marketplace.md +16 -3
- package/docs/tool-usage.md +14 -7
- package/docs/trace-store.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +3 -3
- package/package.json +1 -1
- package/src/cli/fleet-commands.ts +37 -0
- package/src/cli/fleet-graph.ts +102 -0
- package/src/cli/fleet-new.ts +36 -0
- package/src/cli/fleet-preflight.ts +121 -0
- package/src/cli/fleet-validate.ts +30 -0
- package/src/cli/fleet.ts +173 -335
- package/src/cli/index.ts +3 -1
- package/src/cli/library.ts +190 -0
- package/src/cli/share.ts +13 -1
- package/src/cli/usage.ts +111 -19
- package/src/core/bus-events.ts +4 -0
- package/src/core/commit-attribution.ts +4 -4
- package/src/core/config.ts +130 -0
- package/src/core/defaults.ts +81 -0
- package/src/domains/agents/builtins/architect.md +1 -0
- package/src/domains/agents/builtins/oracle.md +33 -0
- package/src/domains/agents/catalog.ts +13 -1
- package/src/domains/agents/fleet-contract.ts +278 -16
- package/src/domains/agents/index.ts +14 -0
- package/src/domains/agents/result-contract.ts +235 -1
- package/src/domains/config/classify.ts +4 -0
- package/src/domains/dispatch/active-route-planner.ts +14 -0
- package/src/domains/dispatch/backoff.ts +2 -1
- package/src/domains/dispatch/capability-match.ts +1 -0
- package/src/domains/dispatch/checkout-writer-lease.ts +175 -0
- package/src/domains/dispatch/contract.ts +34 -0
- package/src/domains/dispatch/delegation-plan.ts +167 -0
- package/src/domains/dispatch/execution-plan.ts +76 -5
- package/src/domains/dispatch/execution-role.ts +3 -1
- package/src/domains/dispatch/execution-scheduler.ts +183 -67
- package/src/domains/dispatch/extension.ts +258 -9
- package/src/domains/dispatch/fleet-gate.ts +14 -0
- package/src/domains/dispatch/fleet-plan.ts +63 -3
- package/src/domains/dispatch/fleet-run.ts +737 -0
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/host-verification.ts +178 -0
- package/src/domains/dispatch/index.ts +38 -0
- package/src/domains/dispatch/intent.ts +159 -0
- package/src/domains/dispatch/receipt-integrity.ts +8 -4
- package/src/domains/dispatch/state.ts +36 -3
- package/src/domains/dispatch/types.ts +51 -6
- package/src/domains/dispatch/validation.ts +66 -6
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/middleware/index.ts +15 -0
- package/src/domains/middleware/watchdog.ts +281 -0
- package/src/domains/observability/contract.ts +3 -1
- package/src/domains/observability/cost.ts +12 -1
- package/src/domains/observability/extension.ts +2 -2
- package/src/domains/observability/index.ts +10 -0
- package/src/domains/observability/out-of-turn-usage.ts +223 -0
- package/src/domains/resources/index.ts +20 -0
- package/src/domains/resources/library.ts +326 -0
- package/src/domains/resources/skills/marketplace.ts +37 -12
- package/src/domains/session/handoff.ts +629 -0
- package/src/domains/share/archive.ts +67 -2
- package/src/entry/orchestrator.ts +37 -0
- package/src/interactive/bus-notices.ts +26 -0
- package/src/interactive/chat-loop.ts +235 -1
- package/src/interactive/chat-renderer.ts +22 -0
- package/src/interactive/cost-overlay.ts +31 -3
- package/src/interactive/council-dispatch.ts +30 -0
- package/src/interactive/council-grid.ts +213 -0
- package/src/interactive/council.ts +99 -0
- package/src/interactive/dispatch-board.ts +260 -16
- package/src/interactive/fleet-run-preview.ts +307 -0
- package/src/interactive/footer/notifications.ts +219 -0
- package/src/interactive/handoff-round.ts +56 -0
- package/src/interactive/interactive-application.ts +43 -1
- package/src/interactive/interactive-event-projection.ts +9 -1
- package/src/interactive/interactive-slash-runtime.ts +52 -2
- package/src/interactive/interactive-subscriptions.ts +14 -2
- package/src/interactive/oracle.ts +179 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +6 -0
- package/src/interactive/overlay-general-openers.ts +190 -1
- package/src/interactive/overlay-key-routing.ts +17 -1
- package/src/interactive/overlay-lifecycle.ts +41 -1
- package/src/interactive/overlay-permission-lifecycle.ts +10 -0
- package/src/interactive/overlay-resource-openers.ts +11 -3
- package/src/interactive/overlay-session-lifecycle.ts +234 -2
- package/src/interactive/overlays/fleet-run-approval.ts +208 -0
- package/src/interactive/overlays/handoff-review.ts +185 -0
- package/src/interactive/overlays/library-install-confirm.ts +151 -0
- package/src/interactive/overlays/list-overlay.ts +168 -2
- package/src/interactive/overlays/settings.ts +101 -4
- package/src/interactive/overlays/side-question.ts +139 -0
- package/src/interactive/overlays/skills-hub.ts +401 -15
- package/src/interactive/side-question.ts +171 -0
- package/src/interactive/slash-commands.ts +432 -5
- package/src/interactive/slash-spec.ts +19 -6
- package/src/interactive/theme/tokens.ts +30 -0
- package/src/interactive/turn-middleware.ts +15 -1
- package/src/interactive/watchdog-run.ts +75 -0
- package/src/interactive/worker-share.ts +56 -1
- package/src/interactive/worker-stream.ts +7 -0
- package/src/tools/bootstrap.ts +3 -0
- package/src/tools/compete-worktrees.ts +13 -79
- package/src/tools/dispatch-admission.ts +242 -8
- package/src/tools/dispatch-arguments.ts +57 -1
- package/src/tools/dispatch-plan.ts +136 -6
- package/src/tools/dispatch-runner.ts +319 -13
- package/src/tools/dispatch-types.ts +20 -1
- package/src/tools/dispatch.ts +72 -2
- package/src/tools/monitor.ts +16 -0
- package/src/tools/profiles.ts +18 -4
- package/src/tools/task-worktree.ts +238 -0
- package/src/tools/verify/authoring.ts +61 -1
- package/src/tools/verify/scripts.ts +62 -0
- package/src/tools/worker-evidence.ts +2 -1
- package/src/worker/spec-contract.ts +1 -0
- package/dist/chunk-HC4CLZ2Y.js +0 -68
|
@@ -20,6 +20,7 @@ import type { ResultContract } from "../domains/agents/result-contract.js";
|
|
|
20
20
|
import { AGENT_AUTOMATION_AUTHORITIES, type AgentAutomationAuthority } from "../domains/agents/spec.js";
|
|
21
21
|
import type { DispatchRequest } from "../domains/dispatch/contract.js";
|
|
22
22
|
import { type ExecutionRole, isExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
23
|
+
import { type DispatchIntent, isDispatchIntent } from "../domains/dispatch/intent.js";
|
|
23
24
|
import {
|
|
24
25
|
type ApprovedAssignmentRoute,
|
|
25
26
|
cloneApprovedAssignmentRoute,
|
|
@@ -31,7 +32,15 @@ import { isRoutingIntent, type RoutingIntent } from "../domains/dispatch/routing
|
|
|
31
32
|
import type { DispatchFailoverCandidate, DispatchFailoverMode } from "../domains/dispatch/validation.js";
|
|
32
33
|
import { prepareDispatchArguments } from "./dispatch-arguments.js";
|
|
33
34
|
|
|
34
|
-
export type DispatchPlanTopology =
|
|
35
|
+
export type DispatchPlanTopology =
|
|
36
|
+
| "parallel"
|
|
37
|
+
| "sequential"
|
|
38
|
+
| "pipeline"
|
|
39
|
+
| "review"
|
|
40
|
+
| "compete"
|
|
41
|
+
| "council"
|
|
42
|
+
| "detached"
|
|
43
|
+
| "fleet";
|
|
35
44
|
|
|
36
45
|
export type DispatchPlanSource = null | {
|
|
37
46
|
kind: "scout-transition";
|
|
@@ -51,6 +60,9 @@ export interface DispatchPlanTaskView {
|
|
|
51
60
|
task: string;
|
|
52
61
|
/** Exact canonical bounded briefing approved for this task. */
|
|
53
62
|
briefing?: string;
|
|
63
|
+
worktree?: true;
|
|
64
|
+
apply?: "merge" | "preserve";
|
|
65
|
+
worktreeDestination?: string;
|
|
54
66
|
model?: string;
|
|
55
67
|
node?: string;
|
|
56
68
|
/** Effective transport identity; host is authenticated for SSH placement. */
|
|
@@ -59,7 +71,8 @@ export interface DispatchPlanTaskView {
|
|
|
59
71
|
/** Effective configured target id used as the execution pin. */
|
|
60
72
|
target?: string;
|
|
61
73
|
/** Coordinator role when the topology expands one user task into several runs. */
|
|
62
|
-
role?: "task" | "builder" | "reviewer" | "candidate" | "judge";
|
|
74
|
+
role?: "task" | "builder" | "reviewer" | "candidate" | "judge" | "member" | "synthesis";
|
|
75
|
+
council?: { label: string; color?: string; round: number; rounds: number; synthesis: "none" | "judge" | "vote" };
|
|
63
76
|
/** One-based source task or gate cycle/candidate number. */
|
|
64
77
|
position?: number;
|
|
65
78
|
/** Normalized advisory posture and hard bounds sealed into the plan. */
|
|
@@ -79,6 +92,8 @@ export interface DispatchPlanTaskView {
|
|
|
79
92
|
authorityGrant: DispatchPlanAuthorityGrant;
|
|
80
93
|
agentDecision: RouteDecisionV1 | null;
|
|
81
94
|
wave: number | null;
|
|
95
|
+
intent?: DispatchIntent;
|
|
96
|
+
resolvedVerification?: NonNullable<DispatchRequest["resolvedVerification"]>;
|
|
82
97
|
}
|
|
83
98
|
|
|
84
99
|
export interface DispatchPlanView {
|
|
@@ -112,7 +127,20 @@ export interface ResolvedDispatchPlanArtifact {
|
|
|
112
127
|
Required<Pick<DispatchPlanTaskView, "agent" | "task" | "model" | "node" | "target">> &
|
|
113
128
|
Required<Pick<DispatchPlanTaskView, "nodeKind" | "failover">> &
|
|
114
129
|
Required<Pick<DispatchPlanTaskView, "routingIntent">> &
|
|
115
|
-
Pick<
|
|
130
|
+
Pick<
|
|
131
|
+
DispatchPlanTaskView,
|
|
132
|
+
| "briefing"
|
|
133
|
+
| "worktree"
|
|
134
|
+
| "apply"
|
|
135
|
+
| "worktreeDestination"
|
|
136
|
+
| "nodeHost"
|
|
137
|
+
| "role"
|
|
138
|
+
| "council"
|
|
139
|
+
| "position"
|
|
140
|
+
| "allowedCandidates"
|
|
141
|
+
| "intent"
|
|
142
|
+
| "resolvedVerification"
|
|
143
|
+
> &
|
|
116
144
|
Required<
|
|
117
145
|
Pick<
|
|
118
146
|
DispatchPlanTaskView,
|
|
@@ -136,7 +164,7 @@ export interface ResolvedDispatchPlanArtifact {
|
|
|
136
164
|
export function withResolvedPlanTaskPin(
|
|
137
165
|
request: DispatchRequest,
|
|
138
166
|
task: ResolvedDispatchPlanArtifact["tasks"][number] | undefined,
|
|
139
|
-
options: { pinTask?: boolean } = {},
|
|
167
|
+
options: { pinTask?: boolean; pinBriefing?: boolean } = {},
|
|
140
168
|
): DispatchRequest {
|
|
141
169
|
if (task === undefined) return request;
|
|
142
170
|
const {
|
|
@@ -170,7 +198,24 @@ export function withResolvedPlanTaskPin(
|
|
|
170
198
|
? {}
|
|
171
199
|
: { allowedCandidates: task.allowedCandidates.map((candidate) => ({ ...candidate })) }),
|
|
172
200
|
task: options.pinTask === false ? request.task : task.task,
|
|
173
|
-
...(
|
|
201
|
+
...(options.pinBriefing === false
|
|
202
|
+
? request.briefing !== undefined
|
|
203
|
+
? { briefing: request.briefing }
|
|
204
|
+
: {}
|
|
205
|
+
: task.briefing !== undefined
|
|
206
|
+
? { briefing: task.briefing }
|
|
207
|
+
: {}),
|
|
208
|
+
...(task.worktree === true
|
|
209
|
+
? {
|
|
210
|
+
worktree: true as const,
|
|
211
|
+
apply: task.apply ?? "merge",
|
|
212
|
+
...(task.worktreeDestination === undefined ? {} : { taskWorktreeDestination: task.worktreeDestination }),
|
|
213
|
+
}
|
|
214
|
+
: {}),
|
|
215
|
+
...(task.intent !== undefined ? { intent: structuredClone(task.intent) } : {}),
|
|
216
|
+
...(task.resolvedVerification !== undefined
|
|
217
|
+
? { resolvedVerification: task.resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
|
|
218
|
+
: {}),
|
|
174
219
|
target: task.target,
|
|
175
220
|
model: task.model,
|
|
176
221
|
node: task.node,
|
|
@@ -224,6 +269,12 @@ function taskViews(args: Record<string, unknown>): DispatchPlanTaskView[] {
|
|
|
224
269
|
};
|
|
225
270
|
const briefing = "briefing" in record ? str(record.briefing) : str(args.briefing);
|
|
226
271
|
if (briefing !== undefined) view.briefing = briefing;
|
|
272
|
+
const worktree = "worktree" in record ? record.worktree : args.worktree;
|
|
273
|
+
if (worktree === true) {
|
|
274
|
+
view.worktree = true;
|
|
275
|
+
const apply = "apply" in record ? record.apply : args.apply;
|
|
276
|
+
view.apply = apply === "preserve" ? "preserve" : "merge";
|
|
277
|
+
}
|
|
227
278
|
const model = str(record.model) ?? sharedModel;
|
|
228
279
|
if (model !== undefined) view.model = model;
|
|
229
280
|
const node = str(record.node) ?? sharedNode;
|
|
@@ -266,6 +317,7 @@ function canonicalCandidates(value: unknown): DispatchFailoverCandidate[] | null
|
|
|
266
317
|
function topologyOf(args: Record<string, unknown>): DispatchPlanTopology {
|
|
267
318
|
if (isRecord(args.apply_winner)) return "compete";
|
|
268
319
|
if (args.mode === "compete") return "compete";
|
|
320
|
+
if (args.mode === "council") return "council";
|
|
269
321
|
if (args.review === true || isRecord(args.review)) return "review";
|
|
270
322
|
if (args.detach === true) return "detached";
|
|
271
323
|
if (args.mode === "sequential") return "sequential";
|
|
@@ -315,6 +367,15 @@ function renderPlanText(
|
|
|
315
367
|
lines.push(
|
|
316
368
|
` ${index + 1}.${role} agent=${safeField(task.agent)}${target}${model}${node}${failover}${routingText} task=${JSON.stringify(safeField(task.task))}`,
|
|
317
369
|
);
|
|
370
|
+
if (task.council !== undefined) {
|
|
371
|
+
lines.push(
|
|
372
|
+
` council label=${safeField(task.council.label)} color=${safeField(task.council.color ?? "none")} round=${task.council.round} rounds=${task.council.rounds} synthesis=${task.council.synthesis}`,
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
if (task.worktree === true)
|
|
376
|
+
lines.push(
|
|
377
|
+
` worktree=true apply=${task.apply ?? "merge"} destination=${safeField(task.worktreeDestination ?? "unresolved")}`,
|
|
378
|
+
);
|
|
318
379
|
if (task.allowedCandidates !== undefined) {
|
|
319
380
|
for (const [candidateIndex, candidate] of task.allowedCandidates.entries()) {
|
|
320
381
|
lines.push(
|
|
@@ -352,6 +413,15 @@ function renderPlanText(
|
|
|
352
413
|
` briefing_bytes=${Buffer.byteLength(task.briefing, "utf8")} briefing_sha256=${createHash("sha256").update(task.briefing, "utf8").digest("hex")} briefing_preview=${JSON.stringify(safeField(task.briefing))}`,
|
|
353
414
|
);
|
|
354
415
|
}
|
|
416
|
+
if (task.intent !== undefined) {
|
|
417
|
+
const serialized = JSON.stringify(task.intent);
|
|
418
|
+
lines.push(` intent_sha256=${createHash("sha256").update(serialized, "utf8").digest("hex")}`);
|
|
419
|
+
}
|
|
420
|
+
for (const check of task.resolvedVerification ?? []) {
|
|
421
|
+
lines.push(
|
|
422
|
+
` verification check=${safeField(check.check)} argv=${JSON.stringify(check.argv)} cwd=${JSON.stringify(check.cwd)} timeout_ms=${check.timeoutMs}`,
|
|
423
|
+
);
|
|
424
|
+
}
|
|
355
425
|
}
|
|
356
426
|
return lines.join("\n");
|
|
357
427
|
}
|
|
@@ -362,12 +432,16 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
|
|
|
362
432
|
"agent",
|
|
363
433
|
"task",
|
|
364
434
|
"briefing",
|
|
435
|
+
"worktree",
|
|
436
|
+
"apply",
|
|
437
|
+
"worktreeDestination",
|
|
365
438
|
"model",
|
|
366
439
|
"node",
|
|
367
440
|
"nodeKind",
|
|
368
441
|
"nodeHost",
|
|
369
442
|
"target",
|
|
370
443
|
"role",
|
|
444
|
+
"council",
|
|
371
445
|
"position",
|
|
372
446
|
"routingIntent",
|
|
373
447
|
"failover",
|
|
@@ -381,6 +455,8 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
|
|
|
381
455
|
"authorityGrant",
|
|
382
456
|
"agentDecision",
|
|
383
457
|
"wave",
|
|
458
|
+
"intent",
|
|
459
|
+
"resolvedVerification",
|
|
384
460
|
]);
|
|
385
461
|
if (Object.keys(value).some((key) => !allowedKeys.has(key))) return false;
|
|
386
462
|
for (const key of [
|
|
@@ -409,17 +485,37 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
|
|
|
409
485
|
value.role !== "builder" &&
|
|
410
486
|
value.role !== "reviewer" &&
|
|
411
487
|
value.role !== "candidate" &&
|
|
412
|
-
value.role !== "judge"
|
|
488
|
+
value.role !== "judge" &&
|
|
489
|
+
value.role !== "member" &&
|
|
490
|
+
value.role !== "synthesis"
|
|
413
491
|
) {
|
|
414
492
|
return false;
|
|
415
493
|
}
|
|
416
494
|
if (value.position !== undefined && (!Number.isInteger(value.position) || Number(value.position) < 1)) return false;
|
|
495
|
+
if (value.council !== undefined) {
|
|
496
|
+
if (
|
|
497
|
+
!isRecord(value.council) ||
|
|
498
|
+
typeof value.council.label !== "string" ||
|
|
499
|
+
value.council.label.length === 0 ||
|
|
500
|
+
(value.council.color !== undefined && typeof value.council.color !== "string") ||
|
|
501
|
+
!Number.isInteger(value.council.round) ||
|
|
502
|
+
Number(value.council.round) < 1 ||
|
|
503
|
+
!Number.isInteger(value.council.rounds) ||
|
|
504
|
+
Number(value.council.rounds) < 1 ||
|
|
505
|
+
(value.council.synthesis !== "none" && value.council.synthesis !== "judge" && value.council.synthesis !== "vote")
|
|
506
|
+
)
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
417
509
|
if (value.nodeKind !== "local" && value.nodeKind !== "ssh") return false;
|
|
418
510
|
if (value.nodeKind === "ssh" && (typeof value.nodeHost !== "string" || value.nodeHost.trim().length === 0))
|
|
419
511
|
return false;
|
|
420
512
|
if (value.nodeKind === "local" && value.nodeHost !== undefined) return false;
|
|
421
513
|
if (value.briefing !== undefined && (typeof value.briefing !== "string" || value.briefing.trim().length === 0))
|
|
422
514
|
return false;
|
|
515
|
+
if (value.worktree !== undefined && value.worktree !== true) return false;
|
|
516
|
+
if (value.apply !== undefined && value.apply !== "merge" && value.apply !== "preserve") return false;
|
|
517
|
+
if (value.apply !== undefined && value.worktree !== true) return false;
|
|
518
|
+
if (value.worktreeDestination !== undefined && typeof value.worktreeDestination !== "string") return false;
|
|
423
519
|
if (failoverModeOf(value.failover) === undefined) return false;
|
|
424
520
|
if (!isRoutingIntent(value.routingIntent)) return false;
|
|
425
521
|
if (value.routeApproval !== null && !isApprovedAssignmentRoute(value.routeApproval)) return false;
|
|
@@ -441,6 +537,21 @@ function isResolvedTask(value: unknown): value is ResolvedDispatchPlanArtifact["
|
|
|
441
537
|
return false;
|
|
442
538
|
if (value.authorityGrant !== null && !isAuthorityGrant(value.authorityGrant)) return false;
|
|
443
539
|
if (value.agentDecision !== null && !isAgentDecision(value.agentDecision)) return false;
|
|
540
|
+
if (value.intent !== undefined && !isDispatchIntent(value.intent)) return false;
|
|
541
|
+
if (
|
|
542
|
+
value.resolvedVerification !== undefined &&
|
|
543
|
+
(!Array.isArray(value.resolvedVerification) ||
|
|
544
|
+
!value.resolvedVerification.every(
|
|
545
|
+
(check) =>
|
|
546
|
+
isRecord(check) &&
|
|
547
|
+
typeof check.check === "string" &&
|
|
548
|
+
Array.isArray(check.argv) &&
|
|
549
|
+
check.argv.every((arg) => typeof arg === "string") &&
|
|
550
|
+
typeof check.cwd === "string" &&
|
|
551
|
+
typeof check.timeoutMs === "number",
|
|
552
|
+
))
|
|
553
|
+
)
|
|
554
|
+
return false;
|
|
444
555
|
if (value.failover === "approved") {
|
|
445
556
|
if (canonicalCandidates(value.allowedCandidates) === null) return false;
|
|
446
557
|
} else if (value.allowedCandidates !== undefined) {
|
|
@@ -455,11 +566,16 @@ const RESULT_CONTRACT_KINDS = new Set<ResultContract["kind"]>([
|
|
|
455
566
|
"architect-plan",
|
|
456
567
|
"scout-report",
|
|
457
568
|
"verifier-report",
|
|
569
|
+
"council-report",
|
|
458
570
|
"debugger-report",
|
|
459
571
|
"research-report",
|
|
460
572
|
"mutation-report",
|
|
461
573
|
"provenance-report",
|
|
574
|
+
"oracle-report",
|
|
462
575
|
"external-delegation",
|
|
576
|
+
"artifact-report",
|
|
577
|
+
"context-handbook",
|
|
578
|
+
"delegation-plan",
|
|
463
579
|
]);
|
|
464
580
|
|
|
465
581
|
function isAuthorityGrant(value: unknown): value is Exclude<DispatchPlanAuthorityGrant, null> {
|
|
@@ -572,6 +688,7 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
|
|
|
572
688
|
value.topology !== "pipeline" &&
|
|
573
689
|
value.topology !== "review" &&
|
|
574
690
|
value.topology !== "compete" &&
|
|
691
|
+
value.topology !== "council" &&
|
|
575
692
|
value.topology !== "detached" &&
|
|
576
693
|
value.topology !== "fleet"
|
|
577
694
|
) {
|
|
@@ -632,6 +749,13 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
|
|
|
632
749
|
agent: task.agent.trim(),
|
|
633
750
|
task: task.task.trim(),
|
|
634
751
|
...(task.briefing !== undefined ? { briefing: task.briefing.trim() } : {}),
|
|
752
|
+
...(task.worktree === true
|
|
753
|
+
? {
|
|
754
|
+
worktree: true as const,
|
|
755
|
+
apply: task.apply ?? "merge",
|
|
756
|
+
...(task.worktreeDestination === undefined ? {} : { worktreeDestination: task.worktreeDestination }),
|
|
757
|
+
}
|
|
758
|
+
: {}),
|
|
635
759
|
model: task.model.trim(),
|
|
636
760
|
node: task.node.trim(),
|
|
637
761
|
nodeKind: task.nodeKind,
|
|
@@ -652,7 +776,12 @@ export function resolvedDispatchPlanFromArgs(args: Record<string, unknown>): Res
|
|
|
652
776
|
: {}),
|
|
653
777
|
...(task.nodeHost !== undefined ? { nodeHost: task.nodeHost.trim() } : {}),
|
|
654
778
|
...(task.role !== undefined ? { role: task.role } : {}),
|
|
779
|
+
...(task.council !== undefined ? { council: { ...task.council } } : {}),
|
|
655
780
|
...(task.position !== undefined ? { position: task.position } : {}),
|
|
781
|
+
...(task.intent !== undefined ? { intent: structuredClone(task.intent) } : {}),
|
|
782
|
+
...(task.resolvedVerification !== undefined
|
|
783
|
+
? { resolvedVerification: task.resolvedVerification.map((check) => ({ ...check, argv: [...check.argv] })) }
|
|
784
|
+
: {}),
|
|
656
785
|
})),
|
|
657
786
|
costCeilingUsd: value.costCeilingUsd,
|
|
658
787
|
deadlineMs: value.deadlineMs as number | null,
|
|
@@ -716,6 +845,7 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
|
|
|
716
845
|
(tasks.length > 1 ||
|
|
717
846
|
source !== null ||
|
|
718
847
|
topology === "compete" ||
|
|
848
|
+
topology === "council" ||
|
|
719
849
|
remote ||
|
|
720
850
|
tasks.some((task) => task.failover === "approved") ||
|
|
721
851
|
confirmation !== undefined ||
|