specrails-core 5.2.3 → 5.3.0

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.
Files changed (101) hide show
  1. package/README.md +3 -0
  2. package/bin/specrails-core.mjs +5 -0
  3. package/dist/agent-runtime/cli-executor.d.ts +34 -0
  4. package/dist/agent-runtime/cli-executor.js +335 -0
  5. package/dist/agent-runtime/cli-executor.js.map +1 -0
  6. package/dist/agent-runtime/cli-process.d.ts +32 -0
  7. package/dist/agent-runtime/cli-process.js +159 -0
  8. package/dist/agent-runtime/cli-process.js.map +1 -0
  9. package/dist/agent-runtime/cli.d.ts +38 -0
  10. package/dist/agent-runtime/cli.js +168 -0
  11. package/dist/agent-runtime/cli.js.map +1 -0
  12. package/dist/agent-runtime/config.d.ts +7 -0
  13. package/dist/agent-runtime/config.js +162 -0
  14. package/dist/agent-runtime/config.js.map +1 -0
  15. package/dist/agent-runtime/core-host.d.ts +33 -0
  16. package/dist/agent-runtime/core-host.js +97 -0
  17. package/dist/agent-runtime/core-host.js.map +1 -0
  18. package/dist/agent-runtime/durable-store.d.ts +22 -0
  19. package/dist/agent-runtime/durable-store.js +205 -0
  20. package/dist/agent-runtime/durable-store.js.map +1 -0
  21. package/dist/agent-runtime/executor-types.d.ts +92 -0
  22. package/dist/agent-runtime/executor-types.js +29 -0
  23. package/dist/agent-runtime/executor-types.js.map +1 -0
  24. package/dist/agent-runtime/executors.d.ts +22 -0
  25. package/dist/agent-runtime/executors.js +44 -0
  26. package/dist/agent-runtime/executors.js.map +1 -0
  27. package/dist/agent-runtime/gemini-policy.d.ts +8 -0
  28. package/dist/agent-runtime/gemini-policy.js +36 -0
  29. package/dist/agent-runtime/gemini-policy.js.map +1 -0
  30. package/dist/agent-runtime/graph/artifacts.d.ts +40 -0
  31. package/dist/agent-runtime/graph/artifacts.js +179 -0
  32. package/dist/agent-runtime/graph/artifacts.js.map +1 -0
  33. package/dist/agent-runtime/graph/nodes.d.ts +36 -0
  34. package/dist/agent-runtime/graph/nodes.js +274 -0
  35. package/dist/agent-runtime/graph/nodes.js.map +1 -0
  36. package/dist/agent-runtime/graph/review-policy.d.ts +18 -0
  37. package/dist/agent-runtime/graph/review-policy.js +32 -0
  38. package/dist/agent-runtime/graph/review-policy.js.map +1 -0
  39. package/dist/agent-runtime/graph/roles.d.ts +44 -0
  40. package/dist/agent-runtime/graph/roles.js +126 -0
  41. package/dist/agent-runtime/graph/roles.js.map +1 -0
  42. package/dist/agent-runtime/graph/state.d.ts +75 -0
  43. package/dist/agent-runtime/graph/state.js +23 -0
  44. package/dist/agent-runtime/graph/state.js.map +1 -0
  45. package/dist/agent-runtime/graph-checkpointer.d.ts +61 -0
  46. package/dist/agent-runtime/graph-checkpointer.js +137 -0
  47. package/dist/agent-runtime/graph-checkpointer.js.map +1 -0
  48. package/dist/agent-runtime/index.d.ts +14 -0
  49. package/dist/agent-runtime/index.js +15 -0
  50. package/dist/agent-runtime/index.js.map +1 -0
  51. package/dist/agent-runtime/kimi-acp.d.ts +7 -0
  52. package/dist/agent-runtime/kimi-acp.js +179 -0
  53. package/dist/agent-runtime/kimi-acp.js.map +1 -0
  54. package/dist/agent-runtime/openai-executor.d.ts +18 -0
  55. package/dist/agent-runtime/openai-executor.js +174 -0
  56. package/dist/agent-runtime/openai-executor.js.map +1 -0
  57. package/dist/agent-runtime/prompts.d.ts +40 -0
  58. package/dist/agent-runtime/prompts.js +291 -0
  59. package/dist/agent-runtime/prompts.js.map +1 -0
  60. package/dist/agent-runtime/workflow-types.d.ts +210 -0
  61. package/dist/agent-runtime/workflow-types.js +2 -0
  62. package/dist/agent-runtime/workflow-types.js.map +1 -0
  63. package/dist/agent-runtime/workflow.d.ts +17 -0
  64. package/dist/agent-runtime/workflow.js +609 -0
  65. package/dist/agent-runtime/workflow.js.map +1 -0
  66. package/dist/agent-runtime/workspace-tools.d.ts +25 -0
  67. package/dist/agent-runtime/workspace-tools.js +120 -0
  68. package/dist/agent-runtime/workspace-tools.js.map +1 -0
  69. package/dist/installer/cli.d.ts +35 -0
  70. package/dist/installer/cli.js +3 -0
  71. package/dist/installer/cli.js.map +1 -1
  72. package/dist/installer/commands/doctor.d.ts +27 -0
  73. package/dist/installer/commands/framework.d.ts +85 -0
  74. package/dist/installer/commands/init.d.ts +147 -0
  75. package/dist/installer/commands/update.d.ts +56 -0
  76. package/dist/installer/commands/v5-migration.d.ts +32 -0
  77. package/dist/installer/phases/framework-lifecycle.d.ts +53 -0
  78. package/dist/installer/phases/install-config.d.ts +64 -0
  79. package/dist/installer/phases/manifest.d.ts +45 -0
  80. package/dist/installer/phases/prereqs.d.ts +51 -0
  81. package/dist/installer/phases/provider-detect.d.ts +89 -0
  82. package/dist/installer/phases/scaffold.d.ts +211 -0
  83. package/dist/installer/runtime/kimi.d.ts +84 -0
  84. package/dist/installer/runtime/pipeline-state.d.ts +210 -0
  85. package/dist/installer/runtime/pipeline-state.js +46 -22
  86. package/dist/installer/runtime/pipeline-state.js.map +1 -1
  87. package/dist/installer/util/errors.d.ts +46 -0
  88. package/dist/installer/util/exec.d.ts +41 -0
  89. package/dist/installer/util/fs.d.ts +153 -0
  90. package/dist/installer/util/git.d.ts +44 -0
  91. package/dist/installer/util/install-transaction.d.ts +29 -0
  92. package/dist/installer/util/logger.d.ts +31 -0
  93. package/dist/installer/util/paths.d.ts +34 -0
  94. package/dist/installer/util/prompts.d.ts +23 -0
  95. package/dist/installer/util/registry.d.ts +174 -0
  96. package/dist/installer/util/template.d.ts +23 -0
  97. package/docs/README.md +1 -0
  98. package/docs/agent-runtime.md +268 -0
  99. package/integration-contract.json +79 -7
  100. package/package.json +16 -1
  101. package/schemas/agent-runtime.schema.json +55 -0
