negotium 0.1.7 → 0.1.9
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 +26 -2
- package/dist/canonical-mcp-bridge.js +14 -0
- package/dist/canonical-mcp-bridge.js.map +9 -0
- package/dist/chunk-10ct8814.js +429 -0
- package/dist/chunk-10ct8814.js.map +11 -0
- package/dist/chunk-18fzftjf.js +214 -0
- package/dist/chunk-18fzftjf.js.map +10 -0
- package/dist/chunk-1k7t7bnx.js +97 -0
- package/dist/chunk-1k7t7bnx.js.map +10 -0
- package/dist/chunk-1msje2zf.js +23 -0
- package/dist/chunk-1msje2zf.js.map +10 -0
- package/dist/chunk-2dgkah1z.js +706 -0
- package/dist/chunk-2dgkah1z.js.map +14 -0
- package/dist/chunk-3t4dtm26.js +61 -0
- package/dist/chunk-3t4dtm26.js.map +10 -0
- package/dist/chunk-3vn2vnj1.js +51 -0
- package/dist/chunk-3vn2vnj1.js.map +10 -0
- package/dist/chunk-6hknphtc.js +2054 -0
- package/dist/chunk-6hknphtc.js.map +29 -0
- package/dist/chunk-6tfzpcvk.js +2149 -0
- package/dist/chunk-6tfzpcvk.js.map +15 -0
- package/dist/chunk-8g0c4as0.js +23 -0
- package/dist/chunk-8g0c4as0.js.map +10 -0
- package/dist/chunk-9spx3h9n.js +279 -0
- package/dist/chunk-9spx3h9n.js.map +10 -0
- package/dist/chunk-c500xe9z.js +33 -0
- package/dist/chunk-c500xe9z.js.map +10 -0
- package/dist/chunk-e9b2xpff.js +147 -0
- package/dist/chunk-e9b2xpff.js.map +10 -0
- package/dist/chunk-edb07sjp.js +567 -0
- package/dist/chunk-edb07sjp.js.map +14 -0
- package/dist/chunk-eexqsee7.js +368 -0
- package/dist/chunk-eexqsee7.js.map +11 -0
- package/dist/chunk-efyxk97v.js +500 -0
- package/dist/chunk-efyxk97v.js.map +13 -0
- package/dist/chunk-epqxwkvh.js +3534 -0
- package/dist/chunk-epqxwkvh.js.map +20 -0
- package/dist/chunk-f1pzh3xh.js +115 -0
- package/dist/chunk-f1pzh3xh.js.map +10 -0
- package/dist/chunk-f5xgprg1.js +59 -0
- package/dist/chunk-f5xgprg1.js.map +10 -0
- package/dist/chunk-f97qybwk.js +584 -0
- package/dist/chunk-f97qybwk.js.map +11 -0
- package/dist/chunk-fvc7ncxd.js +252 -0
- package/dist/chunk-fvc7ncxd.js.map +10 -0
- package/dist/chunk-g7pvfj5e.js +574 -0
- package/dist/chunk-g7pvfj5e.js.map +14 -0
- package/dist/chunk-h8vmb9gf.js +315 -0
- package/dist/chunk-h8vmb9gf.js.map +10 -0
- package/dist/chunk-hgw7n8cm.js +43 -0
- package/dist/chunk-hgw7n8cm.js.map +10 -0
- package/dist/chunk-hsq7j9jk.js +126 -0
- package/dist/chunk-hsq7j9jk.js.map +10 -0
- package/dist/chunk-hwy3n31w.js +21 -0
- package/dist/chunk-hwy3n31w.js.map +9 -0
- package/dist/chunk-j0kjscb7.js +53 -0
- package/dist/chunk-j0kjscb7.js.map +10 -0
- package/dist/chunk-jzz91jwh.js +70 -0
- package/dist/chunk-jzz91jwh.js.map +10 -0
- package/dist/chunk-k9z47mab.js +247 -0
- package/dist/chunk-k9z47mab.js.map +12 -0
- package/dist/chunk-kbm35t7w.js +1331 -0
- package/dist/chunk-kbm35t7w.js.map +16 -0
- package/dist/chunk-m4veth0c.js +1649 -0
- package/dist/chunk-m4veth0c.js.map +17 -0
- package/dist/chunk-mhty3nna.js +150 -0
- package/dist/chunk-mhty3nna.js.map +11 -0
- package/dist/chunk-mmgh670x.js +248 -0
- package/dist/chunk-mmgh670x.js.map +11 -0
- package/dist/chunk-n0kk5xbq.js +2358 -0
- package/dist/chunk-n0kk5xbq.js.map +26 -0
- package/dist/chunk-nmv41qx9.js +2847 -0
- package/dist/chunk-nmv41qx9.js.map +23 -0
- package/dist/chunk-nqdp52aj.js +113 -0
- package/dist/chunk-nqdp52aj.js.map +12 -0
- package/dist/chunk-ns2m25dz.js +139 -0
- package/dist/chunk-ns2m25dz.js.map +10 -0
- package/dist/chunk-pkdmypdd.js +147 -0
- package/dist/chunk-pkdmypdd.js.map +11 -0
- package/dist/chunk-rmyfmrrr.js +1634 -0
- package/dist/chunk-rmyfmrrr.js.map +15 -0
- package/dist/chunk-sa874j5c.js +9 -0
- package/dist/chunk-sa874j5c.js.map +10 -0
- package/dist/chunk-sgsz2fpq.js +289 -0
- package/dist/chunk-sgsz2fpq.js.map +10 -0
- package/dist/chunk-sn51wnf1.js +3020 -0
- package/dist/chunk-sn51wnf1.js.map +32 -0
- package/dist/chunk-sqhr1a7e.js +587 -0
- package/dist/chunk-sqhr1a7e.js.map +11 -0
- package/dist/chunk-tmj5r2zv.js +2933 -0
- package/dist/chunk-tmj5r2zv.js.map +20 -0
- package/dist/chunk-vefj3880.js +56 -0
- package/dist/chunk-vefj3880.js.map +10 -0
- package/dist/chunk-vp2db42d.js +121 -0
- package/dist/chunk-vp2db42d.js.map +10 -0
- package/dist/chunk-wry79q55.js +108 -0
- package/dist/chunk-wry79q55.js.map +10 -0
- package/dist/chunk-x1arr7ze.js +63 -0
- package/dist/chunk-x1arr7ze.js.map +10 -0
- package/dist/chunk-z2xy5n2q.js +103 -0
- package/dist/chunk-z2xy5n2q.js.map +10 -0
- package/dist/hosted-agent.js +53 -0
- package/dist/hosted-agent.js.map +10 -0
- package/dist/main.js +132 -20
- package/dist/main.js.map +4 -4
- package/dist/runtime/scripts/faster-whisper-wrapper.py +87 -0
- package/dist/runtime/scripts/mcp-patchright-http.mjs +349 -0
- package/dist/runtime/src/agents/api-topic-agent-switch.ts +178 -0
- package/dist/runtime/src/agents/archiver.ts +396 -0
- package/dist/runtime/src/agents/auth-check.ts +64 -0
- package/dist/runtime/src/agents/claude-provider.ts +737 -0
- package/dist/runtime/src/agents/claude-registry.ts +115 -0
- package/dist/runtime/src/agents/codex-native-multi-agent.ts +177 -0
- package/dist/runtime/src/agents/codex-provider.ts +785 -0
- package/dist/runtime/src/agents/codex-registry.ts +115 -0
- package/dist/runtime/src/agents/codex-tree-kill.ts +365 -0
- package/dist/runtime/src/agents/contracts.ts +69 -0
- package/dist/runtime/src/agents/deep-map.ts +13 -0
- package/dist/runtime/src/agents/execution-host.ts +91 -0
- package/dist/runtime/src/agents/fixtures/claude-attachments.jsonl +2 -0
- package/dist/runtime/src/agents/fixtures/codex-shell.jsonl +5 -0
- package/dist/runtime/src/agents/fork.ts +65 -0
- package/dist/runtime/src/agents/hosted-agent.ts +49 -0
- package/dist/runtime/src/agents/idle-archiver.ts +128 -0
- package/dist/runtime/src/agents/index.ts +205 -0
- package/dist/runtime/src/agents/maestro-provider.ts +206 -0
- package/dist/runtime/src/agents/maestro-registry.ts +31 -0
- package/dist/runtime/src/agents/mcp-tools/ask-user.ts +280 -0
- package/dist/runtime/src/agents/mcp-tools/common.ts +21 -0
- package/dist/runtime/src/agents/mcp-tools/self-config.ts +220 -0
- package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +525 -0
- package/dist/runtime/src/agents/mcp-tools/visuals.ts +88 -0
- package/dist/runtime/src/agents/model-catalog.ts +151 -0
- package/dist/runtime/src/agents/registry.ts +24 -0
- package/dist/runtime/src/agents/rollout/claude.ts +331 -0
- package/dist/runtime/src/agents/rollout/codex.ts +569 -0
- package/dist/runtime/src/agents/rollout/shared.ts +205 -0
- package/dist/runtime/src/agents/self-config-core.ts +415 -0
- package/dist/runtime/src/agents/task-events.ts +44 -0
- package/dist/runtime/src/agents/tool-format.ts +352 -0
- package/dist/runtime/src/agents/topic-agent-switch.ts +193 -0
- package/dist/runtime/src/agents/topic-cleanup.ts +231 -0
- package/dist/runtime/src/agents/vault-tool-policy.ts +33 -0
- package/dist/runtime/src/application/execute-external-user-turn.ts +23 -0
- package/dist/runtime/src/application/submit-user-message.ts +50 -0
- package/dist/runtime/src/application/switch-topic-effort.ts +48 -0
- package/dist/runtime/src/application/switch-topic-model.ts +79 -0
- package/dist/runtime/src/application/topic-service.ts +139 -0
- package/dist/runtime/src/application/vault-command.ts +170 -0
- package/dist/runtime/src/bus.ts +319 -0
- package/dist/runtime/src/index.ts +333 -0
- package/dist/runtime/src/mcp/agent-health-server.ts +309 -0
- package/dist/runtime/src/mcp/background-bash-server.ts +346 -0
- package/dist/runtime/src/mcp/canonical-bridge-config.ts +84 -0
- package/dist/runtime/src/mcp/canonical-proxy-server.ts +171 -0
- package/dist/runtime/src/mcp/dm-ipc.ts +60 -0
- package/dist/runtime/src/mcp/mcp-helpers.ts +40 -0
- package/dist/runtime/src/mcp/paddleocr-server.ts +105 -0
- package/dist/runtime/src/mcp/peer-bridge.ts +114 -0
- package/dist/runtime/src/mcp/runtime-spec.ts +137 -0
- package/dist/runtime/src/mcp/session-comm/bridge-ipc-config.ts +27 -0
- package/dist/runtime/src/mcp/session-comm/peer-forward.ts +165 -0
- package/dist/runtime/src/mcp/session-comm/runtime.ts +115 -0
- package/dist/runtime/src/mcp/session-comm/server.ts +649 -0
- package/dist/runtime/src/mcp/session-comm/topic-config.ts +131 -0
- package/dist/runtime/src/mcp/session-comm/topics.ts +229 -0
- package/dist/runtime/src/mcp/stdio-protect.ts +84 -0
- package/dist/runtime/src/mcp/system-health-server.ts +130 -0
- package/dist/runtime/src/mcp/task-server.ts +173 -0
- package/dist/runtime/src/mcp/token-stats-server.ts +98 -0
- package/dist/runtime/src/mcp/vault-http.ts +219 -0
- package/dist/runtime/src/mcp/vault-run.ts +153 -0
- package/dist/runtime/src/mcp/vault-server.ts +104 -0
- package/dist/runtime/src/mcp/wiki-server.ts +755 -0
- package/dist/runtime/src/media/file-events.ts +33 -0
- package/dist/runtime/src/media/text-extractor.ts +312 -0
- package/dist/runtime/src/media/video.ts +92 -0
- package/dist/runtime/src/outbox/file-ops.ts +210 -0
- package/dist/runtime/src/outbox/index.ts +8 -0
- package/dist/runtime/src/outbox/utils.ts +51 -0
- package/dist/runtime/src/platform/background-bash/manager.ts +279 -0
- package/dist/runtime/src/platform/config.ts +371 -0
- package/dist/runtime/src/platform/constants.ts +18 -0
- package/dist/runtime/src/platform/debug-users.ts +14 -0
- package/dist/runtime/src/platform/delay.ts +1 -0
- package/dist/runtime/src/platform/error.ts +9 -0
- package/dist/runtime/src/platform/file-utils.ts +16 -0
- package/dist/runtime/src/platform/jsonl.ts +202 -0
- package/dist/runtime/src/platform/lifecycle.ts +174 -0
- package/dist/runtime/src/platform/logger.ts +31 -0
- package/dist/runtime/src/platform/maestro-bootstrap-env.ts +3 -0
- package/dist/runtime/src/platform/mcp-config.ts +878 -0
- package/dist/runtime/src/platform/modules.ts +145 -0
- package/dist/runtime/src/platform/node-plugins.ts +46 -0
- package/dist/runtime/src/platform/playwright/manager.ts +1233 -0
- package/dist/runtime/src/prompts/agents/wiki-archiver.md +261 -0
- package/dist/runtime/src/prompts/builders.ts +368 -0
- package/dist/runtime/src/prompts/sessions/channel-system.md +48 -0
- package/dist/runtime/src/prompts/sessions/manager-system.md +37 -0
- package/dist/runtime/src/prompts/sessions/topic-system.md +47 -0
- package/dist/runtime/src/prompts/sessions/visual-design.md +86 -0
- package/dist/runtime/src/query/active-rooms.ts +534 -0
- package/dist/runtime/src/query/control.ts +313 -0
- package/dist/runtime/src/query/index.ts +24 -0
- package/dist/runtime/src/query/session-inbox-cleanup.ts +44 -0
- package/dist/runtime/src/query/session-inbox-path.ts +42 -0
- package/dist/runtime/src/query/state.ts +94 -0
- package/dist/runtime/src/query/types.ts +83 -0
- package/dist/runtime/src/runtime/ask-callbacks.ts +153 -0
- package/dist/runtime/src/runtime/attachments.ts +151 -0
- package/dist/runtime/src/runtime/background-sessions.ts +83 -0
- package/dist/runtime/src/runtime/channel-context.ts +107 -0
- package/dist/runtime/src/runtime/errors.ts +69 -0
- package/dist/runtime/src/runtime/event-heartbeat.ts +77 -0
- package/dist/runtime/src/runtime/file-hooks.ts +81 -0
- package/dist/runtime/src/runtime/footer.ts +23 -0
- package/dist/runtime/src/runtime/inbox.ts +946 -0
- package/dist/runtime/src/runtime/tasks.ts +56 -0
- package/dist/runtime/src/runtime/topic-config.ts +29 -0
- package/dist/runtime/src/runtime/turn-runner.ts +2298 -0
- package/dist/runtime/src/runtime/usage-alert.ts +84 -0
- package/dist/runtime/src/runtime/visual-html.ts +109 -0
- package/dist/runtime/src/runtime/visual-store.ts +430 -0
- package/dist/runtime/src/runtime/visuals.ts +171 -0
- package/dist/runtime/src/security/sanitize.ts +27 -0
- package/dist/runtime/src/security/sensitive-path.ts +34 -0
- package/dist/runtime/src/storage/activity-log.ts +152 -0
- package/dist/runtime/src/storage/api-messages.ts +617 -0
- package/dist/runtime/src/storage/api-topic-brief.ts +127 -0
- package/dist/runtime/src/storage/api-topic-config.ts +192 -0
- package/dist/runtime/src/storage/api-topics.ts +844 -0
- package/dist/runtime/src/storage/app-settings.ts +44 -0
- package/dist/runtime/src/storage/browser-profiles.ts +133 -0
- package/dist/runtime/src/storage/conversations.ts +268 -0
- package/dist/runtime/src/storage/forum/agent-settings.ts +20 -0
- package/dist/runtime/src/storage/forum/index.ts +4 -0
- package/dist/runtime/src/storage/forum/repository.ts +283 -0
- package/dist/runtime/src/storage/forum/schema.ts +300 -0
- package/dist/runtime/src/storage/forum-db.ts +23 -0
- package/dist/runtime/src/storage/runtime-events.ts +130 -0
- package/dist/runtime/src/storage/runtime-leases.ts +189 -0
- package/dist/runtime/src/storage/runtime-process-leases.ts +216 -0
- package/dist/runtime/src/storage/runtime-topic-state.ts +148 -0
- package/dist/runtime/src/storage/runtime-turn-requests.ts +301 -0
- package/dist/runtime/src/storage/self-schedules.ts +298 -0
- package/dist/runtime/src/storage/session-asks.ts +347 -0
- package/dist/runtime/src/storage/sqlite.ts +129 -0
- package/dist/runtime/src/storage/tasks.ts +179 -0
- package/dist/runtime/src/storage/token-stats.ts +144 -0
- package/dist/runtime/src/storage/topic-archive-state.ts +59 -0
- package/dist/runtime/src/storage/topic-archive.ts +74 -0
- package/dist/runtime/src/storage/topic-settings.ts +67 -0
- package/dist/runtime/src/storage/topic-transcript.ts +98 -0
- package/dist/runtime/src/storage/vault-crypto.ts +65 -0
- package/dist/runtime/src/storage/vault.ts +225 -0
- package/dist/runtime/src/storage/wiki-summary-names.ts +33 -0
- package/dist/runtime/src/storage/wiki.ts +85 -0
- package/dist/runtime/src/topics/create.ts +123 -0
- package/dist/runtime/src/topics/derive.ts +398 -0
- package/dist/runtime/src/topics/lifecycle.ts +311 -0
- package/dist/runtime/src/topics/links.ts +7 -0
- package/dist/runtime/src/topics/personal-general.ts +65 -0
- package/dist/runtime/src/topics/session.ts +381 -0
- package/dist/runtime/src/types/api.ts +497 -0
- package/dist/runtime/src/types.ts +257 -0
- package/dist/runtime/src/version.ts +1 -0
- package/dist/runtime/tsconfig.json +13 -0
- package/package.json +28 -3
- package/dist/main.d.ts +0 -3
- package/dist/main.d.ts.map +0 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
resolveDefaultModel
|
|
4
|
+
} from "./chunk-k9z47mab.js";
|
|
5
|
+
import"./chunk-hwy3n31w.js";
|
|
6
|
+
|
|
7
|
+
// ../../packages/core/src/agents/model-catalog.ts
|
|
8
|
+
var MODEL_OWNER = {
|
|
9
|
+
sonnet: "claude",
|
|
10
|
+
opus: "claude",
|
|
11
|
+
haiku: "claude",
|
|
12
|
+
fable: "claude",
|
|
13
|
+
"gpt-5.6-luna": "codex",
|
|
14
|
+
"gpt-5.6-terra": "codex",
|
|
15
|
+
"gpt-5.6-sol": "codex",
|
|
16
|
+
"gpt-5.5": "codex",
|
|
17
|
+
deepseek: "maestro",
|
|
18
|
+
"deepseek-pro": "maestro",
|
|
19
|
+
"deepseek-flash": "maestro"
|
|
20
|
+
};
|
|
21
|
+
var SELECTABLE_MODELS = [
|
|
22
|
+
{
|
|
23
|
+
model: "gpt-5.6-sol",
|
|
24
|
+
agent: "codex",
|
|
25
|
+
description: "Latest frontier agentic coding model."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
model: "gpt-5.6-terra",
|
|
29
|
+
agent: "codex",
|
|
30
|
+
description: "Balanced agentic coding model for everyday work."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
model: "gpt-5.6-luna",
|
|
34
|
+
agent: "codex",
|
|
35
|
+
description: "Fast and affordable agentic coding model."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
model: "gpt-5.5",
|
|
39
|
+
agent: "codex",
|
|
40
|
+
description: "Frontier model for complex coding, research, and real-world work."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
model: "fable",
|
|
44
|
+
agent: "claude",
|
|
45
|
+
description: "Fable 5 \xB7 Most capable for your hardest and longest-running tasks \xB7 $10/$50 per Mtok"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
model: "opus",
|
|
49
|
+
agent: "claude",
|
|
50
|
+
description: "Opus 4.8 with 1M context \xB7 Best for everyday, complex tasks \xB7 $5/$25 per Mtok"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
model: "sonnet",
|
|
54
|
+
agent: "claude",
|
|
55
|
+
description: "Sonnet 5 \xB7 Efficient for routine tasks \xB7 $2/$10 per Mtok \xB7 promo through Aug 31"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
model: "deepseek-pro",
|
|
59
|
+
agent: "maestro",
|
|
60
|
+
description: "Sonnet-level performance at lower cost \xB7 Best for everyday tasks over coding"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
model: "deepseek-flash",
|
|
64
|
+
agent: "maestro",
|
|
65
|
+
description: "DeepSeek V4 Flash \xB7 Fast and low-cost for lightweight everyday tasks"
|
|
66
|
+
}
|
|
67
|
+
];
|
|
68
|
+
function selectableModel(value) {
|
|
69
|
+
const normalized = value.trim().toLowerCase();
|
|
70
|
+
return SELECTABLE_MODELS.find((candidate) => candidate.model === normalized);
|
|
71
|
+
}
|
|
72
|
+
function modelOwner(model) {
|
|
73
|
+
if (model.startsWith("claude-"))
|
|
74
|
+
return "claude";
|
|
75
|
+
if (model.startsWith("deepseek-"))
|
|
76
|
+
return "maestro";
|
|
77
|
+
if (model.startsWith("gpt-"))
|
|
78
|
+
return "codex";
|
|
79
|
+
return MODEL_OWNER[model];
|
|
80
|
+
}
|
|
81
|
+
function resolveModelForAgent(agent, requested, registry) {
|
|
82
|
+
const defaultModel = resolveDefaultModel(agent, registry.defaultModel);
|
|
83
|
+
if (!requested)
|
|
84
|
+
return defaultModel;
|
|
85
|
+
const owner = modelOwner(requested);
|
|
86
|
+
if (owner && owner !== agent)
|
|
87
|
+
return defaultModel;
|
|
88
|
+
return registry.validateModel(requested) ? requested : defaultModel;
|
|
89
|
+
}
|
|
90
|
+
var FALLBACK_ORDER = {
|
|
91
|
+
claude: [
|
|
92
|
+
{ agent: "maestro", model: "deepseek-pro" },
|
|
93
|
+
{ agent: "codex", model: "gpt-5.6-luna" }
|
|
94
|
+
],
|
|
95
|
+
codex: [
|
|
96
|
+
{ agent: "maestro", model: "deepseek-pro" },
|
|
97
|
+
{ agent: "claude", model: "sonnet" }
|
|
98
|
+
],
|
|
99
|
+
maestro: [
|
|
100
|
+
{ agent: "codex", model: "gpt-5.6-luna" },
|
|
101
|
+
{ agent: "claude", model: "sonnet" }
|
|
102
|
+
]
|
|
103
|
+
};
|
|
104
|
+
var AGENT_DISPLAY_NAME = {
|
|
105
|
+
claude: "Claude",
|
|
106
|
+
codex: "Codex",
|
|
107
|
+
maestro: "Maestro"
|
|
108
|
+
};
|
|
109
|
+
export {
|
|
110
|
+
selectableModel,
|
|
111
|
+
resolveModelForAgent,
|
|
112
|
+
modelOwner,
|
|
113
|
+
SELECTABLE_MODELS,
|
|
114
|
+
MODEL_OWNER,
|
|
115
|
+
FALLBACK_ORDER,
|
|
116
|
+
AGENT_DISPLAY_NAME
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export { MODEL_OWNER, SELECTABLE_MODELS, selectableModel, modelOwner, resolveModelForAgent, FALLBACK_ORDER, AGENT_DISPLAY_NAME };
|
|
120
|
+
|
|
121
|
+
//# debugId=2C2ECD89BDA1554A64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/core/src/agents/model-catalog.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { resolveDefaultModel } from \"#platform/config\";\nimport type { AgentKind } from \"#types\";\n\n/**\n * Models/prefixes that belong exclusively to one agent backend. When the\n * resolved agent differs from a model's owner, the model is cross-agent stale\n * and must be dropped in favor of the new agent's default — otherwise the value\n * is passed straight into a provider that can't run it and crashes the turn\n * (bug B: `/codex` leaves the topic's \"sonnet\" behind → Codex 400\n * \"The 'sonnet' model is not supported when using Codex\").\n *\n * Codex's own `validateModel` accepts ANY non-empty string (OpenAI ships new\n * IDs frequently), so it can't reject \"sonnet\" on its own — this ownership\n * owner check is the cross-agent guard the per-registry validator can't provide.\n * Unknown/new model IDs are intentionally absent here so they still pass\n * through to whichever agent is active.\n */\nexport const MODEL_OWNER: Record<string, AgentKind> = {\n // Current aliases plus retired aliases retained only for stale-model detection.\n sonnet: \"claude\",\n opus: \"claude\",\n haiku: \"claude\",\n fable: \"claude\",\n \"gpt-5.6-luna\": \"codex\",\n \"gpt-5.6-terra\": \"codex\",\n \"gpt-5.6-sol\": \"codex\",\n \"gpt-5.5\": \"codex\",\n deepseek: \"maestro\",\n \"deepseek-pro\": \"maestro\",\n \"deepseek-flash\": \"maestro\",\n};\n\nexport interface SelectableModel {\n /** Canonical token accepted by user-facing `/model` commands. */\n model: string;\n /** Runtime owner kept internal so channel UIs only need to show `model`. */\n agent: AgentKind;\n /** Short comparison copy shown alongside the model in picker UIs. */\n description: string;\n}\n\n/**\n * Canonical model picker shared by every channel. Keep this deliberately\n * finite even though the Codex backend accepts arbitrary future model ids:\n * user-facing completion should only promise models we intentionally support.\n */\nexport const SELECTABLE_MODELS: readonly SelectableModel[] = [\n {\n model: \"gpt-5.6-sol\",\n agent: \"codex\",\n description: \"Latest frontier agentic coding model.\",\n },\n {\n model: \"gpt-5.6-terra\",\n agent: \"codex\",\n description: \"Balanced agentic coding model for everyday work.\",\n },\n {\n model: \"gpt-5.6-luna\",\n agent: \"codex\",\n description: \"Fast and affordable agentic coding model.\",\n },\n {\n model: \"gpt-5.5\",\n agent: \"codex\",\n description: \"Frontier model for complex coding, research, and real-world work.\",\n },\n {\n model: \"fable\",\n agent: \"claude\",\n description:\n \"Fable 5 · Most capable for your hardest and longest-running tasks · $10/$50 per Mtok\",\n },\n {\n model: \"opus\",\n agent: \"claude\",\n description: \"Opus 4.8 with 1M context · Best for everyday, complex tasks · $5/$25 per Mtok\",\n },\n {\n model: \"sonnet\",\n agent: \"claude\",\n description: \"Sonnet 5 · Efficient for routine tasks · $2/$10 per Mtok · promo through Aug 31\",\n },\n {\n model: \"deepseek-pro\",\n agent: \"maestro\",\n description: \"Sonnet-level performance at lower cost · Best for everyday tasks over coding\",\n },\n {\n model: \"deepseek-flash\",\n agent: \"maestro\",\n description: \"DeepSeek V4 Flash · Fast and low-cost for lightweight everyday tasks\",\n },\n];\n\nexport function selectableModel(value: string): SelectableModel | undefined {\n const normalized = value.trim().toLowerCase();\n return SELECTABLE_MODELS.find((candidate) => candidate.model === normalized);\n}\n\nexport function modelOwner(model: string): AgentKind | undefined {\n if (model.startsWith(\"claude-\")) return \"claude\";\n if (model.startsWith(\"deepseek-\")) return \"maestro\";\n if (model.startsWith(\"gpt-\")) return \"codex\";\n return MODEL_OWNER[model];\n}\n\n/**\n * Resolve the model to run for `agent`, given the requested value from the\n * priority chain (per-message slash > topic-config override > topic default).\n * Drops a model owned by a different agent, then falls back to the agent's\n * registry default if the value is empty/invalid for this agent.\n */\nexport function resolveModelForAgent(\n agent: AgentKind,\n requested: string | undefined,\n registry: { validateModel(s: string): boolean; defaultModel: string },\n): string {\n const defaultModel = resolveDefaultModel(agent, registry.defaultModel);\n if (!requested) return defaultModel;\n const owner = modelOwner(requested);\n if (owner && owner !== agent) return defaultModel; // cross-agent stale\n return registry.validateModel(requested) ? requested : defaultModel;\n}\n\n/**\n * Circular fallback order per agent. Each entry lists candidates to try in\n * priority order when the current agent errors out. The actual switch is\n * guarded by `checkAgentAuth` — only candidates whose backend is reachable\n * (API key present / auth file exists) will be selected.\n */\nexport const FALLBACK_ORDER: Record<AgentKind, { agent: AgentKind; model: string }[]> = {\n claude: [\n { agent: \"maestro\", model: \"deepseek-pro\" },\n { agent: \"codex\", model: \"gpt-5.6-luna\" },\n ],\n codex: [\n { agent: \"maestro\", model: \"deepseek-pro\" },\n { agent: \"claude\", model: \"sonnet\" },\n ],\n maestro: [\n { agent: \"codex\", model: \"gpt-5.6-luna\" },\n { agent: \"claude\", model: \"sonnet\" },\n ],\n};\n\nexport const AGENT_DISPLAY_NAME: Record<AgentKind, string> = {\n claude: \"Claude\",\n codex: \"Codex\",\n maestro: \"Maestro\",\n};\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;AAiBO,IAAM,cAAyC;AAAA,EAEpD,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,kBAAkB;AACpB;AAgBO,IAAM,oBAAgD;AAAA,EAC3D;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aACE;AAAA,EACJ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAEO,SAAS,eAAe,CAAC,OAA4C;AAAA,EAC1E,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAAA,EAC5C,OAAO,kBAAkB,KAAK,CAAC,cAAc,UAAU,UAAU,UAAU;AAAA;AAGtE,SAAS,UAAU,CAAC,OAAsC;AAAA,EAC/D,IAAI,MAAM,WAAW,SAAS;AAAA,IAAG,OAAO;AAAA,EACxC,IAAI,MAAM,WAAW,WAAW;AAAA,IAAG,OAAO;AAAA,EAC1C,IAAI,MAAM,WAAW,MAAM;AAAA,IAAG,OAAO;AAAA,EACrC,OAAO,YAAY;AAAA;AASd,SAAS,oBAAoB,CAClC,OACA,WACA,UACQ;AAAA,EACR,MAAM,eAAe,oBAAoB,OAAO,SAAS,YAAY;AAAA,EACrE,KAAK;AAAA,IAAW,OAAO;AAAA,EACvB,MAAM,QAAQ,WAAW,SAAS;AAAA,EAClC,IAAI,SAAS,UAAU;AAAA,IAAO,OAAO;AAAA,EACrC,OAAO,SAAS,cAAc,SAAS,IAAI,YAAY;AAAA;AASlD,IAAM,iBAA2E;AAAA,EACtF,QAAQ;AAAA,IACN,EAAE,OAAO,WAAW,OAAO,eAAe;AAAA,IAC1C,EAAE,OAAO,SAAS,OAAO,eAAe;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA,IACL,EAAE,OAAO,WAAW,OAAO,eAAe;AAAA,IAC1C,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACrC;AAAA,EACA,SAAS;AAAA,IACP,EAAE,OAAO,SAAS,OAAO,eAAe;AAAA,IACxC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACrC;AACF;AAEO,IAAM,qBAAgD;AAAA,EAC3D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AACX;",
|
|
8
|
+
"debugId": "2C2ECD89BDA1554A64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// @bun
|
|
3
|
+
import {
|
|
4
|
+
__require,
|
|
5
|
+
__toESM
|
|
6
|
+
} from "./chunk-hwy3n31w.js";
|
|
7
|
+
|
|
8
|
+
// ../../adapters/terminal/src/cli.ts
|
|
9
|
+
function option(args, name) {
|
|
10
|
+
const prefix = `--${name}=`;
|
|
11
|
+
return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);
|
|
12
|
+
}
|
|
13
|
+
function hasFlag(args, name) {
|
|
14
|
+
return args.includes(`--${name}`);
|
|
15
|
+
}
|
|
16
|
+
function terminalOptionsFromArgs(args) {
|
|
17
|
+
const userId = option(args, "user")?.trim() || "local";
|
|
18
|
+
const preferredTopic = option(args, "topic")?.trim() || undefined;
|
|
19
|
+
const requestedAgent = option(args, "agent")?.trim() || process.env.TERMINAL_ADAPTER_AGENT?.trim();
|
|
20
|
+
const defaultAgent = requestedAgent === "claude" || requestedAgent === "codex" || requestedAgent === "maestro" ? requestedAgent : undefined;
|
|
21
|
+
const parsedPort = Number.parseInt(option(args, "port") ?? "0", 10);
|
|
22
|
+
const port = Number.isInteger(parsedPort) && parsedPort >= 0 ? parsedPort : 0;
|
|
23
|
+
const embedded = hasFlag(args, "embedded");
|
|
24
|
+
const connect = option(args, "connect")?.trim().replace(/\/+$/, "") || undefined;
|
|
25
|
+
return { userId, preferredTopic, defaultAgent, port, embedded, connect };
|
|
26
|
+
}
|
|
27
|
+
async function spawnNodeDaemon(port) {
|
|
28
|
+
const entry = process.argv[1];
|
|
29
|
+
if (!entry)
|
|
30
|
+
throw new Error("cannot locate the Negotium CLI entrypoint");
|
|
31
|
+
const { LOG_DIR } = await import("./chunk-sn51wnf1.js");
|
|
32
|
+
const child = Bun.spawn({
|
|
33
|
+
cmd: [process.execPath, entry, "__node-daemon", `--port=${port}`],
|
|
34
|
+
detached: true,
|
|
35
|
+
env: {
|
|
36
|
+
...process.env,
|
|
37
|
+
LOG_LEVEL: process.env.NEGOTIUM_NODE_LOG_LEVEL?.trim() || "info"
|
|
38
|
+
},
|
|
39
|
+
stdin: "ignore",
|
|
40
|
+
stdout: "ignore",
|
|
41
|
+
stderr: Bun.file(`${LOG_DIR}/node-daemon.log`)
|
|
42
|
+
});
|
|
43
|
+
child.unref();
|
|
44
|
+
}
|
|
45
|
+
async function runDaemonChild(args) {
|
|
46
|
+
const parsed = Number.parseInt(option(args, "port") ?? "0", 10);
|
|
47
|
+
const port = Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
|
|
48
|
+
const { runNodeDaemon } = await import("./chunk-rmyfmrrr.js");
|
|
49
|
+
await runNodeDaemon({ port });
|
|
50
|
+
}
|
|
51
|
+
async function ensureLocalNode(port) {
|
|
52
|
+
const { inspectNodeDaemon, waitForNodeDaemon } = await import("./chunk-rmyfmrrr.js");
|
|
53
|
+
const deadline = Date.now() + 15000;
|
|
54
|
+
let lastError = "node did not become ready";
|
|
55
|
+
while (Date.now() < deadline) {
|
|
56
|
+
const status = await inspectNodeDaemon();
|
|
57
|
+
if (status.running)
|
|
58
|
+
return waitForNodeDaemon(1000);
|
|
59
|
+
if (status.error)
|
|
60
|
+
lastError = status.error;
|
|
61
|
+
await spawnNodeDaemon(port);
|
|
62
|
+
try {
|
|
63
|
+
return await waitForNodeDaemon(1500);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw new Error(`Negotium node failed to start: ${lastError}`);
|
|
69
|
+
}
|
|
70
|
+
async function runTerminalCli(args = process.argv.slice(2)) {
|
|
71
|
+
if (args[0] === "__node-daemon") {
|
|
72
|
+
await runDaemonChild(args.slice(1));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
process.env.LOG_LEVEL ??= "silent";
|
|
76
|
+
const options = terminalOptionsFromArgs(args);
|
|
77
|
+
if (options.embedded && options.connect) {
|
|
78
|
+
throw new Error("--embedded and --connect cannot be used together");
|
|
79
|
+
}
|
|
80
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
81
|
+
throw new Error("terminal-adapter requires an interactive TTY");
|
|
82
|
+
}
|
|
83
|
+
const { startTerminalAdapter } = await import("./chunk-epqxwkvh.js");
|
|
84
|
+
let client;
|
|
85
|
+
if (!options.embedded) {
|
|
86
|
+
const { NODE_CONTROL_TOKEN } = await import("./chunk-sn51wnf1.js");
|
|
87
|
+
const { RemoteNegotiumClient } = await import("./chunk-sqhr1a7e.js");
|
|
88
|
+
const connection = options.connect ? {
|
|
89
|
+
baseUrl: options.connect,
|
|
90
|
+
token: process.env.NEGOTIUM_CONTROL_TOKEN?.trim() || NODE_CONTROL_TOKEN
|
|
91
|
+
} : await ensureLocalNode(options.port);
|
|
92
|
+
client = new RemoteNegotiumClient({ userId: options.userId, ...connection });
|
|
93
|
+
}
|
|
94
|
+
const adapter = startTerminalAdapter({ ...options, client });
|
|
95
|
+
try {
|
|
96
|
+
await adapter.completed;
|
|
97
|
+
} catch (error) {
|
|
98
|
+
await Promise.resolve(adapter.stop()).catch(() => {});
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (false) {}
|
|
103
|
+
export {
|
|
104
|
+
terminalOptionsFromArgs,
|
|
105
|
+
runTerminalCli
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
//# debugId=353978517FE6790B64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../adapters/terminal/src/cli.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"#!/usr/bin/env bun\n\nfunction option(args: string[], name: string): string | undefined {\n const prefix = `--${name}=`;\n return args.find((arg) => arg.startsWith(prefix))?.slice(prefix.length);\n}\n\nfunction hasFlag(args: string[], name: string): boolean {\n return args.includes(`--${name}`);\n}\n\nexport function terminalOptionsFromArgs(args: string[]): {\n userId: string;\n preferredTopic?: string;\n defaultAgent?: \"claude\" | \"codex\" | \"maestro\";\n port: number;\n embedded: boolean;\n connect?: string;\n} {\n const userId = option(args, \"user\")?.trim() || \"local\";\n const preferredTopic = option(args, \"topic\")?.trim() || undefined;\n const requestedAgent =\n option(args, \"agent\")?.trim() || process.env.TERMINAL_ADAPTER_AGENT?.trim();\n const defaultAgent =\n requestedAgent === \"claude\" || requestedAgent === \"codex\" || requestedAgent === \"maestro\"\n ? requestedAgent\n : undefined;\n const parsedPort = Number.parseInt(option(args, \"port\") ?? \"0\", 10);\n const port = Number.isInteger(parsedPort) && parsedPort >= 0 ? parsedPort : 0;\n const embedded = hasFlag(args, \"embedded\");\n const connect = option(args, \"connect\")?.trim().replace(/\\/+$/, \"\") || undefined;\n return { userId, preferredTopic, defaultAgent, port, embedded, connect };\n}\n\nasync function spawnNodeDaemon(port: number): Promise<void> {\n const entry = process.argv[1];\n if (!entry) throw new Error(\"cannot locate the Negotium CLI entrypoint\");\n const { LOG_DIR } = await import(\"@negotium/core\");\n const child = Bun.spawn({\n cmd: [process.execPath, entry, \"__node-daemon\", `--port=${port}`],\n detached: true,\n env: {\n ...process.env,\n LOG_LEVEL: process.env.NEGOTIUM_NODE_LOG_LEVEL?.trim() || \"info\",\n },\n stdin: \"ignore\",\n stdout: \"ignore\",\n stderr: Bun.file(`${LOG_DIR}/node-daemon.log`),\n });\n child.unref();\n}\n\nasync function runDaemonChild(args: string[]): Promise<void> {\n const parsed = Number.parseInt(option(args, \"port\") ?? \"0\", 10);\n const port = Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;\n const { runNodeDaemon } = await import(\"@negotium/node\");\n await runNodeDaemon({ port });\n}\n\nasync function ensureLocalNode(\n port: number,\n): Promise<import(\"@negotium/node\").NodeDaemonConnection> {\n const { inspectNodeDaemon, waitForNodeDaemon } = await import(\"@negotium/node\");\n const deadline = Date.now() + 15_000;\n let lastError = \"node did not become ready\";\n while (Date.now() < deadline) {\n const status = await inspectNodeDaemon();\n if (status.running) return waitForNodeDaemon(1_000);\n if (status.error) lastError = status.error;\n await spawnNodeDaemon(port);\n try {\n return await waitForNodeDaemon(1_500);\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n }\n throw new Error(`Negotium node failed to start: ${lastError}`);\n}\n\n/** Environment/argv wrapper shipped as the `negotium-terminal` executable. */\nexport async function runTerminalCli(args = process.argv.slice(2)): Promise<void> {\n if (args[0] === \"__node-daemon\") {\n await runDaemonChild(args.slice(1));\n return;\n }\n\n // Pino binds its destination when core is first imported. Silence host logs\n // before the dynamic adapter import so stderr cannot corrupt the alt screen.\n process.env.LOG_LEVEL ??= \"silent\";\n\n const options = terminalOptionsFromArgs(args);\n if (options.embedded && options.connect) {\n throw new Error(\"--embedded and --connect cannot be used together\");\n }\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"terminal-adapter requires an interactive TTY\");\n }\n\n const { startTerminalAdapter } = await import(\"@/index\");\n let client: import(\"@/client\").NegotiumClient | undefined;\n if (!options.embedded) {\n const { NODE_CONTROL_TOKEN } = await import(\"@negotium/core\");\n const { RemoteNegotiumClient } = await import(\"@/client\");\n const connection = options.connect\n ? {\n baseUrl: options.connect,\n token: process.env.NEGOTIUM_CONTROL_TOKEN?.trim() || NODE_CONTROL_TOKEN,\n }\n : await ensureLocalNode(options.port);\n client = new RemoteNegotiumClient({ userId: options.userId, ...connection });\n }\n const adapter = startTerminalAdapter({ ...options, client });\n try {\n await adapter.completed;\n } catch (error) {\n await Promise.resolve(adapter.stop()).catch(() => {});\n throw error;\n }\n}\n\nif (import.meta.main) {\n runTerminalCli().catch((error) => {\n process.stderr.write(\n `negotium-terminal: ${error instanceof Error ? error.message : String(error)}\\n`,\n );\n process.exitCode = 1;\n });\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "353978517FE6790B64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
codexAuthFilePath
|
|
4
|
+
} from "./chunk-k9z47mab.js";
|
|
5
|
+
import"./chunk-hwy3n31w.js";
|
|
6
|
+
|
|
7
|
+
// ../../packages/core/src/agents/auth-check.ts
|
|
8
|
+
import { execFileSync } from "child_process";
|
|
9
|
+
import { existsSync } from "fs";
|
|
10
|
+
import { homedir, platform } from "os";
|
|
11
|
+
import { join } from "path";
|
|
12
|
+
function checkAgentAuth(agent) {
|
|
13
|
+
switch (agent) {
|
|
14
|
+
case "codex": {
|
|
15
|
+
const path = codexAuthFilePath();
|
|
16
|
+
if (existsSync(path))
|
|
17
|
+
return { ok: true };
|
|
18
|
+
return {
|
|
19
|
+
ok: false,
|
|
20
|
+
error: `codex is not logged in (auth file missing at ${path}). Run \`codex login\` first`
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
case "claude": {
|
|
24
|
+
if (process.env.ANTHROPIC_API_KEY)
|
|
25
|
+
return { ok: true };
|
|
26
|
+
if (platform() === "darwin") {
|
|
27
|
+
try {
|
|
28
|
+
execFileSync("security", ["find-generic-password", "-s", "Claude Code-credentials"], {
|
|
29
|
+
stdio: "ignore"
|
|
30
|
+
});
|
|
31
|
+
return { ok: true };
|
|
32
|
+
} catch {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
error: "claude is not logged in (no macOS keychain entry 'Claude Code-credentials'). Run `claude` and complete login first"
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const path = join(homedir(), ".claude", ".credentials.json");
|
|
40
|
+
if (existsSync(path))
|
|
41
|
+
return { ok: true };
|
|
42
|
+
return {
|
|
43
|
+
ok: false,
|
|
44
|
+
error: `claude is not logged in (credentials missing at ${path}). Run \`claude\` and complete login first`
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
case "maestro": {
|
|
48
|
+
if (process.env.DEEPSEEK_API_KEY)
|
|
49
|
+
return { ok: true };
|
|
50
|
+
return {
|
|
51
|
+
ok: false,
|
|
52
|
+
error: "maestro is not authenticated (DEEPSEEK_API_KEY env var not set)"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
checkAgentAuth
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export { checkAgentAuth };
|
|
62
|
+
|
|
63
|
+
//# debugId=5F5545F27EC710D564756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/core/src/agents/auth-check.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Cheap pre-flight auth check used to block agent switches that would\n * otherwise flip the topic to a backend the user hasn't logged into,\n * surfacing as a per-turn opaque error inside the provider. Runtime\n * failures (revoked tokens, expired sessions) still classify normally\n * via `event-processor.classifyError`.\n *\n * Each branch mirrors the auth mechanism the matching provider uses:\n * - codex: `~/.codex/auth.json` (override `NEGOTIUM_CODEX_AUTH_FILE`)\n * - claude: `ANTHROPIC_API_KEY` env, else macOS keychain entry\n * `Claude Code-credentials`, else `~/.claude/.credentials.json`\n * - maestro: `DEEPSEEK_API_KEY` env\n */\nimport { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir, platform } from \"node:os\";\nimport { join } from \"node:path\";\nimport { codexAuthFilePath } from \"#platform/config\";\nimport type { AgentKind } from \"#types\";\n\nexport type AuthCheckResult = { ok: true } | { ok: false; error: string };\n\nexport function checkAgentAuth(agent: AgentKind): AuthCheckResult {\n switch (agent) {\n case \"codex\": {\n const path = codexAuthFilePath();\n if (existsSync(path)) return { ok: true };\n return {\n ok: false,\n error: `codex is not logged in (auth file missing at ${path}). Run \\`codex login\\` first`,\n };\n }\n case \"claude\": {\n if (process.env.ANTHROPIC_API_KEY) return { ok: true };\n if (platform() === \"darwin\") {\n try {\n execFileSync(\"security\", [\"find-generic-password\", \"-s\", \"Claude Code-credentials\"], {\n stdio: \"ignore\",\n });\n return { ok: true };\n } catch {\n return {\n ok: false,\n error:\n \"claude is not logged in (no macOS keychain entry 'Claude Code-credentials'). Run `claude` and complete login first\",\n };\n }\n }\n const path = join(homedir(), \".claude\", \".credentials.json\");\n if (existsSync(path)) return { ok: true };\n return {\n ok: false,\n error: `claude is not logged in (credentials missing at ${path}). Run \\`claude\\` and complete login first`,\n };\n }\n case \"maestro\": {\n if (process.env.DEEPSEEK_API_KEY) return { ok: true };\n return {\n ok: false,\n error: \"maestro is not authenticated (DEEPSEEK_API_KEY env var not set)\",\n };\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;AAaA;AACA;AACA;AACA;AAMO,SAAS,cAAc,CAAC,OAAmC;AAAA,EAChE,QAAQ;AAAA,SACD,SAAS;AAAA,MACZ,MAAM,OAAO,kBAAkB;AAAA,MAC/B,IAAI,WAAW,IAAI;AAAA,QAAG,OAAO,EAAE,IAAI,KAAK;AAAA,MACxC,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,gDAAgD;AAAA,MACzD;AAAA,IACF;AAAA,SACK,UAAU;AAAA,MACb,IAAI,QAAQ,IAAI;AAAA,QAAmB,OAAO,EAAE,IAAI,KAAK;AAAA,MACrD,IAAI,SAAS,MAAM,UAAU;AAAA,QAC3B,IAAI;AAAA,UACF,aAAa,YAAY,CAAC,yBAAyB,MAAM,yBAAyB,GAAG;AAAA,YACnF,OAAO;AAAA,UACT,CAAC;AAAA,UACD,OAAO,EAAE,IAAI,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,OAAO;AAAA,YACL,IAAI;AAAA,YACJ,OACE;AAAA,UACJ;AAAA;AAAA,MAEJ;AAAA,MACA,MAAM,OAAO,KAAK,QAAQ,GAAG,WAAW,mBAAmB;AAAA,MAC3D,IAAI,WAAW,IAAI;AAAA,QAAG,OAAO,EAAE,IAAI,KAAK;AAAA,MACxC,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,mDAAmD;AAAA,MAC5D;AAAA,IACF;AAAA,SACK,WAAW;AAAA,MACd,IAAI,QAAQ,IAAI;AAAA,QAAkB,OAAO,EAAE,IAAI,KAAK;AAAA,MACpD,OAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;",
|
|
8
|
+
"debugId": "5F5545F27EC710D564756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
PENDING_ASK_TTL_MS
|
|
4
|
+
} from "./chunk-sgsz2fpq.js";
|
|
5
|
+
import {
|
|
6
|
+
deliverPeerReply
|
|
7
|
+
} from "./chunk-1k7t7bnx.js";
|
|
8
|
+
import {
|
|
9
|
+
db
|
|
10
|
+
} from "./chunk-1msje2zf.js";
|
|
11
|
+
import"./chunk-f5xgprg1.js";
|
|
12
|
+
import"./chunk-k9z47mab.js";
|
|
13
|
+
import"./chunk-hwy3n31w.js";
|
|
14
|
+
|
|
15
|
+
// ../../packages/core/src/runtime/ask-callbacks.ts
|
|
16
|
+
db.exec(`
|
|
17
|
+
CREATE TABLE IF NOT EXISTS remote_ask_callbacks (
|
|
18
|
+
target_query_id TEXT PRIMARY KEY,
|
|
19
|
+
request_id TEXT NOT NULL,
|
|
20
|
+
node_name TEXT NOT NULL,
|
|
21
|
+
node_cell_id TEXT NOT NULL,
|
|
22
|
+
topic_id TEXT NOT NULL,
|
|
23
|
+
user_id TEXT NOT NULL,
|
|
24
|
+
created_at INTEGER NOT NULL
|
|
25
|
+
)
|
|
26
|
+
`);
|
|
27
|
+
var pendingAsks = new Map;
|
|
28
|
+
var MAX_ASK_AGE_MS = PENDING_ASK_TTL_MS;
|
|
29
|
+
function registerAskCallback(entry) {
|
|
30
|
+
pendingAsks.set(entry.targetQueryId, entry);
|
|
31
|
+
if (entry.remoteReply) {
|
|
32
|
+
db.query(`INSERT INTO remote_ask_callbacks
|
|
33
|
+
(target_query_id, request_id, node_name, node_cell_id, topic_id, user_id, created_at)
|
|
34
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
35
|
+
ON CONFLICT(target_query_id) DO UPDATE SET
|
|
36
|
+
request_id = excluded.request_id,
|
|
37
|
+
node_name = excluded.node_name,
|
|
38
|
+
node_cell_id = excluded.node_cell_id,
|
|
39
|
+
topic_id = excluded.topic_id,
|
|
40
|
+
user_id = excluded.user_id,
|
|
41
|
+
created_at = excluded.created_at`).run(entry.targetQueryId, entry.remoteReply.requestId, entry.remoteReply.nodeName, entry.remoteReply.nodeCellId, entry.remoteReply.topicId, entry.remoteReply.userId, entry.createdAt);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function resolveAskCallback(queryId) {
|
|
45
|
+
const entry = pendingAsks.get(queryId);
|
|
46
|
+
if (!entry)
|
|
47
|
+
return null;
|
|
48
|
+
if (Date.now() - entry.createdAt > MAX_ASK_AGE_MS) {
|
|
49
|
+
entry.timedOut = true;
|
|
50
|
+
}
|
|
51
|
+
pendingAsks.delete(queryId);
|
|
52
|
+
db.query("DELETE FROM remote_ask_callbacks WHERE target_query_id = ?").run(queryId);
|
|
53
|
+
return entry;
|
|
54
|
+
}
|
|
55
|
+
function purgeStaleAsks(now = Date.now()) {
|
|
56
|
+
for (const [id, entry] of pendingAsks) {
|
|
57
|
+
if (now - entry.createdAt > MAX_ASK_AGE_MS)
|
|
58
|
+
pendingAsks.delete(id);
|
|
59
|
+
}
|
|
60
|
+
db.query("DELETE FROM remote_ask_callbacks WHERE created_at < ?").run(now - MAX_ASK_AGE_MS);
|
|
61
|
+
}
|
|
62
|
+
function cancelAskCallbacksForTopic(topicId) {
|
|
63
|
+
let cancelled = 0;
|
|
64
|
+
for (const [queryId, entry] of pendingAsks) {
|
|
65
|
+
if (entry.callerTopicId !== topicId)
|
|
66
|
+
continue;
|
|
67
|
+
pendingAsks.delete(queryId);
|
|
68
|
+
db.query("DELETE FROM remote_ask_callbacks WHERE target_query_id = ?").run(queryId);
|
|
69
|
+
cancelled++;
|
|
70
|
+
}
|
|
71
|
+
return cancelled;
|
|
72
|
+
}
|
|
73
|
+
async function failInterruptedRemoteAskCallbacks() {
|
|
74
|
+
const rows = db.query(`SELECT target_query_id, request_id, node_name, node_cell_id, topic_id, user_id
|
|
75
|
+
FROM remote_ask_callbacks
|
|
76
|
+
ORDER BY created_at ASC`).all();
|
|
77
|
+
let failed = 0;
|
|
78
|
+
for (const row of rows) {
|
|
79
|
+
const delivered = await deliverPeerReply({
|
|
80
|
+
nodeName: row.node_name,
|
|
81
|
+
nodeCellId: row.node_cell_id,
|
|
82
|
+
topicId: row.topic_id,
|
|
83
|
+
userId: row.user_id,
|
|
84
|
+
requestId: row.request_id
|
|
85
|
+
}, "peer", "The remote worker restarted before this ask completed. Please retry the request.", "error");
|
|
86
|
+
if (!delivered)
|
|
87
|
+
continue;
|
|
88
|
+
db.query("DELETE FROM remote_ask_callbacks WHERE target_query_id = ?").run(row.target_query_id);
|
|
89
|
+
failed++;
|
|
90
|
+
}
|
|
91
|
+
return failed;
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
resolveAskCallback,
|
|
95
|
+
registerAskCallback,
|
|
96
|
+
purgeStaleAsks,
|
|
97
|
+
failInterruptedRemoteAskCallbacks,
|
|
98
|
+
cancelAskCallbacksForTopic
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export { registerAskCallback, resolveAskCallback, cancelAskCallbacksForTopic, failInterruptedRemoteAskCallbacks };
|
|
102
|
+
|
|
103
|
+
//# debugId=A38D686718BAC55064756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/core/src/runtime/ask-callbacks.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Ask callback registry (requestId → caller topic + cleanup).\n *\n * ask_session registers a callback here after the target AI turn is\n * dispatched; when the target AI completes, the turn runner resolves it and\n * routes the result back to the caller topic automatically.\n *\n * Ported from the in-memory registry half of otium's `api/routes/sessions.ts`\n * (the ask/tell REST routes stayed in the host).\n */\n\nimport { deliverPeerReply, type RemoteReplyRoute } from \"#mcp/session-comm/peer-forward\";\nimport { db } from \"#storage/forum-db\";\nimport { PENDING_ASK_TTL_MS, type PendingAskUserId } from \"#storage/session-asks\";\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS remote_ask_callbacks (\n target_query_id TEXT PRIMARY KEY,\n request_id TEXT NOT NULL,\n node_name TEXT NOT NULL,\n node_cell_id TEXT NOT NULL,\n topic_id TEXT NOT NULL,\n user_id TEXT NOT NULL,\n created_at INTEGER NOT NULL\n )\n`);\n\ninterface PendingAskIdentity {\n userId: PendingAskUserId;\n from: string;\n to: string;\n requestId?: string;\n}\n\nexport interface AskPending {\n requestId: string;\n contextId?: string;\n callerTopicId: string;\n callerUserId: string;\n targetQueryId: string;\n createdAt: number;\n timedOut?: boolean; // set when resolved past TTL — caller gets timeout notice\n pendingAsk?: PendingAskIdentity;\n remoteReply?: RemoteReplyRoute;\n}\n\n/** Active callbacks stay in memory for the normal completion path. Remote\n * reply routes are also persisted so a process restart can explicitly fail\n * the interrupted ask instead of leaving its caller waiting forever. */\nconst pendingAsks = new Map<string, AskPending>(); // keyed by targetQueryId (the AI turn's queryId)\nconst MAX_ASK_AGE_MS = PENDING_ASK_TTL_MS;\n\n/** Register an ask callback. Called after the target AI turn is dispatched. */\nexport function registerAskCallback(entry: AskPending): void {\n pendingAsks.set(entry.targetQueryId, entry);\n if (entry.remoteReply) {\n db.query(\n `INSERT INTO remote_ask_callbacks\n (target_query_id, request_id, node_name, node_cell_id, topic_id, user_id, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_query_id) DO UPDATE SET\n request_id = excluded.request_id,\n node_name = excluded.node_name,\n node_cell_id = excluded.node_cell_id,\n topic_id = excluded.topic_id,\n user_id = excluded.user_id,\n created_at = excluded.created_at`,\n ).run(\n entry.targetQueryId,\n entry.remoteReply.requestId,\n entry.remoteReply.nodeName,\n entry.remoteReply.nodeCellId,\n entry.remoteReply.topicId,\n entry.remoteReply.userId,\n entry.createdAt,\n );\n }\n}\n\n/** Resolve an ask callback after the target AI finishes.\n * Called from the turn runner when the agent stream ends — matches by the AI\n * turn's queryId. Returns the AskPending or null if not found.\n * Past TTL: returns entry with timedOut=true (caller gets timeout notice). */\nexport function resolveAskCallback(queryId: string): AskPending | null {\n const entry = pendingAsks.get(queryId);\n if (!entry) return null;\n if (Date.now() - entry.createdAt > MAX_ASK_AGE_MS) {\n entry.timedOut = true;\n }\n pendingAsks.delete(queryId);\n db.query(\"DELETE FROM remote_ask_callbacks WHERE target_query_id = ?\").run(queryId);\n return entry;\n}\n\n/** Clean up stale asks that outlived their TTL (periodic, lightweight). */\nexport function purgeStaleAsks(now: number = Date.now()): void {\n for (const [id, entry] of pendingAsks) {\n if (now - entry.createdAt > MAX_ASK_AGE_MS) pendingAsks.delete(id);\n }\n db.query(\"DELETE FROM remote_ask_callbacks WHERE created_at < ?\").run(now - MAX_ASK_AGE_MS);\n}\n\n/** Drop callbacks whose caller topic was hard-deleted. */\nexport function cancelAskCallbacksForTopic(topicId: string): number {\n let cancelled = 0;\n for (const [queryId, entry] of pendingAsks) {\n if (entry.callerTopicId !== topicId) continue;\n pendingAsks.delete(queryId);\n db.query(\"DELETE FROM remote_ask_callbacks WHERE target_query_id = ?\").run(queryId);\n cancelled++;\n }\n return cancelled;\n}\n\ninterface DurableRemoteAskCallbackRow {\n target_query_id: string;\n request_id: string;\n node_name: string;\n node_cell_id: string;\n topic_id: string;\n user_id: string;\n}\n\n/** Fail remote asks whose target turn was interrupted by the previous process.\n * Call once during startup after the peer session bridge is registered. */\nexport async function failInterruptedRemoteAskCallbacks(): Promise<number> {\n const rows = db\n .query(\n `SELECT target_query_id, request_id, node_name, node_cell_id, topic_id, user_id\n FROM remote_ask_callbacks\n ORDER BY created_at ASC`,\n )\n .all() as DurableRemoteAskCallbackRow[];\n let failed = 0;\n for (const row of rows) {\n const delivered = await deliverPeerReply(\n {\n nodeName: row.node_name,\n nodeCellId: row.node_cell_id,\n topicId: row.topic_id,\n userId: row.user_id,\n requestId: row.request_id,\n },\n \"peer\",\n \"The remote worker restarted before this ask completed. Please retry the request.\",\n \"error\",\n );\n if (!delivered) continue;\n db.query(\"DELETE FROM remote_ask_callbacks WHERE target_query_id = ?\").run(row.target_query_id);\n failed++;\n }\n return failed;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;AAeA,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAUP;AAwBD,IAAM,cAAc,IAAI;AACxB,IAAM,iBAAiB;AAGhB,SAAS,mBAAmB,CAAC,OAAyB;AAAA,EAC3D,YAAY,IAAI,MAAM,eAAe,KAAK;AAAA,EAC1C,IAAI,MAAM,aAAa;AAAA,IACrB,GAAG,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAUF,EAAE,IACA,MAAM,eACN,MAAM,YAAY,WAClB,MAAM,YAAY,UAClB,MAAM,YAAY,YAClB,MAAM,YAAY,SAClB,MAAM,YAAY,QAClB,MAAM,SACR;AAAA,EACF;AAAA;AAOK,SAAS,kBAAkB,CAAC,SAAoC;AAAA,EACrE,MAAM,QAAQ,YAAY,IAAI,OAAO;AAAA,EACrC,KAAK;AAAA,IAAO,OAAO;AAAA,EACnB,IAAI,KAAK,IAAI,IAAI,MAAM,YAAY,gBAAgB;AAAA,IACjD,MAAM,WAAW;AAAA,EACnB;AAAA,EACA,YAAY,OAAO,OAAO;AAAA,EAC1B,GAAG,MAAM,4DAA4D,EAAE,IAAI,OAAO;AAAA,EAClF,OAAO;AAAA;AAIF,SAAS,cAAc,CAAC,MAAc,KAAK,IAAI,GAAS;AAAA,EAC7D,YAAY,IAAI,UAAU,aAAa;AAAA,IACrC,IAAI,MAAM,MAAM,YAAY;AAAA,MAAgB,YAAY,OAAO,EAAE;AAAA,EACnE;AAAA,EACA,GAAG,MAAM,uDAAuD,EAAE,IAAI,MAAM,cAAc;AAAA;AAIrF,SAAS,0BAA0B,CAAC,SAAyB;AAAA,EAClE,IAAI,YAAY;AAAA,EAChB,YAAY,SAAS,UAAU,aAAa;AAAA,IAC1C,IAAI,MAAM,kBAAkB;AAAA,MAAS;AAAA,IACrC,YAAY,OAAO,OAAO;AAAA,IAC1B,GAAG,MAAM,4DAA4D,EAAE,IAAI,OAAO;AAAA,IAClF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAcT,eAAsB,iCAAiC,GAAoB;AAAA,EACzE,MAAM,OAAO,GACV,MACC;AAAA;AAAA,+BAGF,EACC,IAAI;AAAA,EACP,IAAI,SAAS;AAAA,EACb,WAAW,OAAO,MAAM;AAAA,IACtB,MAAM,YAAY,MAAM,iBACtB;AAAA,MACE,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,SAAS,IAAI;AAAA,MACb,QAAQ,IAAI;AAAA,MACZ,WAAW,IAAI;AAAA,IACjB,GACA,QACA,oFACA,OACF;AAAA,IACA,KAAK;AAAA,MAAW;AAAA,IAChB,GAAG,MAAM,4DAA4D,EAAE,IAAI,IAAI,eAAe;AAAA,IAC9F;AAAA,EACF;AAAA,EACA,OAAO;AAAA;",
|
|
8
|
+
"debugId": "A38D686718BAC55064756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import {
|
|
3
|
+
claudeProvider,
|
|
4
|
+
codexProvider,
|
|
5
|
+
configureAgentExecutionHost,
|
|
6
|
+
maestroProvider,
|
|
7
|
+
transformHostedQueryOptions
|
|
8
|
+
} from "./chunk-n0kk5xbq.js";
|
|
9
|
+
import"./chunk-2dgkah1z.js";
|
|
10
|
+
import"./chunk-pkdmypdd.js";
|
|
11
|
+
import {
|
|
12
|
+
revokeCanonicalMcpBridgeTurn
|
|
13
|
+
} from "./chunk-j0kjscb7.js";
|
|
14
|
+
import"./chunk-f5xgprg1.js";
|
|
15
|
+
import"./chunk-k9z47mab.js";
|
|
16
|
+
import"./chunk-hwy3n31w.js";
|
|
17
|
+
|
|
18
|
+
// ../../packages/core/src/agents/hosted-agent.ts
|
|
19
|
+
async function* runHostedAgent(input) {
|
|
20
|
+
const opts = transformHostedQueryOptions({ ...input });
|
|
21
|
+
try {
|
|
22
|
+
switch (opts.agent) {
|
|
23
|
+
case "claude":
|
|
24
|
+
yield* claudeProvider(opts);
|
|
25
|
+
return;
|
|
26
|
+
case "codex":
|
|
27
|
+
yield* codexProvider(opts);
|
|
28
|
+
return;
|
|
29
|
+
case "maestro":
|
|
30
|
+
yield* maestroProvider(opts);
|
|
31
|
+
return;
|
|
32
|
+
default: {
|
|
33
|
+
const exhaustive = opts.agent;
|
|
34
|
+
throw new Error(`runHostedAgent: unknown agent '${exhaustive}'`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
} finally {
|
|
38
|
+
if (opts.userId && opts.topicId && opts.queryId && opts.peerBridge) {
|
|
39
|
+
revokeCanonicalMcpBridgeTurn({
|
|
40
|
+
userId: opts.userId,
|
|
41
|
+
topicId: opts.topicId,
|
|
42
|
+
queryId: opts.queryId,
|
|
43
|
+
peerBridge: opts.peerBridge
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
runHostedAgent,
|
|
50
|
+
configureAgentExecutionHost
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
//# debugId=5305352F3E1C072864756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../packages/core/src/agents/hosted-agent.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { claudeProvider } from \"#agents/claude-provider\";\nimport { codexProvider } from \"#agents/codex-provider\";\nimport {\n type AgentExecutionHost,\n configureAgentExecutionHost,\n transformHostedQueryOptions,\n} from \"#agents/execution-host\";\nimport { maestroProvider } from \"#agents/maestro-provider\";\nimport { revokeCanonicalMcpBridgeTurn } from \"#mcp/canonical-bridge-config\";\nimport type { AgentQueryOptions, UnifiedEvent } from \"#types\";\n\nexport type { AgentQueryOptions, UnifiedEvent };\nexport { type AgentExecutionHost, configureAgentExecutionHost };\n\n/**\n * Provider-only execution entry point for embedding hosts.\n *\n * Conversation persistence, authorization, placement, and topic lifecycle are\n * deliberately not handled here; those remain the embedding host's concern.\n */\nexport async function* runHostedAgent(input: AgentQueryOptions): AsyncGenerator<UnifiedEvent> {\n const opts = transformHostedQueryOptions({ ...input });\n try {\n switch (opts.agent) {\n case \"claude\":\n yield* claudeProvider(opts);\n return;\n case \"codex\":\n yield* codexProvider(opts);\n return;\n case \"maestro\":\n yield* maestroProvider(opts);\n return;\n default: {\n const exhaustive: never = opts.agent;\n throw new Error(`runHostedAgent: unknown agent '${exhaustive}'`);\n }\n }\n } finally {\n if (opts.userId && opts.topicId && opts.queryId && opts.peerBridge) {\n revokeCanonicalMcpBridgeTurn({\n userId: opts.userId,\n topicId: opts.topicId,\n queryId: opts.queryId,\n peerBridge: opts.peerBridge,\n });\n }\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAoBA,gBAAuB,cAAc,CAAC,OAAwD;AAAA,EAC5F,MAAM,OAAO,4BAA4B,KAAK,MAAM,CAAC;AAAA,EACrD,IAAI;AAAA,IACF,QAAQ,KAAK;AAAA,WACN;AAAA,QACH,OAAO,eAAe,IAAI;AAAA,QAC1B;AAAA,WACG;AAAA,QACH,OAAO,cAAc,IAAI;AAAA,QACzB;AAAA,WACG;AAAA,QACH,OAAO,gBAAgB,IAAI;AAAA,QAC3B;AAAA,eACO;AAAA,QACP,MAAM,aAAoB,KAAK;AAAA,QAC/B,MAAM,IAAI,MAAM,kCAAkC,aAAa;AAAA,MACjE;AAAA;AAAA,YAEF;AAAA,IACA,IAAI,KAAK,UAAU,KAAK,WAAW,KAAK,WAAW,KAAK,YAAY;AAAA,MAClE,6BAA6B;AAAA,QAC3B,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA;AAAA;",
|
|
8
|
+
"debugId": "5305352F3E1C072864756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|