@duetso/agent 0.2.2 → 0.2.3
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/README.md +19 -11
- package/dist/package.json +4 -4
- package/dist/src/cli/config.d.ts +10 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +24 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +11 -9
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/inline-slash.d.ts +2 -1
- package/dist/src/cli/inline-slash.d.ts.map +1 -1
- package/dist/src/cli/inline-slash.js +14 -5
- package/dist/src/cli/inline-slash.js.map +1 -1
- package/dist/src/cli/memory-query.d.ts +1 -1
- package/dist/src/cli/model.d.ts +1 -1
- package/dist/src/cli/model.d.ts.map +1 -1
- package/dist/src/cli/model.js +1 -1
- package/dist/src/cli/model.js.map +1 -1
- package/dist/src/cli/route.d.ts +84 -0
- package/dist/src/cli/route.d.ts.map +1 -0
- package/dist/src/cli/route.js +261 -0
- package/dist/src/cli/route.js.map +1 -0
- package/dist/src/cli/rpc.d.ts +43 -2
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +176 -23
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts +8 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +24 -7
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/shared.d.ts +4 -3
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +3 -4
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/cli/shutdown.d.ts +4 -2
- package/dist/src/cli/shutdown.d.ts.map +1 -1
- package/dist/src/cli/shutdown.js +4 -2
- package/dist/src/cli/shutdown.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +12 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/core/structured-output.d.ts +2 -0
- package/dist/src/core/structured-output.d.ts.map +1 -1
- package/dist/src/core/structured-output.js +1 -0
- package/dist/src/core/structured-output.js.map +1 -1
- package/dist/src/lib/system-reminder.d.ts +14 -0
- package/dist/src/lib/system-reminder.d.ts.map +1 -0
- package/dist/src/lib/system-reminder.js +53 -0
- package/dist/src/lib/system-reminder.js.map +1 -0
- package/dist/src/lib/walk-ancestors.d.ts +9 -0
- package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
- package/dist/src/lib/walk-ancestors.js +28 -0
- package/dist/src/lib/walk-ancestors.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -1
- package/dist/src/memory/observational-prompts.js +2 -1
- package/dist/src/memory/observational-prompts.js.map +1 -1
- package/dist/src/memory/observational.d.ts +31 -4
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +43 -4
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/model-resolution/catalog.d.ts +2 -2
- package/dist/src/model-resolution/catalog.d.ts.map +1 -1
- package/dist/src/model-resolution/catalog.js +61 -33
- package/dist/src/model-resolution/catalog.js.map +1 -1
- package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
- package/dist/src/model-resolution/duet-gateway.js +119 -19
- package/dist/src/model-resolution/duet-gateway.js.map +1 -1
- package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
- package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
- package/dist/src/model-resolution/model-gateway.js.map +1 -0
- package/dist/src/model-resolution/resolver.d.ts +11 -4
- package/dist/src/model-resolution/resolver.d.ts.map +1 -1
- package/dist/src/model-resolution/resolver.js +39 -8
- package/dist/src/model-resolution/resolver.js.map +1 -1
- package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
- package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
- package/dist/src/model-routing/advisor-transcript.js +103 -0
- package/dist/src/model-routing/advisor-transcript.js.map +1 -0
- package/dist/src/model-routing/advisor.d.ts +27 -0
- package/dist/src/model-routing/advisor.d.ts.map +1 -0
- package/dist/src/model-routing/advisor.js +20 -0
- package/dist/src/model-routing/advisor.js.map +1 -0
- package/dist/src/model-routing/classifier.d.ts +57 -0
- package/dist/src/model-routing/classifier.d.ts.map +1 -0
- package/dist/src/model-routing/classifier.js +63 -0
- package/dist/src/model-routing/classifier.js.map +1 -0
- package/dist/src/model-routing/loader.d.ts +48 -0
- package/dist/src/model-routing/loader.d.ts.map +1 -0
- package/dist/src/model-routing/loader.js +79 -0
- package/dist/src/model-routing/loader.js.map +1 -0
- package/dist/src/model-routing/prompts.d.ts +22 -0
- package/dist/src/model-routing/prompts.d.ts.map +1 -0
- package/dist/src/model-routing/prompts.js +87 -0
- package/dist/src/model-routing/prompts.js.map +1 -0
- package/dist/src/model-routing/resolve.d.ts +40 -0
- package/dist/src/model-routing/resolve.d.ts.map +1 -0
- package/dist/src/model-routing/resolve.js +76 -0
- package/dist/src/model-routing/resolve.js.map +1 -0
- package/dist/src/model-routing/router.d.ts +149 -0
- package/dist/src/model-routing/router.d.ts.map +1 -0
- package/dist/src/model-routing/router.js +235 -0
- package/dist/src/model-routing/router.js.map +1 -0
- package/dist/src/model-routing/step-triggers.d.ts +27 -0
- package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
- package/dist/src/model-routing/step-triggers.js +20 -0
- package/dist/src/model-routing/step-triggers.js.map +1 -0
- package/dist/src/model-routing/table.d.ts +126 -0
- package/dist/src/model-routing/table.d.ts.map +1 -0
- package/dist/src/model-routing/table.js +351 -0
- package/dist/src/model-routing/table.js.map +1 -0
- package/dist/src/session/session.d.ts +40 -23
- package/dist/src/session/session.d.ts.map +1 -1
- package/dist/src/session/session.js +173 -97
- package/dist/src/session/session.js.map +1 -1
- package/dist/src/tasks/quiescence.d.ts +13 -0
- package/dist/src/tasks/quiescence.d.ts.map +1 -0
- package/dist/src/tasks/quiescence.js +11 -0
- package/dist/src/tasks/quiescence.js.map +1 -0
- package/dist/src/tasks/task-manager.d.ts +101 -0
- package/dist/src/tasks/task-manager.d.ts.map +1 -0
- package/dist/src/tasks/task-manager.js +311 -0
- package/dist/src/tasks/task-manager.js.map +1 -0
- package/dist/src/tasks/types.d.ts +85 -0
- package/dist/src/tasks/types.d.ts.map +1 -0
- package/dist/src/tasks/types.js +2 -0
- package/dist/src/tasks/types.js.map +1 -0
- package/dist/src/tui/app.d.ts +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +12 -2
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/initial-prompt.d.ts.map +1 -1
- package/dist/src/tui/initial-prompt.js +0 -3
- package/dist/src/tui/initial-prompt.js.map +1 -1
- package/dist/src/tui/session-subscription.d.ts +3 -0
- package/dist/src/tui/session-subscription.d.ts.map +1 -1
- package/dist/src/tui/session-subscription.js +29 -5
- package/dist/src/tui/session-subscription.js.map +1 -1
- package/dist/src/tui/sidebar.d.ts +3 -0
- package/dist/src/tui/sidebar.d.ts.map +1 -1
- package/dist/src/tui/sidebar.js +19 -3
- package/dist/src/tui/sidebar.js.map +1 -1
- package/dist/src/tui/slash-commands.d.ts +12 -9
- package/dist/src/tui/slash-commands.d.ts.map +1 -1
- package/dist/src/tui/slash-commands.js +48 -10
- package/dist/src/tui/slash-commands.js.map +1 -1
- package/dist/src/tui/status-controller.d.ts +14 -9
- package/dist/src/tui/status-controller.d.ts.map +1 -1
- package/dist/src/tui/status-controller.js +26 -7
- package/dist/src/tui/status-controller.js.map +1 -1
- package/dist/src/tui/task-lane-renderer.d.ts +30 -0
- package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
- package/dist/src/tui/task-lane-renderer.js +93 -0
- package/dist/src/tui/task-lane-renderer.js.map +1 -0
- package/dist/src/tui/task-tree.d.ts +47 -0
- package/dist/src/tui/task-tree.d.ts.map +1 -0
- package/dist/src/tui/task-tree.js +190 -0
- package/dist/src/tui/task-tree.js.map +1 -0
- package/dist/src/tui/tool-formatters.js +3 -0
- package/dist/src/tui/tool-formatters.js.map +1 -1
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.js +1 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -1
- package/dist/src/turn-runner/duration.d.ts +2 -2
- package/dist/src/turn-runner/duration.js +3 -3
- package/dist/src/turn-runner/duration.js.map +1 -1
- package/dist/src/turn-runner/prompts.d.ts +5 -1
- package/dist/src/turn-runner/prompts.d.ts.map +1 -1
- package/dist/src/turn-runner/prompts.js +30 -6
- package/dist/src/turn-runner/prompts.js.map +1 -1
- package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
- package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
- package/dist/src/turn-runner/runtime-clock.js +38 -0
- package/dist/src/turn-runner/runtime-clock.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
- package/dist/src/turn-runner/shell-state-handle.js +5 -55
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
- package/dist/src/turn-runner/skill-context.d.ts +6 -7
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
- package/dist/src/turn-runner/skill-context.js +10 -10
- package/dist/src/turn-runner/skill-context.js.map +1 -1
- package/dist/src/turn-runner/skills.d.ts.map +1 -1
- package/dist/src/turn-runner/skills.js +2 -22
- package/dist/src/turn-runner/skills.js.map +1 -1
- package/dist/src/turn-runner/state-compaction.d.ts +7 -5
- package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
- package/dist/src/turn-runner/state-compaction.js +69 -10
- package/dist/src/turn-runner/state-compaction.js.map +1 -1
- package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
- package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-decisions.js +443 -0
- package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
- package/dist/src/turn-runner/state-machine-session.js +18 -55
- package/dist/src/turn-runner/state-machine-session.js.map +1 -1
- package/dist/src/turn-runner/subagent.d.ts +156 -0
- package/dist/src/turn-runner/subagent.d.ts.map +1 -0
- package/dist/src/turn-runner/subagent.js +164 -0
- package/dist/src/turn-runner/subagent.js.map +1 -0
- package/dist/src/turn-runner/task-tools.d.ts +76 -0
- package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
- package/dist/src/turn-runner/task-tools.js +370 -0
- package/dist/src/turn-runner/task-tools.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +65 -17
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +173 -59
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +198 -134
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +1302 -713
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
- package/dist/src/turn-runner/usage-accounting.js +19 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -1
- package/dist/src/types/config.d.ts +9 -1
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/config.js +2 -1
- package/dist/src/types/config.js.map +1 -1
- package/dist/src/types/protocol.d.ts +110 -30
- package/dist/src/types/protocol.d.ts.map +1 -1
- package/dist/src/types/state-machine.d.ts +10 -12
- package/dist/src/types/state-machine.d.ts.map +1 -1
- package/dist/src/types/state-machine.js.map +1 -1
- package/package.json +4 -4
- package/dist/src/cli/model-gateway.d.ts.map +0 -1
- package/dist/src/cli/model-gateway.js.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.js +0 -501
- package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
- /package/dist/src/{cli → model-resolution}/model-gateway.d.ts +0 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { THINKING_LEVELS, isThinkingLevel } from "../session/thinking-level.js";
|
|
3
|
+
import { walkVirtualRoute } from "./resolve.js";
|
|
4
|
+
const ThinkingLevelSchema = Type.Union(THINKING_LEVELS.map((level) => Type.Literal(level)), { description: "Reasoning effort applied when the target model runs." });
|
|
5
|
+
const RouteTargetSchema = Type.Object({
|
|
6
|
+
modelName: Type.String({
|
|
7
|
+
minLength: 1,
|
|
8
|
+
description: "Concrete catalog name or virtual tier name. Virtual names re-enter routing with the same route.",
|
|
9
|
+
}),
|
|
10
|
+
thinkingLevel: ThinkingLevelSchema,
|
|
11
|
+
}, { additionalProperties: false });
|
|
12
|
+
const RouteRuleSchema = Type.Object({
|
|
13
|
+
description: Type.String({
|
|
14
|
+
minLength: 1,
|
|
15
|
+
description: "Classifier-facing guidance describing when this route should be selected.",
|
|
16
|
+
}),
|
|
17
|
+
target: RouteTargetSchema,
|
|
18
|
+
visionFallbackModelName: Type.Optional(Type.String({
|
|
19
|
+
minLength: 1,
|
|
20
|
+
description: "Concrete catalog name or virtual tier used only when this route resolves to a text-only target with image input. The route's configured effort is preserved.",
|
|
21
|
+
})),
|
|
22
|
+
}, { additionalProperties: false });
|
|
23
|
+
const AdvisorPolicySchema = Type.Object({
|
|
24
|
+
enabled: Type.Boolean({
|
|
25
|
+
description: "Whether the advisor tool is available while this tier is selected.",
|
|
26
|
+
}),
|
|
27
|
+
target: RouteTargetSchema,
|
|
28
|
+
minStepsBetween: Type.Integer({
|
|
29
|
+
description: "Minimum assistant-completion steps between ordinary advisor calls.",
|
|
30
|
+
}),
|
|
31
|
+
transcriptTokens: Type.Integer({
|
|
32
|
+
description: "Maximum token budget used to assemble the advisor transcript.",
|
|
33
|
+
}),
|
|
34
|
+
}, { additionalProperties: false });
|
|
35
|
+
const TierDefinitionSchema = Type.Object({
|
|
36
|
+
routes: Type.Record(Type.String({ minLength: 1 }), RouteRuleSchema, {
|
|
37
|
+
description: "Classifier routes for this tier. Missing routes deliberately fall through to general.",
|
|
38
|
+
}),
|
|
39
|
+
advisor: AdvisorPolicySchema,
|
|
40
|
+
}, { additionalProperties: false });
|
|
41
|
+
const ClassifierConfigSchema = Type.Object({
|
|
42
|
+
target: RouteTargetSchema,
|
|
43
|
+
everySteps: Type.Integer({
|
|
44
|
+
description: "Assistant-completion cadence for intra-turn route classification.",
|
|
45
|
+
}),
|
|
46
|
+
guidance: Type.String({
|
|
47
|
+
description: "Freeform administrator guidance appended to the classifier prompt.",
|
|
48
|
+
}),
|
|
49
|
+
stepTriggers: Type.Optional(Type.Array(Type.Object({
|
|
50
|
+
name: Type.String({
|
|
51
|
+
minLength: 1,
|
|
52
|
+
description: "Unique administrator-facing name for this step-output trigger.",
|
|
53
|
+
}),
|
|
54
|
+
keywords: Type.Array(Type.String({ minLength: 1 }), {
|
|
55
|
+
minItems: 1,
|
|
56
|
+
description: "Non-empty strings matched case-insensitively against bounded step-output text.",
|
|
57
|
+
}),
|
|
58
|
+
}, { additionalProperties: false }), {
|
|
59
|
+
description: "Optional taste triggers that request classification after matching output.",
|
|
60
|
+
})),
|
|
61
|
+
}, { additionalProperties: false });
|
|
62
|
+
/** Complete, replaceable configuration for virtual model routing. */
|
|
63
|
+
export const RoutingTableSchema = Type.Object({
|
|
64
|
+
defaultTier: Type.String({
|
|
65
|
+
minLength: 1,
|
|
66
|
+
description: "Virtual tier selected when the caller does not provide one.",
|
|
67
|
+
}),
|
|
68
|
+
tiers: Type.Record(Type.String({ minLength: 1 }), TierDefinitionSchema, {
|
|
69
|
+
description: "Virtual model names and their routing policies.",
|
|
70
|
+
}),
|
|
71
|
+
classifier: ClassifierConfigSchema,
|
|
72
|
+
}, { additionalProperties: false });
|
|
73
|
+
const VISUAL_DESCRIPTION = "Frontend, 3D, or anything visual: UI implementation and debugging, styling, graphics, image inspection, and work where visual fidelity matters.";
|
|
74
|
+
const FRONTIER_PLAN_DESCRIPTION = "Architecture, investigation, research, and high-stakes planning where the primary work is reasoning about what to build or do, not implementing it.";
|
|
75
|
+
const IMPLEMENT_DESCRIPTION = "Backend, systems, data, CLI, and other implementation or debugging work, including tests and code changes.";
|
|
76
|
+
const WRITING_DESCRIPTION = "Creative writing and prose where voice, narrative, or wording is the primary output rather than analysis or software work.";
|
|
77
|
+
const GENERAL_DESCRIPTION = "General questions, explanations, summaries, and requests that do not fit a more specific route.";
|
|
78
|
+
/** Built-in routing policy fixed by the model-router planning record. */
|
|
79
|
+
export const BUILT_IN_ROUTING_TABLE = {
|
|
80
|
+
defaultTier: "frontier",
|
|
81
|
+
tiers: {
|
|
82
|
+
frontier: {
|
|
83
|
+
routes: {
|
|
84
|
+
visual: {
|
|
85
|
+
description: VISUAL_DESCRIPTION,
|
|
86
|
+
target: { modelName: "kimi-k3", thinkingLevel: "high" },
|
|
87
|
+
},
|
|
88
|
+
plan: {
|
|
89
|
+
description: FRONTIER_PLAN_DESCRIPTION,
|
|
90
|
+
target: { modelName: "fable-5", thinkingLevel: "high" },
|
|
91
|
+
},
|
|
92
|
+
implement: {
|
|
93
|
+
description: IMPLEMENT_DESCRIPTION,
|
|
94
|
+
target: { modelName: "gpt-5.6-sol", thinkingLevel: "high" },
|
|
95
|
+
},
|
|
96
|
+
writing: {
|
|
97
|
+
description: WRITING_DESCRIPTION,
|
|
98
|
+
target: { modelName: "opus-4.8", thinkingLevel: "medium" },
|
|
99
|
+
},
|
|
100
|
+
general: {
|
|
101
|
+
description: GENERAL_DESCRIPTION,
|
|
102
|
+
target: { modelName: "gpt-5.6-sol", thinkingLevel: "medium" },
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
advisor: {
|
|
106
|
+
enabled: true,
|
|
107
|
+
target: { modelName: "fable-5", thinkingLevel: "high" },
|
|
108
|
+
minStepsBetween: 5,
|
|
109
|
+
transcriptTokens: 10_000,
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
balanced: {
|
|
113
|
+
routes: {
|
|
114
|
+
visual: {
|
|
115
|
+
description: VISUAL_DESCRIPTION,
|
|
116
|
+
target: { modelName: "kimi-k3", thinkingLevel: "high" },
|
|
117
|
+
},
|
|
118
|
+
plan: {
|
|
119
|
+
description: FRONTIER_PLAN_DESCRIPTION,
|
|
120
|
+
target: { modelName: "gpt-5.6-sol", thinkingLevel: "high" },
|
|
121
|
+
},
|
|
122
|
+
implement: {
|
|
123
|
+
description: IMPLEMENT_DESCRIPTION,
|
|
124
|
+
target: { modelName: "gpt-5.6-terra", thinkingLevel: "high" },
|
|
125
|
+
},
|
|
126
|
+
writing: {
|
|
127
|
+
description: WRITING_DESCRIPTION,
|
|
128
|
+
target: { modelName: "sonnet-5", thinkingLevel: "medium" },
|
|
129
|
+
},
|
|
130
|
+
general: {
|
|
131
|
+
description: GENERAL_DESCRIPTION,
|
|
132
|
+
target: { modelName: "gpt-5.6-terra", thinkingLevel: "medium" },
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
advisor: {
|
|
136
|
+
enabled: true,
|
|
137
|
+
target: { modelName: "fable-5", thinkingLevel: "high" },
|
|
138
|
+
minStepsBetween: 5,
|
|
139
|
+
transcriptTokens: 10_000,
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
economy: {
|
|
143
|
+
routes: {
|
|
144
|
+
plan: {
|
|
145
|
+
description: "Architecture, investigation, research, and planning where the primary work is reasoning about what to build or do, not implementing it.",
|
|
146
|
+
target: { modelName: "gpt-5.6-luna", thinkingLevel: "medium" },
|
|
147
|
+
},
|
|
148
|
+
implement: {
|
|
149
|
+
description: "Backend, systems, data, CLI, and other implementation or debugging work, including tests and code changes.",
|
|
150
|
+
target: { modelName: "glm-5.2", thinkingLevel: "medium" },
|
|
151
|
+
// Recorded product rationale: image-bearing implementation stays on the work-kind route;
|
|
152
|
+
// capability correction belongs to router policy, not classifier taxonomy.
|
|
153
|
+
visionFallbackModelName: "gpt-5.6-luna",
|
|
154
|
+
},
|
|
155
|
+
general: {
|
|
156
|
+
description: "General questions, explanations, summaries, and creative writing without a more specific route.",
|
|
157
|
+
target: { modelName: "gpt-5.6-luna", thinkingLevel: "low" },
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
advisor: {
|
|
161
|
+
enabled: false,
|
|
162
|
+
target: { modelName: "gpt-5.6-terra", thinkingLevel: "medium" },
|
|
163
|
+
minStepsBetween: 5,
|
|
164
|
+
transcriptTokens: 10_000,
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
classifier: {
|
|
169
|
+
target: { modelName: "gpt-5.6-luna", thinkingLevel: "low" },
|
|
170
|
+
everySteps: 5,
|
|
171
|
+
guidance: "Prefer continuity when the task has not materially changed, but switch routes when the work changes domains.",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
/** True when `name` is owned by this routing table rather than the concrete catalog. */
|
|
175
|
+
export function isVirtualModel(name, table) {
|
|
176
|
+
return Object.hasOwn(table.tiers, name);
|
|
177
|
+
}
|
|
178
|
+
/** Virtual model names in deterministic table insertion order. */
|
|
179
|
+
export function virtualModelNames(table) {
|
|
180
|
+
return Object.keys(table.tiers);
|
|
181
|
+
}
|
|
182
|
+
function targetEntries(table) {
|
|
183
|
+
const entries = [];
|
|
184
|
+
for (const [tier, definition] of Object.entries(table.tiers)) {
|
|
185
|
+
for (const [route, rule] of Object.entries(definition.routes)) {
|
|
186
|
+
entries.push({
|
|
187
|
+
path: `tiers.${tier}.routes.${route}.target`,
|
|
188
|
+
target: rule.target,
|
|
189
|
+
virtualAllowed: true,
|
|
190
|
+
route,
|
|
191
|
+
tier,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
entries.push({
|
|
195
|
+
path: `tiers.${tier}.advisor.target`,
|
|
196
|
+
target: definition.advisor.target,
|
|
197
|
+
virtualAllowed: false,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
entries.push({
|
|
201
|
+
path: "classifier.target",
|
|
202
|
+
target: table.classifier.target,
|
|
203
|
+
virtualAllowed: false,
|
|
204
|
+
});
|
|
205
|
+
return entries;
|
|
206
|
+
}
|
|
207
|
+
/** Validate cross-field routing invariants against an injected concrete-model catalog. */
|
|
208
|
+
export function validateRoutingTable(table, catalogAdapter) {
|
|
209
|
+
const issues = [];
|
|
210
|
+
for (const tier of virtualModelNames(table)) {
|
|
211
|
+
if (catalogAdapter.isCatalogName(tier)) {
|
|
212
|
+
issues.push({
|
|
213
|
+
code: "catalog_collision",
|
|
214
|
+
path: `tiers.${tier}`,
|
|
215
|
+
message: `Virtual model "${tier}" collides with a concrete catalog shorthand or alias.`,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (!isVirtualModel(table.defaultTier, table)) {
|
|
220
|
+
issues.push({
|
|
221
|
+
code: "dangling_reference",
|
|
222
|
+
path: "defaultTier",
|
|
223
|
+
message: `Default tier "${table.defaultTier}" does not name a virtual model.`,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
for (const [tier, definition] of Object.entries(table.tiers)) {
|
|
227
|
+
if (!definition.routes.general) {
|
|
228
|
+
issues.push({
|
|
229
|
+
code: "dangling_reference",
|
|
230
|
+
path: `tiers.${tier}.routes.general`,
|
|
231
|
+
message: `Tier "${tier}" must define the general fallback route.`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (definition.advisor.minStepsBetween <= 0) {
|
|
235
|
+
issues.push({
|
|
236
|
+
code: "invalid_cadence",
|
|
237
|
+
path: `tiers.${tier}.advisor.minStepsBetween`,
|
|
238
|
+
message: "Advisor cadence must be a positive number of steps.",
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
if (definition.advisor.transcriptTokens <= 0 || definition.advisor.transcriptTokens > 20_000) {
|
|
242
|
+
issues.push({
|
|
243
|
+
code: "invalid_transcript_budget",
|
|
244
|
+
path: `tiers.${tier}.advisor.transcriptTokens`,
|
|
245
|
+
message: "Advisor transcript budget must be between 1 and 20,000 tokens.",
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (table.classifier.everySteps <= 0) {
|
|
250
|
+
issues.push({
|
|
251
|
+
code: "invalid_cadence",
|
|
252
|
+
path: "classifier.everySteps",
|
|
253
|
+
message: "Classifier cadence must be a positive number of steps.",
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
const triggerNames = new Set();
|
|
257
|
+
for (const [index, trigger] of (table.classifier.stepTriggers ?? []).entries()) {
|
|
258
|
+
const path = `classifier.stepTriggers.${index}`;
|
|
259
|
+
if (!trigger.name.trim()) {
|
|
260
|
+
issues.push({
|
|
261
|
+
code: "invalid_step_trigger_name",
|
|
262
|
+
path: `${path}.name`,
|
|
263
|
+
message: "Step trigger name must be non-empty.",
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
else if (triggerNames.has(trigger.name)) {
|
|
267
|
+
issues.push({
|
|
268
|
+
code: "duplicate_step_trigger_name",
|
|
269
|
+
path: `${path}.name`,
|
|
270
|
+
message: `Step trigger name "${trigger.name}" must be unique.`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
triggerNames.add(trigger.name);
|
|
274
|
+
if (trigger.keywords.length === 0 || trigger.keywords.some((keyword) => !keyword.trim())) {
|
|
275
|
+
issues.push({
|
|
276
|
+
code: "invalid_step_trigger_keywords",
|
|
277
|
+
path: `${path}.keywords`,
|
|
278
|
+
message: "Step trigger keywords must be a non-empty array of non-empty strings.",
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
for (const entry of targetEntries(table)) {
|
|
283
|
+
if (!isThinkingLevel(entry.target.thinkingLevel)) {
|
|
284
|
+
issues.push({
|
|
285
|
+
code: "invalid_effort",
|
|
286
|
+
path: `${entry.path}.thinkingLevel`,
|
|
287
|
+
message: `Unknown thinking level "${String(entry.target.thinkingLevel)}".`,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
const targetIsVirtual = isVirtualModel(entry.target.modelName, table);
|
|
291
|
+
if ((!entry.virtualAllowed && targetIsVirtual) ||
|
|
292
|
+
(!targetIsVirtual && !catalogAdapter.isCatalogName(entry.target.modelName))) {
|
|
293
|
+
issues.push({
|
|
294
|
+
code: "dangling_reference",
|
|
295
|
+
path: `${entry.path}.modelName`,
|
|
296
|
+
message: !entry.virtualAllowed && targetIsVirtual
|
|
297
|
+
? `Target "${entry.target.modelName}" must name a concrete catalog model.`
|
|
298
|
+
: `Target "${entry.target.modelName}" is neither a virtual model nor a catalog name.`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
if (entry.tier && entry.route && targetIsVirtual) {
|
|
302
|
+
const result = walkVirtualRoute(table, entry.tier, entry.route);
|
|
303
|
+
if (result.cycle) {
|
|
304
|
+
issues.push({
|
|
305
|
+
code: "virtual_cycle",
|
|
306
|
+
path: entry.path,
|
|
307
|
+
message: `Virtual model cycle: ${result.cycle.join(" -> ")}.`,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
for (const [tier, definition] of Object.entries(table.tiers)) {
|
|
313
|
+
for (const [route, rule] of Object.entries(definition.routes)) {
|
|
314
|
+
const fallbackName = rule.visionFallbackModelName;
|
|
315
|
+
if (!fallbackName)
|
|
316
|
+
continue;
|
|
317
|
+
const path = `tiers.${tier}.routes.${route}.visionFallbackModelName`;
|
|
318
|
+
const fallbackIsVirtual = isVirtualModel(fallbackName, table);
|
|
319
|
+
if (!fallbackIsVirtual && !catalogAdapter.isCatalogName(fallbackName)) {
|
|
320
|
+
issues.push({
|
|
321
|
+
code: "invalid_vision_fallback_model",
|
|
322
|
+
path,
|
|
323
|
+
message: `Vision fallback "${fallbackName}" is neither a virtual model nor a catalog name.`,
|
|
324
|
+
});
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
const result = fallbackIsVirtual
|
|
328
|
+
? walkVirtualRoute(table, fallbackName, route)
|
|
329
|
+
: { target: { modelName: fallbackName } };
|
|
330
|
+
if ("cycle" in result && result.cycle) {
|
|
331
|
+
issues.push({
|
|
332
|
+
code: "invalid_vision_fallback_model",
|
|
333
|
+
path,
|
|
334
|
+
message: `Vision fallback cycle: ${result.cycle.join(" -> ")}.`,
|
|
335
|
+
});
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (!result.target || !catalogAdapter.modelAcceptsImages(result.target.modelName)) {
|
|
339
|
+
issues.push({
|
|
340
|
+
code: "invalid_vision_fallback_model",
|
|
341
|
+
path,
|
|
342
|
+
message: result.target
|
|
343
|
+
? `Vision fallback "${fallbackName}" resolves to text-only model "${result.target.modelName}".`
|
|
344
|
+
: `Vision fallback "${fallbackName}" does not resolve for route "${route}".`,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return issues;
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/model-routing/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { type TurnEventHandler } from "../turn-runner/turn-runner.js";
|
|
2
|
+
import type { RouterStatus } from "../model-routing/router.js";
|
|
2
3
|
import type { ThinkingLevel } from "@earendil-works/pi-ai";
|
|
3
4
|
import type { TurnRunnerConfig } from "../types/config.js";
|
|
4
5
|
import type { Skill } from "@earendil-works/pi-coding-agent";
|
|
5
6
|
import type { SkillCollision } from "../turn-runner/skills.js";
|
|
6
7
|
import type { TurnAgentFile, TurnCompactCommand, TurnEditFollowUpQueueCommand, TurnEvent, TurnInterruptCommand, TurnMode, TurnPromptBehavior, TurnFollowUpQueueEntry, TurnPromptImage, TurnQuestion, TurnStartCommand, TurnState, TurnTerminalEvent, TurnCommand, TurnOptions, TurnUsageFields } from "../types/protocol.js";
|
|
8
|
+
import { type RuntimeClock } from "../turn-runner/runtime-clock.js";
|
|
7
9
|
export interface SessionStartInput {
|
|
8
10
|
/** Routing mode for subsequent prompts. Omit to use the session's configured default. */
|
|
9
11
|
mode?: TurnMode;
|
|
@@ -49,6 +51,14 @@ export interface SessionTurnRunner {
|
|
|
49
51
|
compact(command: TurnCompactCommand): void | Promise<void>;
|
|
50
52
|
subscribe(handler: TurnEventHandler): () => void;
|
|
51
53
|
getState(): TurnState | undefined;
|
|
54
|
+
/** Retarget the persistent parent runner after session start. */
|
|
55
|
+
setModel?(model: string): {
|
|
56
|
+
routed: boolean;
|
|
57
|
+
};
|
|
58
|
+
/** Validate a selection against the project routing table loaded at start. */
|
|
59
|
+
isVirtualModelSelection?(model: string): boolean;
|
|
60
|
+
/** Return the router-owned display snapshot, when this runner has routing state. */
|
|
61
|
+
routeStatus?(): RouterStatus | undefined;
|
|
52
62
|
getSkills(): Promise<readonly Skill[]>;
|
|
53
63
|
reloadSkills(): Promise<readonly Skill[]>;
|
|
54
64
|
getResolvedAgentFiles(): Promise<readonly TurnAgentFile[]>;
|
|
@@ -61,6 +71,8 @@ export interface SessionOptions {
|
|
|
61
71
|
sessionPath: string;
|
|
62
72
|
runner?: SessionTurnRunner;
|
|
63
73
|
resumeFromStorage?: boolean;
|
|
74
|
+
/** Wall-clock and timer seam used for deterministic scheduled-task wake behavior. */
|
|
75
|
+
clock?: RuntimeClock;
|
|
64
76
|
}
|
|
65
77
|
export declare class Session {
|
|
66
78
|
readonly config: TurnRunnerConfig;
|
|
@@ -68,6 +80,12 @@ export declare class Session {
|
|
|
68
80
|
private readonly runner;
|
|
69
81
|
/** Directory owned by this session. State persistence writes `state.json` inside it. */
|
|
70
82
|
private readonly sessionPath;
|
|
83
|
+
/** Session-level clock used by persistence timestamps and scheduled wake projection. */
|
|
84
|
+
/** Pending trailing-edge write for task-output bursts. */
|
|
85
|
+
private cancelOutputPersist?;
|
|
86
|
+
private readonly clock;
|
|
87
|
+
/** Unique same-directory temp target; stale files never alias another Session writer. */
|
|
88
|
+
private readonly persistenceTempPath;
|
|
71
89
|
/** Subscribers interested in this single session's raw turn-runner events. */
|
|
72
90
|
private readonly eventHandlers;
|
|
73
91
|
/** Removes the session's subscription to its owned runner during disposal. */
|
|
@@ -79,17 +97,18 @@ export declare class Session {
|
|
|
79
97
|
/** Most recent terminal event, returned immediately when callers wait after a turn has settled. */
|
|
80
98
|
private lastTerminal?;
|
|
81
99
|
/**
|
|
82
|
-
* Polling interval that fires the wake when wall
|
|
83
|
-
* when user input or an interrupt arrives. We poll instead of using
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* the duration of the sleep. Polling against `Date.now()` is sleep-proof.
|
|
100
|
+
* Polling interval that fires the wake when the injected wall clock reaches `wakeAt`. Cleared
|
|
101
|
+
* when user input or an interrupt arrives. We poll instead of using one long timer so a laptop
|
|
102
|
+
* that sleeps through the deadline still fires shortly after wake: Node/Bun timers are driven
|
|
103
|
+
* by a monotonic clock that pauses on macOS sleep, while the wall-clock comparison does not.
|
|
87
104
|
*/
|
|
88
105
|
private wakeTimer?;
|
|
89
106
|
/** Optional fast-path timer used when the deadline is closer than the poll interval. */
|
|
90
107
|
private wakeFastPath?;
|
|
91
|
-
/**
|
|
92
|
-
private
|
|
108
|
+
/** Latest eagerly serialized envelope waiting behind the active filesystem commit. */
|
|
109
|
+
private queuedEnvelope?;
|
|
110
|
+
/** The single writer drain shared by every caller while persistence is active. */
|
|
111
|
+
private persistenceDrain?;
|
|
93
112
|
/** Whether this session should hydrate `state.json` on first use. New sessions start empty. */
|
|
94
113
|
private readonly resumeFromStorage;
|
|
95
114
|
/** Pending callers of `waitForTerminal`, resolved together when the next terminal event arrives. */
|
|
@@ -163,6 +182,8 @@ export declare class Session {
|
|
|
163
182
|
getLastTerminal(): TurnTerminalEvent | undefined;
|
|
164
183
|
/** Current runner-owned turn state snapshot, including agent message history. */
|
|
165
184
|
getState(): TurnState | undefined;
|
|
185
|
+
/** Current router-owned status for read-only UI inspection. */
|
|
186
|
+
routeStatus(): RouterStatus | undefined;
|
|
166
187
|
/** Latest `usage` payload for sidebar resume; not part of `TurnState`. */
|
|
167
188
|
getLastUsage(): TurnUsageFields | undefined;
|
|
168
189
|
/**
|
|
@@ -185,26 +206,23 @@ export declare class Session {
|
|
|
185
206
|
/** System-prompt files (AGENTS.md by default) that resolved on disk. */
|
|
186
207
|
getResolvedAgentFiles(): Promise<readonly TurnAgentFile[]>;
|
|
187
208
|
/**
|
|
188
|
-
* Swap the
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* the next prompt (`startOptions` reads `this.config.model` per turn);
|
|
193
|
-
* any in-flight turn keeps the model it started with.
|
|
209
|
+
* Swap the selection used for subsequent turns. Virtual names are validated
|
|
210
|
+
* against the runner's loaded project table; concrete names retain the CLI's
|
|
211
|
+
* existing resolution validation. A started runner is retargeted directly,
|
|
212
|
+
* while an in-flight turn keeps the selection it started with.
|
|
194
213
|
*/
|
|
195
214
|
setModel(model: string): {
|
|
196
215
|
modelName: string;
|
|
216
|
+
routed: boolean;
|
|
197
217
|
};
|
|
198
218
|
/**
|
|
199
|
-
* Swap the thinking level used for subsequent turns.
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
* passing a level a given model does not support is not an error here.
|
|
203
|
-
* The change applies on the next prompt; any in-flight turn keeps the
|
|
204
|
-
* level it started with.
|
|
219
|
+
* Swap the thinking level used for subsequent concrete turns. Routed
|
|
220
|
+
* selections report their tier instead because route effort owns the value;
|
|
221
|
+
* no config mutation occurs in that case.
|
|
205
222
|
*/
|
|
206
223
|
setThinkingLevel(level: string): {
|
|
207
|
-
thinkingLevel
|
|
224
|
+
thinkingLevel?: ThinkingLevel;
|
|
225
|
+
routedBy?: string;
|
|
208
226
|
};
|
|
209
227
|
/** Skill name collisions where one definition shadowed another during discovery. */
|
|
210
228
|
getSkillCollisions(): Promise<readonly SkillCollision[]>;
|
|
@@ -230,7 +248,6 @@ export declare class Session {
|
|
|
230
248
|
*/
|
|
231
249
|
private commitTerminalCost;
|
|
232
250
|
private applyPersistedTelemetryFields;
|
|
233
|
-
private normalizeTerminalEvent;
|
|
234
251
|
private emit;
|
|
235
252
|
private scheduleWake;
|
|
236
253
|
private cancelWake;
|
|
@@ -238,10 +255,10 @@ export declare class Session {
|
|
|
238
255
|
/** Writes `state.json` with current runner state plus session-owned envelope fields. */
|
|
239
256
|
private persistLatestState;
|
|
240
257
|
private startOptions;
|
|
241
|
-
private isWaitingOnScheduledState;
|
|
242
|
-
private currentScheduledState;
|
|
243
258
|
private readStoredEnvelope;
|
|
244
259
|
private writeStoredEnvelope;
|
|
260
|
+
private drainPersistence;
|
|
261
|
+
private commitSerializedEnvelope;
|
|
245
262
|
private sessionFilePath;
|
|
246
263
|
}
|
|
247
264
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/session/session.ts"],"names":[],"mappings":"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"}
|