@@ -0,0 +1,179 @@
1
+ import { normalizeKimiCliModel } from '../installer/runtime/kimi.js';
2
+ import { AgentExecutionError, unknownUsage, validateAgentRequest } from './executor-types.js';
3
+ import { runCliProcess } from './cli-process.js';
4
+ import { parseStructuredText } from './openai-executor.js';
5
+ import { WorkspaceTools } from './workspace-tools.js';
6
+ function record(value) { return value && typeof value === 'object' && !Array.isArray(value) ? value : {}; }
7
+ /** Native ACP v1 keeps Kimi 0.27 read-only roles usable without a platform skill or a model call during capability negotiation. */
8
+ export async function executeKimiReadonlyAcp(request, options = {}) {
9
+ validateAgentRequest(request);
10
+ if (request.role === 'developer')
11
+ throw new AgentExecutionError('Read-only ACP transport cannot execute developer roles', 'invalid_request');
12
+ if (request.maxCostUsd !== undefined)
13
+ throw new AgentExecutionError('Kimi cannot enforce a strict USD cap', 'cost_limit_unsupported');
14
+ if (request.maxTokens !== undefined)
15
+ throw new AgentExecutionError('Kimi 0.27 ACP does not report authoritative token usage. Remove the token cap or choose another provider for this role.', 'usage_unavailable');
16
+ const tools = new WorkspaceTools(request.cwd, request.allowedRoots, request.role);
17
+ let transport, nextId = 0, sessionId, text = '', completed = false, turns = 0, permissionDenied = false;
18
+ const calls = new Map();
19
+ const send = (method, params, success) => {
20
+ const id = ++nextId;
21
+ calls.set(id, { method, success });
22
+ transport.send(JSON.stringify({ jsonrpc: '2.0', id, method, params }));
23
+ };
24
+ const prompt = () => {
25
+ send('session/prompt', { sessionId, prompt: [{ type: 'text', text: request.prompt }] }, result => {
26
+ if (result.stopReason !== 'end_turn' || !text.trim())
27
+ throw new AgentExecutionError('Kimi ACP did not return a complete final result', 'incomplete_response');
28
+ if (permissionDenied)
29
+ throw new AgentExecutionError('Kimi requested a forbidden operation during a read-only role', 'tool_policy_violation');
30
+ completed = true;
31
+ transport.complete();
32
+ });
33
+ };
34
+ const selectMode = () => {
35
+ send('session/set_mode', { sessionId, modeId: 'plan' }, () => {
36
+ if (request.model)
37
+ send('session/set_config_option', { sessionId, configId: 'model', value: normalizeKimiCliModel(request.model) }, prompt);
38
+ else
39
+ prompt();
40
+ });
41
+ };
42
+ const onMessage = (line) => {
43
+ let message;
44
+ try {
45
+ message = record(JSON.parse(line));
46
+ }
47
+ catch {
48
+ throw new AgentExecutionError('Kimi emitted malformed ACP framing', 'invalid_response');
49
+ }
50
+ if (message.jsonrpc !== '2.0')
51
+ throw new AgentExecutionError('Kimi emitted an invalid JSON-RPC envelope', 'invalid_response');
52
+ if (typeof message.method === 'string') {
53
+ const params = record(message.params);
54
+ if (message.method === 'session/update' && message.id === undefined) {
55
+ if (!sessionId || params.sessionId !== sessionId)
56
+ return;
57
+ const update = record(params.update);
58
+ if (update.sessionUpdate === 'agent_message_chunk') {
59
+ const content = record(update.content);
60
+ if (content.type === 'text' && typeof content.text === 'string') {
61
+ text += content.text;
62
+ request.onEvent?.({ kind: 'text', text: content.text });
63
+ }
64
+ }
65
+ if (update.sessionUpdate === 'tool_call') {
66
+ // Progress text remains in onEvent; structured results contain only
67
+ // the assistant turn after the last tool invocation.
68
+ text = '';
69
+ turns++;
70
+ if (turns > (request.maxTurns ?? 24))
71
+ throw new AgentExecutionError('Kimi ACP exceeded its tool limit', 'max_turns');
72
+ request.onEvent?.({ kind: 'tool-start', tool: typeof update.title === 'string' ? update.title : 'kimi-tool' });
73
+ }
74
+ if (update.sessionUpdate === 'current_mode_update' && update.currentModeId !== 'plan')
75
+ throw new AgentExecutionError('Kimi left its read-only mode', 'tool_policy_violation');
76
+ if (update.sessionUpdate === 'config_option_update' && Array.isArray(update.configOptions)) {
77
+ const mode = update.configOptions.map(record).find(option => option.id === 'mode');
78
+ if (mode && mode.currentValue !== 'plan')
79
+ throw new AgentExecutionError('Kimi left its read-only mode', 'tool_policy_violation');
80
+ }
81
+ return;
82
+ }
83
+ if (message.id === undefined)
84
+ return;
85
+ const respond = (result) => transport.send(JSON.stringify({ jsonrpc: '2.0', id: message.id, result }));
86
+ const deny = () => {
87
+ permissionDenied = true;
88
+ transport.send(JSON.stringify({ jsonrpc: '2.0', id: message.id, error: { code: -32603, message: 'Operation unavailable in a read-only Specrails role' } }));
89
+ };
90
+ if (!sessionId || params.sessionId !== sessionId) {
91
+ deny();
92
+ return;
93
+ }
94
+ if (message.method === 'fs/read_text_file') {
95
+ let content;
96
+ try {
97
+ if (typeof params.path !== 'string')
98
+ throw new Error('Missing path');
99
+ content = tools.execute('read_file', { path: params.path });
100
+ if (params.line !== undefined || params.limit !== undefined) {
101
+ const start = params.line ?? 1, limit = params.limit ?? Number.MAX_SAFE_INTEGER;
102
+ if (!Number.isSafeInteger(start) || start < 1 || !Number.isSafeInteger(limit) || limit < 1)
103
+ throw new Error('Invalid line range');
104
+ content = content.split('\n').slice(start - 1, start - 1 + limit).join('\n');
105
+ }
106
+ }
107
+ catch {
108
+ deny();
109
+ return;
110
+ }
111
+ respond({ content });
112
+ return;
113
+ }
114
+ if (message.method === 'session/request_permission') {
115
+ // Only an explicit read/search of a validated workspace path may be approved.
116
+ const tool = record(params.toolCall), input = record(tool.rawInput);
117
+ const file = input.path ?? input.file_path;
118
+ const choices = Array.isArray(params.options) ? params.options.map(record) : [];
119
+ const allow = choices.find(option => option.kind === 'allow_once');
120
+ if (['read', 'search'].includes(String(tool.kind)) && typeof file === 'string' && typeof allow?.optionId === 'string') {
121
+ try {
122
+ tools.execute(tool.kind === 'read' ? 'read_file' : 'list_files', { path: file });
123
+ respond({ outcome: { outcome: 'selected', optionId: allow.optionId } });
124
+ return;
125
+ }
126
+ catch { /* reject an unscoped or unsupported read */ }
127
+ }
128
+ // No pre-existing provider permission can authorize a write/shell/mode switch for this role.
129
+ permissionDenied = true;
130
+ respond({ outcome: { outcome: 'cancelled' } });
131
+ return;
132
+ }
133
+ deny();
134
+ return;
135
+ }
136
+ if (typeof message.id !== 'number')
137
+ throw new AgentExecutionError('Kimi returned an unexpected ACP response', 'invalid_response');
138
+ const call = calls.get(message.id);
139
+ if (!call)
140
+ throw new AgentExecutionError('Kimi returned an unknown ACP response id', 'invalid_response');
141
+ calls.delete(message.id);
142
+ if (message.error)
143
+ throw new AgentExecutionError(`Kimi ACP ${call.method} failed. Check CLI capabilities, authentication and the configured model.`, 'provider_execution_error');
144
+ if (!message.result || typeof message.result !== 'object')
145
+ throw new AgentExecutionError('Kimi ACP response is missing its result', 'invalid_response');
146
+ call.success(record(message.result));
147
+ };
148
+ const result = await (options.runProcess ?? runCliProcess)({ command: 'kimi', args: ['acp'] }, {
149
+ cwd: tools.cwd, signal: request.signal, timeoutMs: request.timeoutMs ?? 15 * 60_000, env: options.env, onLine: onMessage,
150
+ duplex: control => {
151
+ transport = control;
152
+ send('initialize', { protocolVersion: 1, clientInfo: { name: 'specrails-core', version: '1' }, clientCapabilities: { fs: { readTextFile: true, writeTextFile: true }, terminal: true } }, initialized => {
153
+ if (initialized.protocolVersion !== 1)
154
+ throw new AgentExecutionError('Kimi ACP protocol version is unsupported', 'provider_capability_unsupported');
155
+ const capabilities = record(record(initialized.agentCapabilities).sessionCapabilities);
156
+ if (tools.roots.length > 1 && capabilities.additionalDirectories === undefined)
157
+ throw new AgentExecutionError('This Kimi ACP version cannot expose multiple repositories. Upgrade Kimi or use another provider for this read-only role.', 'provider_capability_unsupported');
158
+ send('session/new', { cwd: tools.cwd, mcpServers: [], ...(tools.roots.length > 1 ? { additionalDirectories: tools.roots.filter(root => root !== tools.cwd) } : {}) }, session => {
159
+ if (typeof session.sessionId !== 'string' || !session.sessionId)
160
+ throw new AgentExecutionError('Kimi ACP returned no session id', 'invalid_response');
161
+ sessionId = session.sessionId;
162
+ const modes = record(session.modes);
163
+ const modeOption = Array.isArray(session.configOptions) ? session.configOptions.map(record).find(option => option.id === 'mode') : undefined;
164
+ const available = Array.isArray(modes.availableModes) ? modes.availableModes.map(record) : [];
165
+ const modeValues = Array.isArray(modeOption?.options) ? modeOption.options.map(record) : [];
166
+ if (!available.some(mode => mode.id === 'plan') && !modeValues.some(mode => mode.value === 'plan'))
167
+ throw new AgentExecutionError('Kimi ACP does not expose enforced plan mode; upgrade Kimi Code before using a read-only role', 'provider_capability_unsupported');
168
+ selectMode();
169
+ });
170
+ });
171
+ },
172
+ });
173
+ if (result.exitCode !== 0 || !completed)
174
+ throw new AgentExecutionError('Kimi ACP exited before completing the role', 'incomplete_response');
175
+ const usage = unknownUsage();
176
+ request.onEvent?.({ kind: 'usage', usage });
177
+ return { text, usage, sessionId, structured: parseStructuredText(text) };
178
+ }
179
+ //# sourceMappingURL=kimi-acp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi-acp.js","sourceRoot":"","sources":["../../src/agent-runtime/kimi-acp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAuC,MAAM,qBAAqB,CAAA;AAClI,OAAO,EAAE,aAAa,EAAgD,MAAM,kBAAkB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,SAAS,MAAM,CAAC,KAAc,IAA6B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAC;AACvK,mIAAmI;AACnI,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAqB,EAAE,UAAsE,EAAE;IAC1I,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,MAAM,IAAI,mBAAmB,CAAC,wDAAwD,EAAE,iBAAiB,CAAC,CAAA;IAC5I,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,IAAI,mBAAmB,CAAC,sCAAsC,EAAE,wBAAwB,CAAC,CAAA;IACrI,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,mBAAmB,CAAC,yHAAyH,EAAE,mBAAmB,CAAC,CAAA;IAClN,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjF,IAAI,SAAuC,EAAE,MAAM,GAAG,CAAC,EAAE,SAA6B,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAA;IACzJ,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkF,CAAA;IACvG,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,MAA+B,EAAE,OAAkD,EAAQ,EAAE;QACzH,MAAM,EAAE,GAAG,EAAE,MAAM,CAAA;QACnB,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAClC,SAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE;YAC/F,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,MAAM,IAAI,mBAAmB,CAAC,iDAAiD,EAAE,qBAAqB,CAAC,CAAA;YAC7J,IAAI,gBAAgB;gBAAE,MAAM,IAAI,mBAAmB,CAAC,8DAA8D,EAAE,uBAAuB,CAAC,CAAA;YAC5I,SAAS,GAAG,IAAI,CAAA;YAChB,SAAU,CAAC,QAAQ,EAAE,CAAA;QACvB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE;YAC3D,IAAI,OAAO,CAAC,KAAK;gBAAE,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;;gBACtI,MAAM,EAAE,CAAA;QACf,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IACD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAQ,EAAE;QACvC,IAAI,OAAgC,CAAA;QACpC,IAAI,CAAC;YAAC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,IAAI,mBAAmB,CAAC,oCAAoC,EAAE,kBAAkB,CAAC,CAAA;QAAC,CAAC;QAC5I,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;YAAE,MAAM,IAAI,mBAAmB,CAAC,2CAA2C,EAAE,kBAAkB,CAAC,CAAA;QAC7H,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACrC,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACpE,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAM;gBACxD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACpC,IAAI,MAAM,CAAC,aAAa,KAAK,qBAAqB,EAAE,CAAC;oBACnD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;oBACtC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;wBAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;oBAAC,CAAC;gBACpJ,CAAC;gBACD,IAAI,MAAM,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;oBACzC,oEAAoE;oBACpE,qDAAqD;oBACrD,IAAI,GAAG,EAAE,CAAA;oBACT,KAAK,EAAE,CAAA;oBACP,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;wBAAE,MAAM,IAAI,mBAAmB,CAAC,kCAAkC,EAAE,WAAW,CAAC,CAAA;oBACpH,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;gBAChH,CAAC;gBACD,IAAI,MAAM,CAAC,aAAa,KAAK,qBAAqB,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM;oBAAE,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,EAAE,uBAAuB,CAAC,CAAA;gBAC7K,IAAI,MAAM,CAAC,aAAa,KAAK,sBAAsB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC3F,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,CAAA;oBAClF,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM;wBAAE,MAAM,IAAI,mBAAmB,CAAC,8BAA8B,EAAE,uBAAuB,CAAC,CAAA;gBAClI,CAAC;gBACD,OAAM;YACR,CAAC;YACD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;gBAAE,OAAM;YACpC,MAAM,OAAO,GAAG,CAAC,MAA+B,EAAQ,EAAE,CAAC,SAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YACtI,MAAM,IAAI,GAAG,GAAS,EAAE;gBACtB,gBAAgB,GAAG,IAAI,CAAA;gBACvB,SAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,qDAAqD,EAAE,EAAE,CAAC,CAAC,CAAA;YAC9J,CAAC,CAAA;YACD,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAAC,IAAI,EAAE,CAAC;gBAAC,OAAM;YAAC,CAAC;YACpE,IAAI,OAAO,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;gBAC3C,IAAI,OAAe,CAAA;gBACnB,IAAI,CAAC;oBACH,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;oBACpE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;oBAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,gBAAgB,CAAA;wBAC/E,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC;4BAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;wBACzJ,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAE,KAAgB,GAAG,CAAC,EAAG,KAAgB,GAAG,CAAC,GAAI,KAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBAClH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBAAC,IAAI,EAAE,CAAC;oBAAC,OAAM;gBAAC,CAAC;gBAC1B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;gBACpB,OAAM;YACR,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,4BAA4B,EAAE,CAAC;gBACpD,8EAA8E;gBAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBACnE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAA;gBAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;gBAClE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACtH,IAAI,CAAC;wBACH,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;wBAChF,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;wBACvE,OAAM;oBACR,CAAC;oBAAC,MAAM,CAAC,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,CAAC;gBACD,6FAA6F;gBAC7F,gBAAgB,GAAG,IAAI,CAAA;gBACvB,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,IAAI,EAAE,CAAA;YACN,OAAM;QACR,CAAC;QACD,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;YAAE,MAAM,IAAI,mBAAmB,CAAC,0CAA0C,EAAE,kBAAkB,CAAC,CAAA;QACjI,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,mBAAmB,CAAC,0CAA0C,EAAE,kBAAkB,CAAC,CAAA;QACxG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACxB,IAAI,OAAO,CAAC,KAAK;YAAE,MAAM,IAAI,mBAAmB,CAAC,YAAY,IAAI,CAAC,MAAM,2EAA2E,EAAE,0BAA0B,CAAC,CAAA;QAChL,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;YAAE,MAAM,IAAI,mBAAmB,CAAC,yCAAyC,EAAE,kBAAkB,CAAC,CAAA;QACvJ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE;QAC7F,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS;QACxH,MAAM,EAAE,OAAO,CAAC,EAAE;YAChB,SAAS,GAAG,OAAO,CAAA;YACnB,IAAI,CAAC,YAAY,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE;gBACtM,IAAI,WAAW,CAAC,eAAe,KAAK,CAAC;oBAAE,MAAM,IAAI,mBAAmB,CAAC,0CAA0C,EAAE,iCAAiC,CAAC,CAAA;gBACnJ,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,mBAAmB,CAAC,CAAA;gBACtF,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,qBAAqB,KAAK,SAAS;oBAAE,MAAM,IAAI,mBAAmB,CAAC,0HAA0H,EAAE,iCAAiC,CAAC,CAAA;gBAC5Q,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE;oBAC9K,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,SAAS;wBAAE,MAAM,IAAI,mBAAmB,CAAC,iCAAiC,EAAE,kBAAkB,CAAC,CAAA;oBACrJ,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;oBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;oBACnC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBAC5I,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;oBAC7F,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;oBAC3F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;wBAAE,MAAM,IAAI,mBAAmB,CAAC,8FAA8F,EAAE,iCAAiC,CAAC,CAAA;oBACpQ,UAAU,EAAE,CAAA;gBACd,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KACF,CAAC,CAAA;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,mBAAmB,CAAC,4CAA4C,EAAE,qBAAqB,CAAC,CAAA;IAC3I,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;IAC5B,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type AgentExecutor, type AgentLimits, type AgentRequest, type AgentResult, type RuntimeProviderConfig } from './executor-types.js';
2
+ type ApiProvider = Extract<RuntimeProviderConfig, {
3
+ kind: 'openai-compatible';
4
+ }>;
5
+ export interface OpenAICompatibleOptions {
6
+ fetch?: typeof globalThis.fetch;
7
+ env?: NodeJS.ProcessEnv;
8
+ }
9
+ export declare function parseStructuredText(text: string): Record<string, unknown> | undefined;
10
+ /** No SDK, gateway, tracing backend, paid probe, or mandatory key. */
11
+ export declare class OpenAICompatibleExecutor implements AgentExecutor {
12
+ private readonly provider;
13
+ private readonly options;
14
+ constructor(provider: ApiProvider, options?: OpenAICompatibleOptions);
15
+ validateLimits(limits: AgentLimits): void;
16
+ execute(request: AgentRequest): Promise<AgentResult>;
17
+ }
18
+ export {};
@@ -0,0 +1,174 @@
1
+ import { AgentExecutionError, unknownUsage, validateAgentRequest } from './executor-types.js';
2
+ import { WorkspaceTools } from './workspace-tools.js';
3
+ function record(value) {
4
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
5
+ }
6
+ function number(value) { return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : null; }
7
+ function add(left, right) { return left === null || right === null ? null : left + right; }
8
+ export function parseStructuredText(text) {
9
+ try {
10
+ return record(JSON.parse(text.trim().replace(/^```(?:json)?\s*\n/, '').replace(/\n```$/, '')));
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ /** No SDK, gateway, tracing backend, paid probe, or mandatory key. */
17
+ export class OpenAICompatibleExecutor {
18
+ provider;
19
+ options;
20
+ constructor(provider, options = {}) {
21
+ this.provider = provider;
22
+ this.options = options;
23
+ }
24
+ validateLimits(limits) {
25
+ if (limits.maxCostUsd !== undefined)
26
+ throw new AgentExecutionError('A strict USD cap requires an executor with a native spending limit; OpenAI-compatible endpoints do not provide one. Use a token cap or an executor with native cost enforcement.', 'cost_limit_unsupported');
27
+ }
28
+ async execute(request) {
29
+ validateAgentRequest(request);
30
+ this.validateLimits(request);
31
+ if (!request.model?.trim())
32
+ throw new AgentExecutionError('OpenAI-compatible execution requires a model', 'invalid_model');
33
+ const toolset = new WorkspaceTools(request.cwd, request.allowedRoots, request.role);
34
+ const maxTurns = request.maxTurns ?? 24;
35
+ if (!Number.isSafeInteger(maxTurns) || maxTurns < 1)
36
+ throw new AgentExecutionError('maxTurns must be a positive integer', 'invalid_limit');
37
+ const timeoutMs = request.timeoutMs ?? 15 * 60_000;
38
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1)
39
+ throw new AgentExecutionError('timeoutMs must be a positive integer', 'invalid_limit');
40
+ const env = this.options.env ?? process.env;
41
+ const key = this.provider.apiKeyEnv ? env[this.provider.apiKeyEnv] : undefined;
42
+ if (this.provider.apiKeyEnv && !key)
43
+ throw new AgentExecutionError(`Credential environment variable ${this.provider.apiKeyEnv} is not set`, 'missing_credential');
44
+ const endpoint = new URL(this.provider.baseUrl.replace(/\/+$/, '') + '/chat/completions');
45
+ if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password || endpoint.hash || endpoint.search)
46
+ throw new AgentExecutionError('Invalid OpenAI-compatible endpoint', 'invalid_endpoint');
47
+ const headers = { 'Content-Type': 'application/json' };
48
+ if (key)
49
+ headers.Authorization = `Bearer ${key}`;
50
+ const controller = new AbortController();
51
+ const abort = () => controller.abort(request.signal?.reason);
52
+ request.signal?.addEventListener('abort', abort, { once: true });
53
+ if (request.signal?.aborted)
54
+ abort();
55
+ const timer = setTimeout(() => controller.abort(new Error('Agent timeout')), timeoutMs);
56
+ let usage = { inputTokens: 0, outputTokens: 0, costUsd: 0 };
57
+ let responses = 0;
58
+ const messages = [
59
+ { role: 'system', content: `You execute one ${request.role} task. Use only the provided workspace tools. Allowed roots: ${JSON.stringify(toolset.roots)}. Working directory: ${toolset.cwd}. Return the complete requested final result. Do not coordinate another workflow or call a platform skill.` },
60
+ { role: 'user', content: request.prompt },
61
+ ];
62
+ try {
63
+ for (let turn = 0; turn < maxTurns; turn++) {
64
+ controller.signal.throwIfAborted();
65
+ const observed = (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0);
66
+ if (request.maxTokens !== undefined && responses && (usage.inputTokens === null || usage.outputTokens === null))
67
+ throw new AgentExecutionError('Provider omitted usage required by the token budget', 'usage_unavailable', usage);
68
+ if (request.maxTokens !== undefined && observed >= request.maxTokens)
69
+ throw new AgentExecutionError('Agent token budget exhausted', 'token_budget', usage);
70
+ const response = await (this.options.fetch ?? globalThis.fetch)(endpoint, {
71
+ method: 'POST', headers, signal: controller.signal, redirect: 'error',
72
+ body: JSON.stringify({ model: request.model, messages, tools: toolset.definitions(), tool_choice: 'auto', stream: false,
73
+ ...(request.maxTokens === undefined ? {} : { max_tokens: Math.max(1, Math.floor(request.maxTokens - observed)) }),
74
+ }),
75
+ });
76
+ if (!response.ok) {
77
+ await response.body?.cancel();
78
+ throw new AgentExecutionError(`OpenAI-compatible provider returned HTTP ${response.status}`, 'provider_http_error', responses ? usage : unknownUsage());
79
+ }
80
+ const body = await readBoundedResponse(response);
81
+ const data = record(body), reported = record(data?.usage);
82
+ const current = {
83
+ inputTokens: number(reported?.prompt_tokens), outputTokens: number(reported?.completion_tokens),
84
+ costUsd: number(reported?.cost_usd ?? data?.cost_usd),
85
+ };
86
+ usage = { inputTokens: add(usage.inputTokens, current.inputTokens), outputTokens: add(usage.outputTokens, current.outputTokens), costUsd: add(usage.costUsd, current.costUsd) };
87
+ responses++;
88
+ request.onEvent?.({ kind: 'usage', usage: { ...usage } });
89
+ if (request.maxTokens !== undefined && (usage.inputTokens === null || usage.outputTokens === null))
90
+ throw new AgentExecutionError('Provider omitted usage required by the token budget', 'usage_unavailable', usage);
91
+ if (request.maxTokens !== undefined && (usage.inputTokens ?? 0) + (usage.outputTokens ?? 0) > request.maxTokens)
92
+ throw new AgentExecutionError('Agent token budget exceeded', 'token_budget', usage);
93
+ if (request.maxCostUsd !== undefined && usage.costUsd !== null && usage.costUsd > request.maxCostUsd)
94
+ throw new AgentExecutionError('Agent cost budget exceeded', 'cost_budget', usage);
95
+ if (!data || data.error)
96
+ throw new AgentExecutionError('Provider returned an error or invalid response', 'provider_response_error', usage);
97
+ const choice = Array.isArray(data.choices) ? record(data.choices[0]) : undefined;
98
+ const message = record(choice?.message);
99
+ if (!message || message.role !== 'assistant')
100
+ throw new AgentExecutionError('Provider response has no assistant message', 'invalid_response', usage);
101
+ if (choice?.finish_reason === 'length' || choice?.finish_reason === 'content_filter')
102
+ throw new AgentExecutionError('Provider did not complete the requested result', 'incomplete_response', usage);
103
+ const calls = message.tool_calls;
104
+ if (calls !== undefined && !Array.isArray(calls))
105
+ throw new AgentExecutionError('Invalid tool calls in provider response', 'invalid_tool_call', usage);
106
+ if (Array.isArray(calls) && calls.length > 0) {
107
+ if (calls.length > 32)
108
+ throw new AgentExecutionError('Provider requested too many tools in one turn', 'invalid_tool_call', usage);
109
+ messages.push({ role: 'assistant', content: typeof message.content === 'string' ? message.content : null, tool_calls: calls });
110
+ const ids = new Set();
111
+ for (const raw of calls) {
112
+ controller.signal.throwIfAborted();
113
+ const call = record(raw), fn = record(call?.function);
114
+ if (call?.type !== 'function' || typeof call.id !== 'string' || !call.id || ids.has(call.id) || typeof fn?.name !== 'string' || typeof fn.arguments !== 'string')
115
+ throw new AgentExecutionError('Malformed provider tool call', 'invalid_tool_call', usage);
116
+ ids.add(call.id);
117
+ request.onEvent?.({ kind: 'tool-start', tool: fn.name });
118
+ let result;
119
+ try {
120
+ result = toolset.execute(fn.name, JSON.parse(fn.arguments));
121
+ }
122
+ catch (error) {
123
+ result = JSON.stringify({ error: error instanceof Error ? error.message : 'Tool execution failed' });
124
+ }
125
+ messages.push({ role: 'tool', tool_call_id: call.id, content: result });
126
+ request.onEvent?.({ kind: 'tool-end', tool: fn.name });
127
+ }
128
+ continue;
129
+ }
130
+ if (typeof message.content !== 'string' || !message.content.trim())
131
+ throw new AgentExecutionError('Provider returned an empty final result', 'invalid_response', usage);
132
+ request.onEvent?.({ kind: 'text', text: message.content });
133
+ return { text: message.content, usage, structured: parseStructuredText(message.content) };
134
+ }
135
+ throw new AgentExecutionError(`Agent exhausted ${maxTurns} turns without a final result`, 'max_turns', usage);
136
+ }
137
+ catch (error) {
138
+ if (error instanceof AgentExecutionError)
139
+ throw error;
140
+ if (controller.signal.aborted)
141
+ throw new AgentExecutionError(request.signal?.aborted ? 'Agent cancelled' : 'Agent timed out', request.signal?.aborted ? 'aborted' : 'timeout', responses ? usage : unknownUsage());
142
+ // Do not persist provider response bodies, URLs or credentials echoed by errors.
143
+ throw new AgentExecutionError('OpenAI-compatible request failed', 'provider_request_error', responses ? usage : unknownUsage());
144
+ }
145
+ finally {
146
+ clearTimeout(timer);
147
+ request.signal?.removeEventListener('abort', abort);
148
+ }
149
+ }
150
+ }
151
+ async function readBoundedResponse(response) {
152
+ if (!response.body)
153
+ throw new Error('Missing response body');
154
+ const reader = response.body.getReader(), chunks = [];
155
+ let length = 0;
156
+ try {
157
+ for (;;) {
158
+ const part = await reader.read();
159
+ if (part.done)
160
+ break;
161
+ length += part.value.byteLength;
162
+ if (length > 2 * 1024 * 1024) {
163
+ await reader.cancel();
164
+ throw new Error('Provider response exceeds 2 MiB');
165
+ }
166
+ chunks.push(part.value);
167
+ }
168
+ }
169
+ finally {
170
+ reader.releaseLock();
171
+ }
172
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
173
+ }
174
+ //# sourceMappingURL=openai-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-executor.js","sourceRoot":"","sources":["../../src/agent-runtime/openai-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { AgentRole } from './executor-types.js';
2
+ import type { PipelineContext, VerificationCommand } from '../installer/runtime/pipeline-state.js';
3
+ import { type ReviewPolicy } from './graph/review-policy.js';
4
+ import type { DeveloperRecord } from './graph/state.js';
5
+ /** Bump whenever the wording changes: the version is part of the frozen run identity. */
6
+ export declare const ROLE_INSTRUCTIONS_VERSION = "3";
7
+ export interface RoleFeedback {
8
+ verification?: unknown;
9
+ review?: unknown;
10
+ }
11
+ /** One frozen acceptance criterion the reviewer must certify, identified by stable scope coordinates. */
12
+ export interface FrozenCriterion {
13
+ specId: string;
14
+ criterionIndex: number;
15
+ requirement: string;
16
+ }
17
+ export interface RoleInstructionOptions {
18
+ feedback?: RoleFeedback;
19
+ verification?: VerificationCommand[];
20
+ /** Answers the requester gave to earlier architect questions, oldest first. */
21
+ answers?: string[];
22
+ /** Review gate thresholds rendered for the reviewer; defaults when omitted. */
23
+ policy?: ReviewPolicy;
24
+ /** Frozen acceptance criteria the reviewer certifies one by one. */
25
+ criteria?: FrozenCriterion[];
26
+ /** The developer's own account of the change, shown to the reviewer as a claim to verify. */
27
+ developer?: DeveloperRecord | null;
28
+ }
29
+ export declare const ARCHITECT_OUTPUT_SCHEMA: Record<string, unknown>;
30
+ export declare const DEVELOPER_OUTPUT_SCHEMA: Record<string, unknown>;
31
+ export declare const REVIEW_OUTPUT_SCHEMA: Record<string, unknown>;
32
+ /** Central role instructions. Roles describe their own work only: traversal,
33
+ * retries, checks, approvals, archive and delivery belong to the host. */
34
+ export declare function roleInstructions(role: AgentRole, context: PipelineContext, change: string, options?: RoleInstructionOptions): string;
35
+ /** A short follow-up for a provider session that already holds the role instructions. */
36
+ export declare function correctionInstructions(role: AgentRole, feedback: RoleFeedback | undefined): string;
37
+ /** Asks the architect, still in its session, to resolve a low-confidence design by investigating instead of guessing. */
38
+ export declare function deepenInstructions(question: string | undefined): string;
39
+ /** Asks a structured role to resend a malformed reply without repeating its work. */
40
+ export declare function repairInstructions(role: AgentRole, problem: string): string;