@duetso/agent 0.2.2 → 0.2.4
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 +16 -13
- 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 +52 -9
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +195 -28
- 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 +205 -135
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +1311 -714
- 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 +124 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duet-gateway.js","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAE3E,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;AAChE,MAAM,mBAAmB,GAAG,SAAS,CAAC;AACtC,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AAC/D,MAAM,eAAe,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"duet-gateway.js","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-gateway.d.ts","sourceRoot":"","sources":["../../../src/model-resolution/model-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGnC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAM/C,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,GACV,WAAW,GACX,QAAQ,GACR,eAAe,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,CAkBzE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAazE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createGateway } from "ai";
|
|
2
|
-
import { getDuetGatewayBaseUrl } from "
|
|
2
|
+
import { getDuetGatewayBaseUrl } from "./duet-gateway.js";
|
|
3
3
|
/**
|
|
4
4
|
* The `duet model` subcommand talks to models directly through the Vercel AI
|
|
5
5
|
* SDK (`ai@^7`), pointed at the Duet gateway instead of the pi harness. The
|
|
@@ -22,11 +22,15 @@ export function createDuetModelGateway() {
|
|
|
22
22
|
// Preserve `fetch.preconnect` so the wrapper still satisfies the platform
|
|
23
23
|
// fetch signature; only the abort timeout is overridden.
|
|
24
24
|
const longTimeoutFetch = Object.assign((input, init) => fetch(input, { ...init, signal: AbortSignal.timeout(GENERATION_TIMEOUT_MS) }), { preconnect: fetch.preconnect });
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
// Credential precedence mirrors the harness: the Duet proxy when its key is
|
|
26
|
+
// present, else Vercel's AI Gateway (same /v4/ai protocol path) with the
|
|
27
|
+
// Vercel key. One owner for this fallback — callers never bridge env vars.
|
|
28
|
+
const duetKey = process.env[DUET_API_KEY_ENV]?.trim();
|
|
29
|
+
const vercelKey = process.env.AI_GATEWAY_API_KEY?.trim();
|
|
30
|
+
const upstream = duetKey || !vercelKey
|
|
31
|
+
? { baseURL: `${getDuetGatewayBaseUrl()}/v4/ai`, apiKey: process.env[DUET_API_KEY_ENV] }
|
|
32
|
+
: { baseURL: "https://ai-gateway.vercel.sh/v4/ai", apiKey: vercelKey };
|
|
33
|
+
return createGateway({ ...upstream, fetch: longTimeoutFetch });
|
|
30
34
|
}
|
|
31
35
|
/**
|
|
32
36
|
* Fetch the gateway model catalog and return a map of model id -> capability
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-gateway.js","sourceRoot":"","sources":["../../../src/model-resolution/model-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,6EAA6E;AAC7E,wEAAwE;AACxE,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAa7C;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB;IACpC,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,gBAAgB,GAAiB,MAAM,CAAC,MAAM,CAClD,CAAC,KAAkC,EAAE,IAAkC,EAAE,EAAE,CACzE,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAC/E,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CACjC,CAAC;IACF,4EAA4E;IAC5E,yEAAyE;IACzE,2EAA2E;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,SAAS;QACnB,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;QACxF,CAAC,CAAC,EAAE,OAAO,EAAE,oCAAoC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3E,OAAO,aAAa,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,qBAAqB,EAAE,YAAY,EAAE;QACnE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE;KAC5E,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsD,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Model } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type RoutingCatalogAdapter, type RoutingTable } from "../model-routing/table.js";
|
|
2
3
|
export { DEFAULT_CLI_MEMORY_MODEL, DEFAULT_CLI_MODEL } from "./catalog.js";
|
|
3
4
|
/**
|
|
4
5
|
* Resolves which provider:modelId the CLI talks to, plus the provenance for
|
|
@@ -9,14 +10,20 @@ export { DEFAULT_CLI_MEMORY_MODEL, DEFAULT_CLI_MODEL } from "./catalog.js";
|
|
|
9
10
|
export interface ModelResolution {
|
|
10
11
|
/** Model name retained for config, display, and later runtime resolution. */
|
|
11
12
|
modelName: string;
|
|
12
|
-
/** explicit: CLI flag; inferred: provider env var present; default:
|
|
13
|
+
/** explicit: CLI flag; inferred: provider env var present; default: active routing-table fallback. */
|
|
13
14
|
source: "explicit" | "inferred" | "default";
|
|
14
|
-
/** Provider env var that triggered inference, e.g. "
|
|
15
|
+
/** Provider env var that triggered inference, e.g. "AI_GATEWAY_API_KEY". */
|
|
15
16
|
envVar?: string;
|
|
16
17
|
/** True when the env var was loaded from a CLI env file rather than the shell. */
|
|
17
18
|
fromDotenv?: boolean;
|
|
19
|
+
/** True when the retained name is a virtual tier owned by model routing. */
|
|
20
|
+
routed?: boolean;
|
|
18
21
|
}
|
|
19
22
|
export declare function resolveModelName(model: string): Model<any>;
|
|
23
|
+
/** Shared concrete-catalog boundary used by every model-routing composition site. */
|
|
24
|
+
export declare const routingCatalogAdapter: RoutingCatalogAdapter;
|
|
25
|
+
/** Resolve a concrete catalog name to the provider-pinned reference used for model calls. */
|
|
26
|
+
export declare function pinnedModelReference(name: string): string;
|
|
20
27
|
/**
|
|
21
28
|
* Same selection logic as resolveCliModel, but picks each provider's cheaper
|
|
22
29
|
* observational-memory model.
|
|
@@ -24,8 +31,8 @@ export declare function resolveModelName(model: string): Model<any>;
|
|
|
24
31
|
export declare function resolveCliMemoryModel(memoryModelName: string | undefined, dotenvKeys: Set<string>): ModelResolution;
|
|
25
32
|
/**
|
|
26
33
|
* Resolve the user-visible model and report provenance so callers can show
|
|
27
|
-
* "inferred from
|
|
34
|
+
* "inferred from AI_GATEWAY_API_KEY in an env file" etc.
|
|
28
35
|
*/
|
|
29
|
-
export declare function resolveCliModel(modelName: string | undefined, dotenvKeys: Set<string
|
|
36
|
+
export declare function resolveCliModel(modelName: string | undefined, dotenvKeys: Set<string>, routingTable?: RoutingTable): ModelResolution;
|
|
30
37
|
export declare function describeModelResolution(resolution: ModelResolution): string;
|
|
31
38
|
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/model-resolution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/model-resolution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AAkBnC,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE3E;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,sGAAsG;IACtG,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC5C,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAmC1D;AAED,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,EAAE,qBAMnC,CAAC;AAEF,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGzD;AAiBD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,eAAe,CAOjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,YAAY,GAAE,YAAqC,GAClD,eAAe,CAQjB;AA8ED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,CAU3E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { findEnvKeys, getModel } from "@earendil-works/pi-ai";
|
|
2
|
+
import { BUILT_IN_ROUTING_TABLE, isVirtualModel, } from "../model-routing/table.js";
|
|
2
3
|
import { resolveDuetGatewayModel, resolveMissingModel } from "./duet-gateway.js";
|
|
3
|
-
import { canonicalizeModelName, canonicalizeProviderModelId, clampModelOutputTokens, DEFAULT_CLI_MEMORY_MODEL,
|
|
4
|
+
import { canonicalizeModelName, canonicalizeProviderModelId, clampModelOutputTokens, DEFAULT_CLI_MEMORY_MODEL, getModelCandidates, getProviderDefaultModel, getProviderMemoryModel, isKnownShorthand, isProviderPinnedModelName, PROVIDER_ORDER, resolveProviderShorthand, } from "./catalog.js";
|
|
4
5
|
export { DEFAULT_CLI_MEMORY_MODEL, DEFAULT_CLI_MODEL } from "./catalog.js";
|
|
5
6
|
export function resolveModelName(model) {
|
|
6
7
|
model = resolveModelReference(model);
|
|
@@ -10,6 +11,14 @@ export function resolveModelName(model) {
|
|
|
10
11
|
}
|
|
11
12
|
const rawProvider = model.slice(0, separator);
|
|
12
13
|
const rawModelId = model.slice(separator + 1);
|
|
14
|
+
// The CLI supports only the router providers (duet-gateway, vercel-ai-gateway,
|
|
15
|
+
// openrouter). Any other explicit pin — e.g. `anthropic:claude-opus-4-8` or
|
|
16
|
+
// `openai:gpt-5.5` — is an unknown provider here: `resolveProviderShorthand`
|
|
17
|
+
// returns undefined, the raw provider passes through, and `getModel` below
|
|
18
|
+
// forwards it to pi-ai unchanged. That's incidental passthrough, not a
|
|
19
|
+
// supported path: pi-ai resolves it if it ships that provider/id and the
|
|
20
|
+
// caller supplies the credential, otherwise it resolves to an undefined
|
|
21
|
+
// model. No catalog canonicalization applies to unknown providers.
|
|
13
22
|
const provider = resolveProviderShorthand(rawProvider) ?? rawProvider;
|
|
14
23
|
const modelId = isKnownProvider(provider)
|
|
15
24
|
? canonicalizeProviderModelId(provider, rawModelId)
|
|
@@ -26,6 +35,16 @@ export function resolveModelName(model) {
|
|
|
26
35
|
const resolved = getModel(provider, modelId) ?? resolveMissingModel(provider, modelId);
|
|
27
36
|
return clampModelOutputTokens(resolved);
|
|
28
37
|
}
|
|
38
|
+
/** Shared concrete-catalog boundary used by every model-routing composition site. */
|
|
39
|
+
export const routingCatalogAdapter = {
|
|
40
|
+
isCatalogName: isKnownShorthand,
|
|
41
|
+
modelAcceptsImages: (name) => resolveModelName(isProviderPinnedModelName(name) ? name : `duet-gateway:${name}`).input.includes("image"),
|
|
42
|
+
};
|
|
43
|
+
/** Resolve a concrete catalog name to the provider-pinned reference used for model calls. */
|
|
44
|
+
export function pinnedModelReference(name) {
|
|
45
|
+
const model = resolveModelName(name);
|
|
46
|
+
return `${model.provider}:${model.id}`;
|
|
47
|
+
}
|
|
29
48
|
function isKnownProvider(provider) {
|
|
30
49
|
return PROVIDER_ORDER.some((entry) => entry.provider === provider);
|
|
31
50
|
}
|
|
@@ -45,13 +64,19 @@ export function resolveCliMemoryModel(memoryModelName, dotenvKeys) {
|
|
|
45
64
|
}
|
|
46
65
|
/**
|
|
47
66
|
* Resolve the user-visible model and report provenance so callers can show
|
|
48
|
-
* "inferred from
|
|
67
|
+
* "inferred from AI_GATEWAY_API_KEY in an env file" etc.
|
|
49
68
|
*/
|
|
50
|
-
export function resolveCliModel(modelName, dotenvKeys) {
|
|
51
|
-
return resolveCliModelWith(modelName, getDefaultModelCandidates(), dotenvKeys,
|
|
69
|
+
export function resolveCliModel(modelName, dotenvKeys, routingTable = BUILT_IN_ROUTING_TABLE) {
|
|
70
|
+
return resolveCliModelWith(modelName, getDefaultModelCandidates(), dotenvKeys, routingTable.defaultTier, routingTable);
|
|
52
71
|
}
|
|
53
|
-
function resolveCliModelWith(modelName, providerInference, dotenvKeys, defaultModel) {
|
|
72
|
+
function resolveCliModelWith(modelName, providerInference, dotenvKeys, defaultModel, routingTable = BUILT_IN_ROUTING_TABLE) {
|
|
54
73
|
if (modelName) {
|
|
74
|
+
if (isVirtualModel(modelName, routingTable)) {
|
|
75
|
+
return { modelName, source: "explicit", routed: true };
|
|
76
|
+
}
|
|
77
|
+
if (isVirtualModel(modelName, BUILT_IN_ROUTING_TABLE)) {
|
|
78
|
+
throw new Error(`Unknown virtual model tier "${modelName}" in the active routing table.`);
|
|
79
|
+
}
|
|
55
80
|
return {
|
|
56
81
|
modelName: isProviderPinnedModelName(modelName)
|
|
57
82
|
? modelName
|
|
@@ -59,6 +84,9 @@ function resolveCliModelWith(modelName, providerInference, dotenvKeys, defaultMo
|
|
|
59
84
|
source: "explicit",
|
|
60
85
|
};
|
|
61
86
|
}
|
|
87
|
+
if (isVirtualModel(defaultModel, routingTable)) {
|
|
88
|
+
return { modelName: defaultModel, source: "default", routed: true };
|
|
89
|
+
}
|
|
62
90
|
const inferred = findInferredProviderEntry(providerInference);
|
|
63
91
|
if (inferred) {
|
|
64
92
|
return {
|
|
@@ -105,12 +133,15 @@ function resolveModelReference(modelName) {
|
|
|
105
133
|
throw new Error(`Unknown model shorthand: ${modelName}`);
|
|
106
134
|
}
|
|
107
135
|
export function describeModelResolution(resolution) {
|
|
136
|
+
const routed = resolution.routed ? `${resolution.modelName} (routed) — ` : "";
|
|
108
137
|
if (resolution.source === "explicit")
|
|
109
|
-
return
|
|
138
|
+
return `${routed}explicit CLI flag`;
|
|
110
139
|
if (resolution.source === "inferred") {
|
|
111
140
|
const where = resolution.fromDotenv ? "an env file" : "shell environment";
|
|
112
|
-
return
|
|
141
|
+
return `${routed}inferred from ${resolution.envVar} in ${where}`;
|
|
113
142
|
}
|
|
114
|
-
return
|
|
143
|
+
return resolution.routed
|
|
144
|
+
? `${routed}routing-table default`
|
|
145
|
+
: "built-in default (no provider env vars set)";
|
|
115
146
|
}
|
|
116
147
|
//# sourceMappingURL=resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/model-resolution/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/model-resolution/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { serializeMessageForObserver } from "../memory/observational.js";
|
|
2
|
+
/**
|
|
3
|
+
* Text projection produced by {@link serializeMessageForObserver}. The future
|
|
4
|
+
* advisor tool can pass that projection directly after serializing the
|
|
5
|
+
* `AgentMessage` values in `agent.state.messages`.
|
|
6
|
+
*/
|
|
7
|
+
export type SerializedAdvisorMessage = ReturnType<typeof serializeMessageForObserver>;
|
|
8
|
+
/** Inputs needed to assemble advisor context without runtime or persistence dependencies. */
|
|
9
|
+
export interface BuildAdvisorTranscriptInput {
|
|
10
|
+
/** Serialized first user turn, pinned ahead of every lower-priority section. */
|
|
11
|
+
firstUserMessage: SerializedAdvisorMessage;
|
|
12
|
+
/** Fully resolved executor prompt; rendered as quoted transcript content, not instructions. */
|
|
13
|
+
executorSystemPrompt: string;
|
|
14
|
+
/** Chronological `Observation.content` values from `readSessionObservations`. */
|
|
15
|
+
observations: readonly string[];
|
|
16
|
+
/** Serialized recent messages in oldest-to-newest order. */
|
|
17
|
+
tailMessages: readonly SerializedAdvisorMessage[];
|
|
18
|
+
/** Maximum estimated tokens allowed in the returned text. */
|
|
19
|
+
budgetTokens: number;
|
|
20
|
+
}
|
|
21
|
+
/** A budgeted advisor payload and the memory system's estimate for that exact text. */
|
|
22
|
+
export interface AdvisorTranscript {
|
|
23
|
+
/** Curated transcript to send as advisor-call content. */
|
|
24
|
+
text: string;
|
|
25
|
+
/** Heuristic token estimate for `text`, using the memory system's estimator. */
|
|
26
|
+
tokens: number;
|
|
27
|
+
/** True when any source content was omitted or shortened to meet the budget. */
|
|
28
|
+
truncated: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Assemble the executor context in descending retention priority. Higher-priority
|
|
32
|
+
* prose consumes the budget first; recent messages are retained newest-first at
|
|
33
|
+
* whole-message boundaries.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildAdvisorTranscript(input: BuildAdvisorTranscriptInput): AdvisorTranscript;
|
|
36
|
+
//# sourceMappingURL=advisor-transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor-transcript.d.ts","sourceRoot":"","sources":["../../../src/model-routing/advisor-transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,2BAA2B,EAE5B,MAAM,4BAA4B,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEtF,6FAA6F;AAC7F,MAAM,WAAW,2BAA2B;IAC1C,gFAAgF;IAChF,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,+FAA+F;IAC/F,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iFAAiF;IACjF,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,4DAA4D;IAC5D,YAAY,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAClD,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,uFAAuF;AACvF,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,SAAS,EAAE,OAAO,CAAC;CACpB;AAOD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,2BAA2B,GAAG,iBAAiB,CA0C5F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { estimateTokens, trimMessagesToTranscriptBudget, } from "../memory/observational.js";
|
|
2
|
+
const FIRST_USER_HEADING = "## Pinned first user message";
|
|
3
|
+
const SYSTEM_PROMPT_HEADING = "## Executor system prompt (quoted content)";
|
|
4
|
+
const OBSERVATIONS_HEADING = "## Observations";
|
|
5
|
+
const TAIL_HEADING = "## Recent transcript";
|
|
6
|
+
/**
|
|
7
|
+
* Assemble the executor context in descending retention priority. Higher-priority
|
|
8
|
+
* prose consumes the budget first; recent messages are retained newest-first at
|
|
9
|
+
* whole-message boundaries.
|
|
10
|
+
*/
|
|
11
|
+
export function buildAdvisorTranscript(input) {
|
|
12
|
+
const budgetTokens = normalizeBudget(input.budgetTokens);
|
|
13
|
+
let text = "";
|
|
14
|
+
let truncated = false;
|
|
15
|
+
({ text, truncated } = appendPriorityContent(text, `${FIRST_USER_HEADING}\n\n${input.firstUserMessage.textPreview}`, budgetTokens, truncated));
|
|
16
|
+
const quotedSystemPrompt = quoteAsContent(input.executorSystemPrompt);
|
|
17
|
+
({ text, truncated } = appendPriorityContent(text, `${SYSTEM_PROMPT_HEADING}\n\nThe executor is operating under this system prompt:\n\n${quotedSystemPrompt}`, budgetTokens, truncated));
|
|
18
|
+
if (input.observations.length > 0) {
|
|
19
|
+
const observations = input.observations
|
|
20
|
+
.map((observation, index) => `[Observation ${index + 1}]\n${observation}`)
|
|
21
|
+
.join("\n\n");
|
|
22
|
+
({ text, truncated } = appendPriorityContent(text, `${OBSERVATIONS_HEADING}\n\n${observations}`, budgetTokens, truncated));
|
|
23
|
+
}
|
|
24
|
+
if (estimateTokens(text) < budgetTokens && !truncated) {
|
|
25
|
+
const tail = withoutPinnedDuplicate(input.tailMessages, input.firstUserMessage);
|
|
26
|
+
const tailResult = buildTailSection(text, tail, budgetTokens);
|
|
27
|
+
text = tailResult.text;
|
|
28
|
+
truncated = tailResult.truncated;
|
|
29
|
+
}
|
|
30
|
+
else if (input.tailMessages.length > 0) {
|
|
31
|
+
truncated = true;
|
|
32
|
+
}
|
|
33
|
+
return { text, tokens: estimateTokens(text), truncated };
|
|
34
|
+
}
|
|
35
|
+
function normalizeBudget(budgetTokens) {
|
|
36
|
+
if (!Number.isFinite(budgetTokens))
|
|
37
|
+
return 0;
|
|
38
|
+
return Math.max(0, Math.floor(budgetTokens));
|
|
39
|
+
}
|
|
40
|
+
function quoteAsContent(prompt) {
|
|
41
|
+
return prompt
|
|
42
|
+
.split("\n")
|
|
43
|
+
.map((line) => `> ${line}`)
|
|
44
|
+
.join("\n");
|
|
45
|
+
}
|
|
46
|
+
function appendPriorityContent(existing, content, budgetTokens, alreadyTruncated) {
|
|
47
|
+
if (alreadyTruncated)
|
|
48
|
+
return { text: existing, truncated: true };
|
|
49
|
+
const separator = existing.length > 0 ? "\n\n" : "";
|
|
50
|
+
const candidate = `${existing}${separator}${content}`;
|
|
51
|
+
if (estimateTokens(candidate) <= budgetTokens) {
|
|
52
|
+
return { text: candidate, truncated: false };
|
|
53
|
+
}
|
|
54
|
+
let low = 0;
|
|
55
|
+
let high = content.length;
|
|
56
|
+
while (low < high) {
|
|
57
|
+
const midpoint = Math.ceil((low + high) / 2);
|
|
58
|
+
if (estimateTokens(`${existing}${separator}${content.slice(0, midpoint)}`) <= budgetTokens) {
|
|
59
|
+
low = midpoint;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
high = midpoint - 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { text: `${existing}${separator}${content.slice(0, low)}`, truncated: true };
|
|
66
|
+
}
|
|
67
|
+
function withoutPinnedDuplicate(tailMessages, firstUserMessage) {
|
|
68
|
+
const duplicateIndex = tailMessages.findIndex((message) => message.textPreview === firstUserMessage.textPreview);
|
|
69
|
+
return tailMessages.filter((_message, index) => index !== duplicateIndex);
|
|
70
|
+
}
|
|
71
|
+
function buildTailSection(existing, tailMessages, budgetTokens) {
|
|
72
|
+
if (tailMessages.length === 0)
|
|
73
|
+
return { text: existing, truncated: false };
|
|
74
|
+
const remainingTokens = Math.max(0, budgetTokens - estimateTokens(existing));
|
|
75
|
+
const rawMessages = tailMessages.map((message, index) => ({
|
|
76
|
+
id: String(index),
|
|
77
|
+
createdAt: index,
|
|
78
|
+
role: "assistant",
|
|
79
|
+
content: [{ type: "text", text: message.textPreview }],
|
|
80
|
+
textPreview: message.textPreview,
|
|
81
|
+
estimatedTokens: estimateTokens(message.textPreview),
|
|
82
|
+
}));
|
|
83
|
+
const trimmed = trimMessagesToTranscriptBudget(rawMessages, remainingTokens);
|
|
84
|
+
let kept = trimmed.filter((message) => {
|
|
85
|
+
const source = rawMessages[Number(message.id)];
|
|
86
|
+
return source?.textPreview === message.textPreview;
|
|
87
|
+
});
|
|
88
|
+
while (true) {
|
|
89
|
+
const elidedCount = tailMessages.length - kept.length;
|
|
90
|
+
const elision = elidedCount > 0 ? `[earlier transcript elided: ${elidedCount} messages]\n\n` : "";
|
|
91
|
+
const body = kept.map((message) => message.textPreview).join("\n\n");
|
|
92
|
+
const section = `${TAIL_HEADING}\n\n${elision}${body}`.trimEnd();
|
|
93
|
+
const candidate = `${existing}\n\n${section}`;
|
|
94
|
+
if (estimateTokens(candidate) <= budgetTokens) {
|
|
95
|
+
return { text: candidate, truncated: elidedCount > 0 };
|
|
96
|
+
}
|
|
97
|
+
if (kept.length === 0) {
|
|
98
|
+
return appendPriorityContent(existing, section, budgetTokens, false);
|
|
99
|
+
}
|
|
100
|
+
kept = kept.slice(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=advisor-transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor-transcript.js","sourceRoot":"","sources":["../../../src/model-routing/advisor-transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-ai";
|
|
2
|
+
import { type LanguageModelUsage } from "ai";
|
|
3
|
+
/** Inputs for one advisor generation after catalog shorthand resolution. */
|
|
4
|
+
export interface CallAdvisorInput {
|
|
5
|
+
/** Curated executor transcript sent as advisor-call content. */
|
|
6
|
+
transcriptText: string;
|
|
7
|
+
/** Gateway-native `provider/model` id, already resolved by the composition site. */
|
|
8
|
+
modelName: string;
|
|
9
|
+
/** Portable reasoning effort forwarded through AI SDK 7's top-level option. */
|
|
10
|
+
thinkingLevel: ThinkingLevel;
|
|
11
|
+
/** Cancels the advisor request with the parent tool execution. */
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
}
|
|
14
|
+
/** Compact text returned to the executor after an advisor consultation. */
|
|
15
|
+
export interface AdvisorResult {
|
|
16
|
+
/** Compact strategic guidance returned to the executor tool. */
|
|
17
|
+
advice: string;
|
|
18
|
+
/** Provider-reported token usage for pricing and live turn attribution. */
|
|
19
|
+
usage: LanguageModelUsage;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run a plain text advisor call through the shared gateway constructor. No
|
|
23
|
+
* provider options are supplied, so this path opts into neither prompt
|
|
24
|
+
* caching nor any provider-specific request behavior.
|
|
25
|
+
*/
|
|
26
|
+
export declare function callAdvisor(input: CallAdvisorInput): Promise<AdvisorResult>;
|
|
27
|
+
//# sourceMappingURL=advisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor.d.ts","sourceRoot":"","sources":["../../../src/model-routing/advisor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,IAAI,CAAC;AAI3D,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,aAAa,EAAE,aAAa,CAAC;IAC7B,kEAAkE;IAClE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAWjF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { generateText } from "ai";
|
|
2
|
+
import { createDuetModelGateway } from "../model-resolution/model-gateway.js";
|
|
3
|
+
import { ADVISOR_SYSTEM_PROMPT } from "./prompts.js";
|
|
4
|
+
/**
|
|
5
|
+
* Run a plain text advisor call through the shared gateway constructor. No
|
|
6
|
+
* provider options are supplied, so this path opts into neither prompt
|
|
7
|
+
* caching nor any provider-specific request behavior.
|
|
8
|
+
*/
|
|
9
|
+
export async function callAdvisor(input) {
|
|
10
|
+
const gateway = createDuetModelGateway();
|
|
11
|
+
const result = await generateText({
|
|
12
|
+
model: gateway(input.modelName),
|
|
13
|
+
system: ADVISOR_SYSTEM_PROMPT,
|
|
14
|
+
prompt: input.transcriptText,
|
|
15
|
+
reasoning: input.thinkingLevel,
|
|
16
|
+
abortSignal: input.signal,
|
|
17
|
+
});
|
|
18
|
+
return { advice: result.text, usage: result.usage };
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor.js","sourceRoot":"","sources":["../../../src/model-routing/advisor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAA2B,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAsBrD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC/B,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,KAAK,CAAC,cAAc;QAC5B,SAAS,EAAE,KAAK,CAAC,aAAa;QAC9B,WAAW,EAAE,KAAK,CAAC,MAAM;KAC1B,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ThinkingLevel, Usage } from "@earendil-works/pi-ai";
|
|
2
|
+
import type { TierDefinition } from "./table.js";
|
|
3
|
+
/**
|
|
4
|
+
* The runtime milestone that requested a classification. Owned here — where
|
|
5
|
+
* the concept originates — and consumed by the router, the protocol event,
|
|
6
|
+
* and the CLI probe, so the union can never drift across layers.
|
|
7
|
+
*/
|
|
8
|
+
export type RouteTrigger = "turn_start" | "cadence" | "advisor" | "step_trigger" | "compaction";
|
|
9
|
+
/** Lean routing facts supplied at a turn boundary or intra-turn milestone. */
|
|
10
|
+
export interface ClassifierInput {
|
|
11
|
+
/** Virtual tier whose complete route set is being classified in one call. */
|
|
12
|
+
tierName: string;
|
|
13
|
+
/** Tier rules shown to the classifier; concrete targets remain hidden. */
|
|
14
|
+
tier: TierDefinition;
|
|
15
|
+
/** Administrator-authored routing and cache-preference policy. */
|
|
16
|
+
guidance: string;
|
|
17
|
+
/** Current concrete target and selecting route, when continuity is possible. */
|
|
18
|
+
currentTarget?: string;
|
|
19
|
+
/** Bounded summary of the preceding turn, used only to judge task continuity. */
|
|
20
|
+
prevTurnHint?: string;
|
|
21
|
+
/** Bounded description of what changed in the most recent agent step. */
|
|
22
|
+
lastStepDelta?: string;
|
|
23
|
+
/** Whether the pending input includes images; the router handles capability after classification. */
|
|
24
|
+
hasImages: boolean;
|
|
25
|
+
/** Event that requested classification, for interpreting sparse cadence/advisor context. */
|
|
26
|
+
trigger: RouteTrigger;
|
|
27
|
+
}
|
|
28
|
+
/** Pure system/user prompt pair consumed by the structured-output classifier call. */
|
|
29
|
+
export interface ClassifierMessages {
|
|
30
|
+
/** Stable classifier policy. */
|
|
31
|
+
systemPrompt: string;
|
|
32
|
+
/** Tier rules plus the lean, request-specific routing facts. */
|
|
33
|
+
prompt: string;
|
|
34
|
+
}
|
|
35
|
+
/** Options for the live structured-output route decision. */
|
|
36
|
+
export interface ClassifyRouteOptions {
|
|
37
|
+
/** Classifier model reference resolved by the caller's composition layer. */
|
|
38
|
+
model: string;
|
|
39
|
+
/** Reasoning effort configured for the classifier target in the routing table. */
|
|
40
|
+
thinkingLevel?: ThinkingLevel;
|
|
41
|
+
/** Cancels the provider request when its owning turn is interrupted. */
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
/** Receives classifier token and cost usage for attribution. */
|
|
44
|
+
onUsage?: (usage: Usage) => void;
|
|
45
|
+
}
|
|
46
|
+
/** A classifier choice that still names policy, not a concrete execution target. */
|
|
47
|
+
export interface ClassifierDecision {
|
|
48
|
+
/** Existing route name selected from the supplied tier. */
|
|
49
|
+
route: string;
|
|
50
|
+
/** One-sentence explanation returned by the classifier. */
|
|
51
|
+
rationale: string;
|
|
52
|
+
}
|
|
53
|
+
/** Build the complete lean classifier request without reading runtime state. */
|
|
54
|
+
export declare function buildClassifierMessages(input: ClassifierInput): ClassifierMessages;
|
|
55
|
+
/** Classify one tier in one model call and reject any route outside that tier. */
|
|
56
|
+
export declare function classifyRoute(input: ClassifierInput, options: ClassifyRouteOptions): Promise<ClassifierDecision>;
|
|
57
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/model-routing/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AASlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwBjD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,GAAG,YAAY,CAAC;AAEhG,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,EAAE,cAAc,CAAC;IACrB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qGAAqG;IACrG,SAAS,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,6DAA6D;AAC7D,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,oFAAoF;AACpF,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAUD,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,kBAAkB,CAkBlF;AAED,kFAAkF;AAClF,wBAAsB,aAAa,CACjC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAiB7B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import dedent from "dedent";
|
|
2
|
+
import { Type } from "typebox";
|
|
3
|
+
import * as structuredOutput from "../core/structured-output.js";
|
|
4
|
+
import { CLASSIFIER_SYSTEM_PROMPT, renderCacheContinuity, renderClassifierRules, } from "./prompts.js";
|
|
5
|
+
const CONTEXT_HINT_LIMIT = 1_000;
|
|
6
|
+
function classifierResultTool(routeNames) {
|
|
7
|
+
return {
|
|
8
|
+
name: "select_route",
|
|
9
|
+
description: "Select exactly one existing route for the agent's next work.",
|
|
10
|
+
parameters: Type.Object({
|
|
11
|
+
route: Type.Union(routeNames.map((name) => Type.Literal(name)), { description: "Exactly one route name from AVAILABLE ROUTES." }),
|
|
12
|
+
rationale: Type.String({
|
|
13
|
+
minLength: 1,
|
|
14
|
+
description: "One sentence explaining why this route matches the current work.",
|
|
15
|
+
}),
|
|
16
|
+
}, { additionalProperties: false }),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function boundedHint(value) {
|
|
20
|
+
if (!value?.trim())
|
|
21
|
+
return "Not provided.";
|
|
22
|
+
const normalized = value.trim();
|
|
23
|
+
return normalized.length <= CONTEXT_HINT_LIMIT
|
|
24
|
+
? normalized
|
|
25
|
+
: `${normalized.slice(0, CONTEXT_HINT_LIMIT)}…`;
|
|
26
|
+
}
|
|
27
|
+
/** Build the complete lean classifier request without reading runtime state. */
|
|
28
|
+
export function buildClassifierMessages(input) {
|
|
29
|
+
const continuity = renderCacheContinuity(input.currentTarget);
|
|
30
|
+
return {
|
|
31
|
+
systemPrompt: CLASSIFIER_SYSTEM_PROMPT,
|
|
32
|
+
prompt: dedent `
|
|
33
|
+
${renderClassifierRules(input.tierName, input.tier, input.guidance)}
|
|
34
|
+
|
|
35
|
+
CLASSIFICATION CONTEXT:
|
|
36
|
+
Trigger: ${input.trigger}
|
|
37
|
+
Images present: ${input.hasImages ? "yes" : "no"}
|
|
38
|
+
${continuity}
|
|
39
|
+
Previous-turn hint: ${boundedHint(input.prevTurnHint)}
|
|
40
|
+
Current request / last-step delta: ${boundedHint(input.lastStepDelta)}
|
|
41
|
+
|
|
42
|
+
Pick exactly one name from AVAILABLE ROUTES and give a one-sentence rationale.
|
|
43
|
+
`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** Classify one tier in one model call and reject any route outside that tier. */
|
|
47
|
+
export async function classifyRoute(input, options) {
|
|
48
|
+
const messages = buildClassifierMessages(input);
|
|
49
|
+
const result = await structuredOutput.generateStructuredOutput({
|
|
50
|
+
model: options.model,
|
|
51
|
+
tool: classifierResultTool(Object.keys(input.tier.routes)),
|
|
52
|
+
systemPrompt: messages.systemPrompt,
|
|
53
|
+
prompt: messages.prompt,
|
|
54
|
+
...(options.thinkingLevel ? { callOptions: { reasoningEffort: options.thinkingLevel } } : {}),
|
|
55
|
+
signal: options.signal,
|
|
56
|
+
onUsage: options.onUsage,
|
|
57
|
+
});
|
|
58
|
+
if (!Object.hasOwn(input.tier.routes, result.route)) {
|
|
59
|
+
throw new Error(`Classifier selected unknown route "${result.route}" for tier "${input.tierName}".`);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/model-routing/classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type RoutingCatalogAdapter, type RoutingTable } from "./table.js";
|
|
2
|
+
/** Options for loading the optional project-local routing table. */
|
|
3
|
+
export interface LoadRoutingTableOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Directory the discovery walk starts from. Candidates are
|
|
6
|
+
* `<ancestor>/.duet/models.json` for cwd and every parent up to the
|
|
7
|
+
* filesystem root (home excluded from the walk), then `~/.duet/models.json`
|
|
8
|
+
* as the global fallback — the same project-then-global scoping skills
|
|
9
|
+
* discovery uses. The nearest existing file wins outright as a complete
|
|
10
|
+
* replacement; an invalid winner fails loudly rather than falling through.
|
|
11
|
+
*/
|
|
12
|
+
cwd: string;
|
|
13
|
+
/** Concrete catalog used for collision, dangling-target, and vision validation. */
|
|
14
|
+
catalogAdapter: RoutingCatalogAdapter;
|
|
15
|
+
/** Home directory override for tests; defaults to the real home. */
|
|
16
|
+
homeDir?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Provenance attached to the active routing table. */
|
|
19
|
+
export type LoadedRoutingTable = {
|
|
20
|
+
table: RoutingTable;
|
|
21
|
+
source: "built-in";
|
|
22
|
+
} | {
|
|
23
|
+
table: RoutingTable;
|
|
24
|
+
source: "file";
|
|
25
|
+
path: string;
|
|
26
|
+
};
|
|
27
|
+
/** Options for writing the built-in table to a project for customization. */
|
|
28
|
+
export interface ExportRoutingTableOptions {
|
|
29
|
+
/** Project directory where `.duet/models.json` should be written. */
|
|
30
|
+
cwd: string;
|
|
31
|
+
/** Allows replacement of an existing file when explicitly set. */
|
|
32
|
+
force: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** Result of exporting the built-in routing table. */
|
|
35
|
+
export interface ExportedRoutingTable {
|
|
36
|
+
/** Absolute or cwd-relative path, matching the supplied cwd, of the written file. */
|
|
37
|
+
path: string;
|
|
38
|
+
/** The complete built-in replacement serialized to the file. */
|
|
39
|
+
table: RoutingTable;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Load the nearest `.duet/models.json` as a complete replacement, or use the
|
|
43
|
+
* built-in table when no override exists anywhere on the discovery path.
|
|
44
|
+
*/
|
|
45
|
+
export declare function loadRoutingTable(options: LoadRoutingTableOptions): Promise<LoadedRoutingTable>;
|
|
46
|
+
/** Export the complete built-in table as deterministic, two-space-indented JSON. */
|
|
47
|
+
export declare function exportRoutingTable(options: ExportRoutingTableOptions): Promise<ExportedRoutingTable>;
|
|
48
|
+
//# sourceMappingURL=loader.d.ts.map
|