toc-ocra 0.2.4 → 0.2.6
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/dist/service/agent.mjs +428 -45
- package/dist/src/cli-chat-worker.d.ts +1 -0
- package/dist/src/cli-chat-worker.js +24 -0
- package/dist/src/cli-chat-worker.js.map +1 -0
- package/dist/src/providers/chat/codex-app-server.d.ts +9 -0
- package/dist/src/providers/chat/codex-app-server.js +146 -0
- package/dist/src/providers/chat/codex-app-server.js.map +1 -0
- package/dist/src/providers/codex-quota.d.ts +10 -1
- package/dist/src/providers/codex-quota.js +41 -11
- package/dist/src/providers/codex-quota.js.map +1 -1
- package/dist/src/providers/provider.d.ts +10 -0
- package/dist/src/providers/provider.js.map +1 -1
- package/dist/src/providers/quota-reader.d.ts +8 -0
- package/dist/src/providers/quota-reader.js +19 -0
- package/dist/src/providers/quota-reader.js.map +1 -0
- package/dist/src/runs/run-supervisor.d.ts +12 -0
- package/dist/src/runs/run-supervisor.js +154 -6
- package/dist/src/runs/run-supervisor.js.map +1 -1
- package/dist/src/runtime/agent-runtime.d.ts +6 -1
- package/dist/src/runtime/agent-runtime.js +82 -29
- package/dist/src/runtime/agent-runtime.js.map +1 -1
- package/dist/src/transport/gateway-client.d.ts +6 -0
- package/dist/src/transport/gateway-client.js +24 -0
- package/dist/src/transport/gateway-client.js.map +1 -1
- package/dist/src/types/protocol.d.ts +9 -0
- package/dist/src/types/protocol.js +3 -1
- package/dist/src/types/protocol.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { loadAgentConfig } from './config.js';
|
|
3
|
+
import { AgentRuntime } from './runtime/agent-runtime.js';
|
|
4
|
+
import { agentVersion } from './runtime/run-service.js';
|
|
5
|
+
import { hydrateShellPath, mergePathSegments } from './runtime/cli/hydrate-shell-path.js';
|
|
6
|
+
// A separate leased channel permits upgrading chat without restarting active MCP tasks.
|
|
7
|
+
const hydration = await hydrateShellPath();
|
|
8
|
+
if (hydration.ok)
|
|
9
|
+
mergePathSegments(hydration.segments);
|
|
10
|
+
const base = loadAgentConfig();
|
|
11
|
+
const config = { ...base, logFile: join(base.dataDir, 'logs', 'cli-chat.log') };
|
|
12
|
+
const runtime = new AgentRuntime(config, agentVersion(), undefined, true);
|
|
13
|
+
let stopping = false;
|
|
14
|
+
async function stop() {
|
|
15
|
+
if (stopping)
|
|
16
|
+
return;
|
|
17
|
+
stopping = true;
|
|
18
|
+
await runtime.stop();
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
process.once('SIGINT', () => void stop());
|
|
22
|
+
process.once('SIGTERM', () => void stop());
|
|
23
|
+
await runtime.start();
|
|
24
|
+
//# sourceMappingURL=cli-chat-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-chat-worker.js","sourceRoot":"","sources":["../../src/cli-chat-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AAEzF,wFAAwF;AACxF,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAA;AAC1C,IAAI,SAAS,CAAC,EAAE;IAAE,iBAAiB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;AACvD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;AAC9B,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,CAAA;AAC/E,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;AACzE,IAAI,QAAQ,GAAG,KAAK,CAAA;AACpB,KAAK,UAAU,IAAI;IACjB,IAAI,QAAQ;QAAE,OAAM;IACpB,QAAQ,GAAG,IAAI,CAAA;IACf,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;IACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AACD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AACzC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;AAC1C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HeadlessProvider, HeadlessRunRequest } from '../provider.js';
|
|
2
|
+
export type ChatAttachmentFile = {
|
|
3
|
+
path: string;
|
|
4
|
+
name: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
};
|
|
7
|
+
/** Each turn resumes the backend-owned native thread, not the workstation's
|
|
8
|
+
* task-chain thread. Protocol: https://learn.chatgpt.com/docs/app-server */
|
|
9
|
+
export declare function codexChatProvider(request: HeadlessRunRequest, attachments: ChatAttachmentFile[]): HeadlessProvider;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { clip, providerEnvironment, resolveExecutable, str, tryJson } from '../provider.js';
|
|
2
|
+
/** Each turn resumes the backend-owned native thread, not the workstation's
|
|
3
|
+
* task-chain thread. Protocol: https://learn.chatgpt.com/docs/app-server */
|
|
4
|
+
export function codexChatProvider(request, attachments) {
|
|
5
|
+
let write;
|
|
6
|
+
let threadId = request.sessionId;
|
|
7
|
+
let hasStartedTurn = false;
|
|
8
|
+
const send = (message) => write?.(`${JSON.stringify(message)}\n`);
|
|
9
|
+
const options = {
|
|
10
|
+
cwd: request.workdir,
|
|
11
|
+
approvalPolicy: 'never',
|
|
12
|
+
sandbox: 'danger-full-access',
|
|
13
|
+
...(request.model ? { model: request.model } : {})
|
|
14
|
+
};
|
|
15
|
+
const threadRequest = () => send({ id: 2, method: threadId ? 'thread/resume' : 'thread/start',
|
|
16
|
+
params: { ...options, ...(threadId ? { threadId } : { ephemeral: false }) } });
|
|
17
|
+
const startTurn = () => {
|
|
18
|
+
if (hasStartedTurn)
|
|
19
|
+
return;
|
|
20
|
+
hasStartedTurn = true;
|
|
21
|
+
const input = [];
|
|
22
|
+
if (request.prompt)
|
|
23
|
+
input.push({ type: 'text', text: request.prompt });
|
|
24
|
+
for (const attachment of attachments) {
|
|
25
|
+
if (attachment.kind === 'image')
|
|
26
|
+
input.push({ type: 'localImage', path: attachment.path });
|
|
27
|
+
else
|
|
28
|
+
input.push({ type: 'text', text: `附件文件:${attachment.name}\n本机路径:${attachment.path}` });
|
|
29
|
+
}
|
|
30
|
+
send({ id: 3, method: 'turn/start', params: { threadId, input, cwd: request.workdir,
|
|
31
|
+
approvalPolicy: 'never', sandboxPolicy: { type: 'dangerFullAccess' },
|
|
32
|
+
...(request.model ? { model: request.model } : {}),
|
|
33
|
+
...(request.reasoningEffort ? { effort: request.reasoningEffort } : {}) } });
|
|
34
|
+
};
|
|
35
|
+
const empty = () => ({ display: [] });
|
|
36
|
+
return {
|
|
37
|
+
id: 'codex',
|
|
38
|
+
buildLaunch() { return resolveExecutable('codex', ['app-server', '--listen', 'stdio://'], providerEnvironment(), process.env.TOC_OCRA_CODEX_PATH); },
|
|
39
|
+
startInput(writer) {
|
|
40
|
+
write = writer;
|
|
41
|
+
send({ id: 1, method: 'initialize', params: {
|
|
42
|
+
clientInfo: { name: 'echo_cli_chat', title: 'Echo CLI Chat', version: '1.0' },
|
|
43
|
+
capabilities: { experimentalApi: true }
|
|
44
|
+
} });
|
|
45
|
+
},
|
|
46
|
+
parseLine(line) {
|
|
47
|
+
const message = tryJson(line);
|
|
48
|
+
if (!message)
|
|
49
|
+
return empty();
|
|
50
|
+
if (message.id !== undefined && !message.method) {
|
|
51
|
+
const error = message.error;
|
|
52
|
+
if (error)
|
|
53
|
+
return { display: [], turnError: str(error.message) ?? 'Codex 会话请求失败', endProcess: true };
|
|
54
|
+
if (message.id === 1) {
|
|
55
|
+
send({ method: 'initialized' });
|
|
56
|
+
threadRequest();
|
|
57
|
+
return empty();
|
|
58
|
+
}
|
|
59
|
+
if (message.id === 2) {
|
|
60
|
+
const result = message.result;
|
|
61
|
+
const thread = result?.thread;
|
|
62
|
+
const id = str(thread?.id);
|
|
63
|
+
if (!id)
|
|
64
|
+
return { display: [], turnError: 'Codex 未返回原生会话 ID', endProcess: true };
|
|
65
|
+
threadId = id;
|
|
66
|
+
startTurn();
|
|
67
|
+
return { display: [`● 会话 ${id}`], sessionId: id };
|
|
68
|
+
}
|
|
69
|
+
return empty();
|
|
70
|
+
}
|
|
71
|
+
const params = (message.params ?? {});
|
|
72
|
+
if (params.threadId && params.threadId !== threadId)
|
|
73
|
+
return empty();
|
|
74
|
+
// Interactive approvals/questions need a future response channel. Do not
|
|
75
|
+
// leave the process waiting indefinitely or silently approve a request.
|
|
76
|
+
if (message.id !== undefined) {
|
|
77
|
+
send({ id: message.id, error: { code: -32601, message: '当前聊天尚未接入交互式权限或问答' } });
|
|
78
|
+
return { display: [], turnError: 'CLI 正在请求交互确认,当前聊天尚未接入此操作。', endProcess: true };
|
|
79
|
+
}
|
|
80
|
+
const itemId = str(params.itemId) ?? '';
|
|
81
|
+
switch (message.method) {
|
|
82
|
+
case 'item/agentMessage/delta':
|
|
83
|
+
case 'item/reasoning/textDelta':
|
|
84
|
+
case 'item/reasoning/summaryTextDelta': {
|
|
85
|
+
const text = typeof params.delta === 'string' ? params.delta : '';
|
|
86
|
+
return { display: [], chatEvents: itemId && text ? [{ event: message.method === 'item/agentMessage/delta' ? 'text_delta' : 'thought_delta', item_id: itemId, text }] : [] };
|
|
87
|
+
}
|
|
88
|
+
case 'turn/plan/updated': {
|
|
89
|
+
const plan = Array.isArray(params.plan) ? params.plan : [];
|
|
90
|
+
return { display: [], chatEvents: [{ event: 'item', item: { itemId: 'plan', type: 'plan',
|
|
91
|
+
entries: plan.map(entry => ({ content: String(entry.step ?? ''), status: String(entry.status ?? 'pending') })) } }] };
|
|
92
|
+
}
|
|
93
|
+
case 'item/started':
|
|
94
|
+
case 'item/completed': {
|
|
95
|
+
const item = (params.item ?? {});
|
|
96
|
+
const id = str(item.id);
|
|
97
|
+
if (!id || item.type === 'userMessage')
|
|
98
|
+
return empty();
|
|
99
|
+
const completed = message.method === 'item/completed';
|
|
100
|
+
const status = completed ? (item.status === 'failed' ? 'failed' : 'completed') : 'in_progress';
|
|
101
|
+
let normalized;
|
|
102
|
+
switch (item.type) {
|
|
103
|
+
case 'agentMessage':
|
|
104
|
+
normalized = { itemId: id, type: 'text', text: String(item.text ?? ''), status };
|
|
105
|
+
break;
|
|
106
|
+
case 'reasoning': {
|
|
107
|
+
// Only the readable summary is rendered, never hidden raw reasoning.
|
|
108
|
+
const summary = Array.isArray(item.summary) ? item.summary.map(String).join('\n\n') : '';
|
|
109
|
+
normalized = { itemId: id, type: 'thought', text: summary, status };
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case 'plan':
|
|
113
|
+
normalized = { itemId: id, type: 'text', text: String(item.text ?? ''), status };
|
|
114
|
+
break;
|
|
115
|
+
case 'commandExecution':
|
|
116
|
+
normalized = { itemId: id, type: 'tool_call', name: 'shell', kind: 'execute', title: String(item.command ?? '执行命令'), text: clip(String(item.aggregatedOutput ?? ''), 64_000), status };
|
|
117
|
+
break;
|
|
118
|
+
case 'fileChange':
|
|
119
|
+
normalized = { itemId: id, type: 'tool_call', name: 'file_change', kind: 'edit', title: '修改文件', text: clip(JSON.stringify(item.changes ?? []), 64_000), status };
|
|
120
|
+
break;
|
|
121
|
+
case 'mcpToolCall':
|
|
122
|
+
normalized = { itemId: id, type: 'tool_call', name: String(item.tool ?? 'MCP'), kind: 'call', title: String(item.tool ?? '工具调用'), text: clip(JSON.stringify(item.result ?? item.arguments ?? {}), 64_000), status };
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
normalized = { itemId: id, type: 'tool_call', name: String(item.type ?? 'tool'), title: String(item.type ?? '执行过程'), status };
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
// A completed empty summary must not replace already streamed text.
|
|
129
|
+
if (completed && normalized.type === 'thought' && !normalized.text)
|
|
130
|
+
return empty();
|
|
131
|
+
return { display: [], chatEvents: [{ event: 'item', item: normalized }],
|
|
132
|
+
...(completed && item.type === 'agentMessage' ? { message: String(item.text ?? '') } : {}) };
|
|
133
|
+
}
|
|
134
|
+
case 'turn/completed': {
|
|
135
|
+
const turn = (params.turn ?? {});
|
|
136
|
+
const error = (turn.error ?? {});
|
|
137
|
+
if (turn.status !== 'completed')
|
|
138
|
+
return { display: [], turnError: str(error.message) ?? (turn.status === 'interrupted' ? '执行已中断' : 'Codex 本轮执行失败'), endProcess: true };
|
|
139
|
+
return { display: ['● 本轮完成'], turnCompleted: true, endProcess: true };
|
|
140
|
+
}
|
|
141
|
+
default: return empty();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=codex-app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["../../../../src/providers/chat/codex-app-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
export type CLIQuotaWindow = {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
used_percent?: number;
|
|
5
|
+
resets_at: number;
|
|
6
|
+
window_seconds?: number;
|
|
7
|
+
};
|
|
8
|
+
/** Reads the authenticated rate windows Codex exposes through its app-server. */
|
|
9
|
+
export declare function readCodexQuotaWindows(): Promise<CLIQuotaWindow[]>;
|
|
10
|
+
/** Compatibility helper for existing retry scheduling consumers. */
|
|
2
11
|
export declare function readCodexQuotaResetAt(): Promise<number>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { createInterface } from 'node:readline';
|
|
3
3
|
import { providerEnvironment, resolveExecutable } from './provider.js';
|
|
4
|
-
/** Reads the
|
|
5
|
-
export async function
|
|
4
|
+
/** Reads the authenticated rate windows Codex exposes through its app-server. */
|
|
5
|
+
export async function readCodexQuotaWindows() {
|
|
6
6
|
const launch = resolveExecutable('codex', ['app-server', '--stdio'], providerEnvironment(), process.env.TOC_OCRA_CODEX_PATH);
|
|
7
7
|
const child = spawn(launch.executable, launch.args, { env: launch.env, stdio: ['pipe', 'pipe', 'ignore'] });
|
|
8
8
|
let nextId = 0;
|
|
@@ -67,15 +67,36 @@ export async function readCodexQuotaResetAt() {
|
|
|
67
67
|
});
|
|
68
68
|
child.stdin.write('{"jsonrpc":"2.0","method":"initialized","params":{}}\n');
|
|
69
69
|
const result = await request('account/rateLimits/read', {});
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
70
|
+
const buckets = Object.entries(result?.rateLimitsByLimitId ?? {});
|
|
71
|
+
if (!buckets.length && result?.rateLimits)
|
|
72
|
+
buckets.push([String(result.rateLimits.limitId || 'codex'), result.rateLimits]);
|
|
73
|
+
const windows = buckets.flatMap(([limitId, snapshot]) => ['primary', 'secondary'].flatMap(key => {
|
|
74
|
+
const window = snapshot[key];
|
|
75
|
+
if (!window)
|
|
76
|
+
return [];
|
|
77
|
+
const resetRaw = Number(window.resetsAt);
|
|
78
|
+
const resetsAt = Number.isFinite(resetRaw) && resetRaw > 0 ? Math.floor(resetRaw > 10_000_000_000 ? resetRaw / 1000 : resetRaw) : 0;
|
|
79
|
+
const durationMins = Number(window.windowDurationMins);
|
|
80
|
+
const usedRaw = Number(window.usedPercent);
|
|
81
|
+
const windowLabel = durationMins === 300 ? '5 小时额度'
|
|
82
|
+
: durationMins >= 10000 ? '每周额度'
|
|
83
|
+
: durationMins > 0 ? `${durationMins} 分钟额度`
|
|
84
|
+
: key === 'primary' ? '主要额度' : '次要额度';
|
|
85
|
+
const bucketName = typeof snapshot.limitName === 'string' && snapshot.limitName.trim()
|
|
86
|
+
? snapshot.limitName.trim()
|
|
87
|
+
: limitId === 'codex' ? '' : limitId;
|
|
88
|
+
const item = {
|
|
89
|
+
key: `${limitId}:${key}`,
|
|
90
|
+
label: bucketName ? `${bucketName} · ${windowLabel}` : windowLabel,
|
|
91
|
+
resets_at: resetsAt,
|
|
92
|
+
...(Number.isFinite(usedRaw) && usedRaw >= 0 && usedRaw <= 100 ? { used_percent: usedRaw } : {}),
|
|
93
|
+
...(Number.isFinite(durationMins) && durationMins > 0 ? { window_seconds: Math.floor(durationMins * 60) } : {})
|
|
94
|
+
};
|
|
95
|
+
return [item];
|
|
96
|
+
}));
|
|
97
|
+
if (!windows.length || !windows.some(window => window.resets_at > 0))
|
|
98
|
+
throw new Error('Codex 没有返回有效的额度窗口');
|
|
99
|
+
return windows;
|
|
79
100
|
}
|
|
80
101
|
finally {
|
|
81
102
|
for (const waiter of pending.values())
|
|
@@ -85,4 +106,13 @@ export async function readCodexQuotaResetAt() {
|
|
|
85
106
|
child.kill('SIGTERM');
|
|
86
107
|
}
|
|
87
108
|
}
|
|
109
|
+
/** Compatibility helper for existing retry scheduling consumers. */
|
|
110
|
+
export async function readCodexQuotaResetAt() {
|
|
111
|
+
const windows = await readCodexQuotaWindows();
|
|
112
|
+
const now = Math.floor(Date.now() / 1000);
|
|
113
|
+
const next = windows.map(window => window.resets_at).filter(value => value > now).sort((a, b) => a - b)[0];
|
|
114
|
+
if (!next)
|
|
115
|
+
throw new Error('Codex 没有返回有效的未来额度重置时间');
|
|
116
|
+
return next;
|
|
117
|
+
}
|
|
88
118
|
//# sourceMappingURL=codex-quota.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-quota.js","sourceRoot":"","sources":["../../../src/providers/codex-quota.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAE/C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"codex-quota.js","sourceRoot":"","sources":["../../../src/providers/codex-quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,15 @@ export type LaunchSpec = {
|
|
|
20
20
|
args: string[];
|
|
21
21
|
env: NodeJS.ProcessEnv;
|
|
22
22
|
};
|
|
23
|
+
export type ChatContentEvent = {
|
|
24
|
+
event: 'text_delta' | 'thought_delta' | 'item';
|
|
25
|
+
item_id?: string;
|
|
26
|
+
text?: string;
|
|
27
|
+
item?: Record<string, unknown>;
|
|
28
|
+
};
|
|
23
29
|
export type ParsedLine = {
|
|
30
|
+
chatEvents?: ChatContentEvent[];
|
|
31
|
+
endProcess?: boolean;
|
|
24
32
|
sessionId?: string;
|
|
25
33
|
/** Latest assistant answer; the last one seen becomes the final message. */
|
|
26
34
|
message?: string;
|
|
@@ -36,6 +44,8 @@ export interface HeadlessProvider {
|
|
|
36
44
|
buildLaunch(request: HeadlessRunRequest): LaunchSpec;
|
|
37
45
|
/** Parses one stdout line; non-JSON lines are shown as-is. */
|
|
38
46
|
parseLine(line: string): ParsedLine;
|
|
47
|
+
/** Optional app-server handshake; task-chain exec providers have no stdin. */
|
|
48
|
+
startInput?(write: (message: string) => void): void;
|
|
39
49
|
}
|
|
40
50
|
export declare function providerEnvironment(): NodeJS.ProcessEnv;
|
|
41
51
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEpD,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type CLIQuotaWindow } from './codex-quota.js';
|
|
2
|
+
export type CLIQuotaReport = {
|
|
3
|
+
agent_type: string;
|
|
4
|
+
quota_windows: CLIQuotaWindow[];
|
|
5
|
+
next_reset_at: number;
|
|
6
|
+
fetched_at: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function readCLIQuotaReport(agentType: string): Promise<CLIQuotaReport>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readCodexQuotaWindows } from './codex-quota.js';
|
|
2
|
+
// Provider adapters are independent of the account API. Add a reader here
|
|
3
|
+
// when a CLI exposes authenticated quota data through a stable interface.
|
|
4
|
+
const quotaReaders = {
|
|
5
|
+
codex: readCodexQuotaWindows
|
|
6
|
+
};
|
|
7
|
+
export async function readCLIQuotaReport(agentType) {
|
|
8
|
+
const provider = agentType.trim().toLowerCase();
|
|
9
|
+
const read = quotaReaders[provider];
|
|
10
|
+
if (!read)
|
|
11
|
+
throw new Error(`${provider || '该 CLI'} 暂不支持自动读取额度,请使用手动维护`);
|
|
12
|
+
const quotaWindows = await read();
|
|
13
|
+
const now = Math.floor(Date.now() / 1000);
|
|
14
|
+
const reset = quotaWindows.map(window => window.resets_at).filter(value => value > now).sort((a, b) => a - b)[0];
|
|
15
|
+
if (!quotaWindows.length || !reset)
|
|
16
|
+
throw new Error(`${provider} 没有返回有效的未来额度重置时间`);
|
|
17
|
+
return { agent_type: provider, quota_windows: quotaWindows, next_reset_at: reset, fetched_at: now };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=quota-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-reader.js","sourceRoot":"","sources":["../../../src/providers/quota-reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAuB,MAAM,kBAAkB,CAAA;AAK7E,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,YAAY,GAA0C;IAC1D,KAAK,EAAE,qBAAqB;CAC7B,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB;IACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACnC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,IAAI,OAAO,qBAAqB,CAAC,CAAA;IACvE,MAAM,YAAY,GAAG,MAAM,IAAI,EAAE,CAAA;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChH,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,kBAAkB,CAAC,CAAA;IAClF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,CAAA;AACrG,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AgentConfig } from '../config.js';
|
|
2
2
|
import type { DiagnosticLogger } from '../logging/diagnostic-log.js';
|
|
3
|
+
import type { ChatContentEvent } from '../providers/provider.js';
|
|
3
4
|
import { type TerminalTailRead } from '../session/terminal-tail-buffer.js';
|
|
4
5
|
import type { RunFinishedReport, RunStartPayload, RunStartedReport } from '../types/protocol.js';
|
|
5
6
|
import { OrphanRegistry } from './orphan-registry.js';
|
|
@@ -16,6 +17,10 @@ import { OrphanRegistry } from './orphan-registry.js';
|
|
|
16
17
|
*/
|
|
17
18
|
export declare const COMPLETION_EXIT_GRACE_MS = 15000;
|
|
18
19
|
export type RunReporter = {
|
|
20
|
+
chatEvents?(runId: string, events: Array<ChatContentEvent & {
|
|
21
|
+
sequence: number;
|
|
22
|
+
}>): Promise<void>;
|
|
23
|
+
chatMedia?(runId: string, mediaId: string): Promise<Uint8Array>;
|
|
19
24
|
started(runId: string, report: RunStartedReport): Promise<void>;
|
|
20
25
|
finished(runId: string, report: RunFinishedReport): Promise<void>;
|
|
21
26
|
};
|
|
@@ -32,10 +37,13 @@ export declare class RunSupervisor {
|
|
|
32
37
|
private readonly recent;
|
|
33
38
|
/** Run ids whose finish report has not been acknowledged yet. */
|
|
34
39
|
private readonly unreported;
|
|
40
|
+
private readonly chatRunIds;
|
|
35
41
|
constructor(config: AgentConfig, logger: DiagnosticLogger, reporter: RunReporter, orphans?: OrphanRegistry | undefined);
|
|
36
42
|
get activeCount(): number;
|
|
37
43
|
/** Runs to list in the heartbeat: still running, or finished but not yet reported. */
|
|
38
44
|
activeRunIds(): string[];
|
|
45
|
+
activeChatRunIds(): string[];
|
|
46
|
+
activeTaskRunIds(): string[];
|
|
39
47
|
markReported(runId: string): void;
|
|
40
48
|
recentRuns(): Array<{
|
|
41
49
|
runId: string;
|
|
@@ -50,6 +58,9 @@ export declare class RunSupervisor {
|
|
|
50
58
|
start(payload: RunStartPayload): Promise<void>;
|
|
51
59
|
private onStdout;
|
|
52
60
|
private onExit;
|
|
61
|
+
private queueChatEvent;
|
|
62
|
+
private flushChatEvents;
|
|
63
|
+
private prepareChatAttachments;
|
|
53
64
|
private report;
|
|
54
65
|
/** Stops a run: the whole process tree, then a `cancelled` report. */
|
|
55
66
|
cancel(runId: string): Promise<boolean>;
|
|
@@ -59,5 +70,6 @@ export declare class RunSupervisor {
|
|
|
59
70
|
}, limit: number, beforeCursor?: number): TailResult;
|
|
60
71
|
disposeAll(): Promise<void>;
|
|
61
72
|
private remember;
|
|
73
|
+
private defaultChatWorkdir;
|
|
62
74
|
validateWorkdir(input: string | undefined): Promise<string>;
|
|
63
75
|
}
|