aws-runtime-bridge 1.9.9 → 1.9.20
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/adapter/AcodeSdkAdapter.d.ts +40 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +353 -7
- package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +36 -3
- package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
- package/dist/adapter/instance-ai-config-resolver.js +46 -0
- package/dist/adapter/types.d.ts +27 -2
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1092 -8
- package/dist/routes/events.d.ts +7 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +22 -0
- package/dist/routes/file-browser.d.ts +1 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +25 -9
- package/dist/routes/file-snapshot.d.ts +10 -0
- package/dist/routes/file-snapshot.d.ts.map +1 -0
- package/dist/routes/file-snapshot.js +156 -0
- package/dist/routes/git.d.ts +10 -0
- package/dist/routes/git.d.ts.map +1 -1
- package/dist/routes/git.js +305 -2
- package/dist/routes/git.test.js +39 -2
- package/dist/routes/instance.js +3 -1
- package/dist/routes/memory.d.ts +3 -0
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +3 -0
- package/dist/routes/terminal.d.ts +2 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +378 -41
- package/dist/routes/terminal.test.js +33 -7
- package/dist/services/agent-event-store.d.ts +59 -0
- package/dist/services/agent-event-store.d.ts.map +1 -0
- package/dist/services/agent-event-store.js +68 -0
- package/dist/services/event-delta-pusher.d.ts +40 -0
- package/dist/services/event-delta-pusher.d.ts.map +1 -0
- package/dist/services/event-delta-pusher.js +95 -0
- package/dist/services/fileSnapshotStore.d.ts +96 -0
- package/dist/services/fileSnapshotStore.d.ts.map +1 -0
- package/dist/services/fileSnapshotStore.js +500 -0
- package/dist/services/instance-ai-config-service.d.ts +49 -0
- package/dist/services/instance-ai-config-service.d.ts.map +1 -0
- package/dist/services/instance-ai-config-service.js +174 -0
- package/dist/services/panel-auth.d.ts +23 -0
- package/dist/services/panel-auth.d.ts.map +1 -1
- package/dist/services/panel-auth.js +64 -1
- package/dist/services/ring-buffer.d.ts +67 -0
- package/dist/services/ring-buffer.d.ts.map +1 -0
- package/dist/services/ring-buffer.js +103 -0
- package/dist/services/session-output.d.ts +47 -3
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +112 -2
- package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
- package/dist/utils/instance-ai-config-debug-logger.js +63 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +48 -4
- package/package/acode/dist/built-in-file-tools.d.ts +1 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +5 -3
- package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
- package/package/acode/dist/builtins/commandArtifacts.js +24 -4
- package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandResult.js +3 -3
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
- package/package/acode/dist/cli.js +2 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +156 -5
- package/package/acode/dist/types.d.ts +1 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +16 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +170 -2
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +947 -9
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +103 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +46 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +164 -12
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +88 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +122 -5
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 事件存储
|
|
3
|
+
*
|
|
4
|
+
* 为每个 agent 维护独立的事件环状缓冲区,支持事件追加和输出合并。
|
|
5
|
+
* scheduleEventPush 会消费 entry 进行差量推送。
|
|
6
|
+
*/
|
|
7
|
+
import { type RingBufferEntry } from "./ring-buffer.js";
|
|
8
|
+
export interface BridgeEventPayload {
|
|
9
|
+
readonly category: "status" | "output" | "question" | "file_changed";
|
|
10
|
+
readonly agentId: string;
|
|
11
|
+
readonly sessionId: string | null;
|
|
12
|
+
readonly status?: string;
|
|
13
|
+
readonly output?: string;
|
|
14
|
+
readonly seq?: number;
|
|
15
|
+
readonly questions?: unknown[];
|
|
16
|
+
readonly actionType?: string;
|
|
17
|
+
readonly actionLabel?: string;
|
|
18
|
+
readonly actionDetail?: string;
|
|
19
|
+
readonly actionResult?: string;
|
|
20
|
+
readonly actionId?: string;
|
|
21
|
+
readonly inputTokens?: number;
|
|
22
|
+
readonly outputTokens?: number;
|
|
23
|
+
readonly sourceEventType?: string;
|
|
24
|
+
readonly logLevel?: string;
|
|
25
|
+
readonly logCategory?: string;
|
|
26
|
+
readonly workspacePath?: string;
|
|
27
|
+
readonly filePath?: string;
|
|
28
|
+
readonly eventType?: string;
|
|
29
|
+
readonly size?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* per-agent 事件存储。
|
|
33
|
+
* 每条 append/appendOrMergeOutput 调用会写入对应 agent 的环状缓冲区,
|
|
34
|
+
* 并返回 RingBufferEntry 供 scheduleEventPush 消费。
|
|
35
|
+
*/
|
|
36
|
+
declare class AgentEventStore {
|
|
37
|
+
private readonly agents;
|
|
38
|
+
private ensureBuffer;
|
|
39
|
+
/**
|
|
40
|
+
* 追加一条事件到指定 agent 的缓冲区。
|
|
41
|
+
* @returns 新创建的条目
|
|
42
|
+
*/
|
|
43
|
+
append(agentId: string, payload: BridgeEventPayload): RingBufferEntry<BridgeEventPayload>;
|
|
44
|
+
/**
|
|
45
|
+
* 追加一条 output 事件到指定 agent 的缓冲区。
|
|
46
|
+
* 若最后一条也是 output 且来自同一 session + sourceEventType,
|
|
47
|
+
* 则在 10s 窗口内合并内容。
|
|
48
|
+
* @returns 被合并或新创建的条目
|
|
49
|
+
*/
|
|
50
|
+
appendOrMergeOutput(agentId: string, payload: BridgeEventPayload): RingBufferEntry<BridgeEventPayload>;
|
|
51
|
+
/**
|
|
52
|
+
* 获取指定 agent 的事件数量。
|
|
53
|
+
*/
|
|
54
|
+
size(agentId: string): number;
|
|
55
|
+
}
|
|
56
|
+
/** 全局单例 */
|
|
57
|
+
export declare const agentEventStore: AgentEventStore;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=agent-event-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-event-store.d.ts","sourceRoot":"","sources":["../../src/services/agent-event-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;;;GAIG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,OAAO,CAAC,YAAY;IASpB;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,CAAC;IAIzF;;;;;OAKG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,kBAAkB,GAC1B,eAAe,CAAC,kBAAkB,CAAC;IA6BtC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAG9B;AAED,WAAW;AACX,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 事件存储
|
|
3
|
+
*
|
|
4
|
+
* 为每个 agent 维护独立的事件环状缓冲区,支持事件追加和输出合并。
|
|
5
|
+
* scheduleEventPush 会消费 entry 进行差量推送。
|
|
6
|
+
*/
|
|
7
|
+
import { RingBuffer } from "./ring-buffer.js";
|
|
8
|
+
const PER_AGENT_BUFFER_CAPACITY = 500;
|
|
9
|
+
/**
|
|
10
|
+
* per-agent 事件存储。
|
|
11
|
+
* 每条 append/appendOrMergeOutput 调用会写入对应 agent 的环状缓冲区,
|
|
12
|
+
* 并返回 RingBufferEntry 供 scheduleEventPush 消费。
|
|
13
|
+
*/
|
|
14
|
+
class AgentEventStore {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.agents = new Map();
|
|
17
|
+
}
|
|
18
|
+
ensureBuffer(agentId) {
|
|
19
|
+
let entry = this.agents.get(agentId);
|
|
20
|
+
if (!entry) {
|
|
21
|
+
entry = { buffer: new RingBuffer(PER_AGENT_BUFFER_CAPACITY) };
|
|
22
|
+
this.agents.set(agentId, entry);
|
|
23
|
+
}
|
|
24
|
+
return entry.buffer;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 追加一条事件到指定 agent 的缓冲区。
|
|
28
|
+
* @returns 新创建的条目
|
|
29
|
+
*/
|
|
30
|
+
append(agentId, payload) {
|
|
31
|
+
return this.ensureBuffer(agentId).append(payload);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 追加一条 output 事件到指定 agent 的缓冲区。
|
|
35
|
+
* 若最后一条也是 output 且来自同一 session + sourceEventType,
|
|
36
|
+
* 则在 10s 窗口内合并内容。
|
|
37
|
+
* @returns 被合并或新创建的条目
|
|
38
|
+
*/
|
|
39
|
+
appendOrMergeOutput(agentId, payload) {
|
|
40
|
+
return this.ensureBuffer(agentId).appendOrMerge(payload, (lastEntry) => {
|
|
41
|
+
const last = lastEntry.data;
|
|
42
|
+
return (last.category === "output" &&
|
|
43
|
+
last.sessionId === payload.sessionId &&
|
|
44
|
+
last.sourceEventType === payload.sourceEventType &&
|
|
45
|
+
Date.now() - lastEntry.timestamp <= 10_000);
|
|
46
|
+
}, (lastData, newData) => {
|
|
47
|
+
const existingOutput = lastData.output || "";
|
|
48
|
+
const newOutput = newData.output || "";
|
|
49
|
+
const merged = existingOutput.includes(newOutput)
|
|
50
|
+
? existingOutput
|
|
51
|
+
: `${existingOutput}${newOutput}`;
|
|
52
|
+
return {
|
|
53
|
+
...lastData,
|
|
54
|
+
output: merged.length > 8000
|
|
55
|
+
? `${merged.slice(0, 8000)}...(truncated)`
|
|
56
|
+
: merged,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 获取指定 agent 的事件数量。
|
|
62
|
+
*/
|
|
63
|
+
size(agentId) {
|
|
64
|
+
return this.agents.get(agentId)?.buffer.size ?? 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** 全局单例 */
|
|
68
|
+
export const agentEventStore = new AgentEventStore();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 事件差量推送调度器
|
|
3
|
+
*
|
|
4
|
+
* 将 agent 事件缓冲区中的新事件差量推送到调度中心。
|
|
5
|
+
* 提供全局心跳调度和推送统计查询。
|
|
6
|
+
*/
|
|
7
|
+
import { type BridgeEventPayload } from "./agent-event-store.js";
|
|
8
|
+
import { type RingBufferEntry } from "./ring-buffer.js";
|
|
9
|
+
export interface RuntimeCallbackAuthOptions {
|
|
10
|
+
runtimeAccessToken?: string;
|
|
11
|
+
schedulerBaseUrl?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface PushStatEntry {
|
|
14
|
+
agentId: string;
|
|
15
|
+
pending: number;
|
|
16
|
+
success: number;
|
|
17
|
+
failure: number;
|
|
18
|
+
consecutiveFailures: number;
|
|
19
|
+
lastLatencyMs?: number;
|
|
20
|
+
lastError?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 调度一次差量推送:将 agent 的新事件推送到调度中心。
|
|
24
|
+
* 暂以单次 push 模式实现,后续可按需改为批量/定时 flush。
|
|
25
|
+
*/
|
|
26
|
+
export declare function scheduleEventPush(agentId: string, _entry: RingBufferEntry<BridgeEventPayload>, authOptions?: RuntimeCallbackAuthOptions): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* 启动全局心跳调度器。
|
|
29
|
+
* 每 30s 向调度中心发送空包,检测连接存活。
|
|
30
|
+
*/
|
|
31
|
+
export declare function startHeartbeatScheduler(): void;
|
|
32
|
+
/**
|
|
33
|
+
* 停止全局心跳调度器。
|
|
34
|
+
*/
|
|
35
|
+
export declare function stopHeartbeatScheduler(): void;
|
|
36
|
+
/**
|
|
37
|
+
* 返回所有 agent 的推送统计。
|
|
38
|
+
*/
|
|
39
|
+
export declare function getAllPushStats(): PushStatEntry[];
|
|
40
|
+
//# sourceMappingURL=event-delta-pusher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-delta-pusher.d.ts","sourceRoot":"","sources":["../../src/services/event-delta-pusher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKxD,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA0BD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,CAAC,kBAAkB,CAAC,EAC3C,WAAW,CAAC,EAAE,0BAA0B,GACvC,OAAO,CAAC,IAAI,CAAC,CAQf;AAOD;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAuB9C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C;AAaD;;GAEG;AACH,wBAAgB,eAAe,IAAI,aAAa,EAAE,CAcjD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 事件差量推送调度器
|
|
3
|
+
*
|
|
4
|
+
* 将 agent 事件缓冲区中的新事件差量推送到调度中心。
|
|
5
|
+
* 提供全局心跳调度和推送统计查询。
|
|
6
|
+
*/
|
|
7
|
+
import axios from "axios";
|
|
8
|
+
import { resolveSchedulerBaseUrl, resolveSchedulerBaseUrlFrom } from "../config.js";
|
|
9
|
+
import { agentEventStore } from "./agent-event-store.js";
|
|
10
|
+
import { getRuntimeAccessToken } from "./runtime-binding.js";
|
|
11
|
+
const pushStates = new Map();
|
|
12
|
+
function runtimeAuthHeaders(authOptions, callbackBaseUrl) {
|
|
13
|
+
const resolvedBaseUrl = callbackBaseUrl ?? resolveSchedulerBaseUrlFrom(authOptions?.schedulerBaseUrl).url;
|
|
14
|
+
const token = authOptions?.runtimeAccessToken ||
|
|
15
|
+
getRuntimeAccessToken(undefined, resolvedBaseUrl) ||
|
|
16
|
+
getRuntimeAccessToken();
|
|
17
|
+
return token ? { "X-Runtime-Token": token } : undefined;
|
|
18
|
+
}
|
|
19
|
+
// ── 差量推送 ─────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* 调度一次差量推送:将 agent 的新事件推送到调度中心。
|
|
22
|
+
* 暂以单次 push 模式实现,后续可按需改为批量/定时 flush。
|
|
23
|
+
*/
|
|
24
|
+
export async function scheduleEventPush(agentId, _entry, authOptions) {
|
|
25
|
+
// 当前实现为 placeholder — 事件已写入 agentEventStore 的 ring buffer,
|
|
26
|
+
// 调度中心可通过 /runtime/events/:agentId 端点拉取。
|
|
27
|
+
// 后续可演进为 WebSocket 实时推送或定时批量 flush。
|
|
28
|
+
// 此处仅记录统计信息,不做实际 HTTP 推送。
|
|
29
|
+
const state = getOrCreatePushState(agentId);
|
|
30
|
+
state.success++;
|
|
31
|
+
state.consecutiveFailures = 0;
|
|
32
|
+
}
|
|
33
|
+
// ── 全局心跳 ─────────────────────────────────────────────
|
|
34
|
+
let heartbeatTimer = null;
|
|
35
|
+
const HEARTBEAT_INTERVAL_MS = 30_000;
|
|
36
|
+
/**
|
|
37
|
+
* 启动全局心跳调度器。
|
|
38
|
+
* 每 30s 向调度中心发送空包,检测连接存活。
|
|
39
|
+
*/
|
|
40
|
+
export function startHeartbeatScheduler() {
|
|
41
|
+
if (heartbeatTimer)
|
|
42
|
+
return;
|
|
43
|
+
const baseUrl = resolveSchedulerBaseUrl().url;
|
|
44
|
+
heartbeatTimer = setInterval(async () => {
|
|
45
|
+
try {
|
|
46
|
+
const headers = runtimeAuthHeaders();
|
|
47
|
+
if (!headers)
|
|
48
|
+
return;
|
|
49
|
+
await axios.post(`${baseUrl}/api/runtime/callback/heartbeat`, { timestamp: Date.now() }, { headers, timeout: 5000 });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// 心跳失败仅记录,不阻塞
|
|
53
|
+
}
|
|
54
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
55
|
+
// 允许进程在 timer 存在时正常退出
|
|
56
|
+
if (heartbeatTimer && typeof heartbeatTimer === "object" && "unref" in heartbeatTimer) {
|
|
57
|
+
heartbeatTimer.unref();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 停止全局心跳调度器。
|
|
62
|
+
*/
|
|
63
|
+
export function stopHeartbeatScheduler() {
|
|
64
|
+
if (heartbeatTimer) {
|
|
65
|
+
clearInterval(heartbeatTimer);
|
|
66
|
+
heartbeatTimer = null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// ── 推送统计 ─────────────────────────────────────────────
|
|
70
|
+
function getOrCreatePushState(agentId) {
|
|
71
|
+
let state = pushStates.get(agentId);
|
|
72
|
+
if (!state) {
|
|
73
|
+
state = { success: 0, failure: 0, consecutiveFailures: 0 };
|
|
74
|
+
pushStates.set(agentId, state);
|
|
75
|
+
}
|
|
76
|
+
return state;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 返回所有 agent 的推送统计。
|
|
80
|
+
*/
|
|
81
|
+
export function getAllPushStats() {
|
|
82
|
+
const stats = [];
|
|
83
|
+
for (const [agentId, state] of pushStates) {
|
|
84
|
+
stats.push({
|
|
85
|
+
agentId,
|
|
86
|
+
pending: agentEventStore.size(agentId),
|
|
87
|
+
success: state.success,
|
|
88
|
+
failure: state.failure,
|
|
89
|
+
consecutiveFailures: state.consecutiveFailures,
|
|
90
|
+
lastLatencyMs: state.lastLatencyMs,
|
|
91
|
+
lastError: state.lastError,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return stats;
|
|
95
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件快照存储服务
|
|
3
|
+
*
|
|
4
|
+
* 借鉴 Claude Code fileHistory 的确定性整文件覆盖方案,替代 git stash 实现稳定快照。
|
|
5
|
+
* - 快照 = 工作区那一刻所有文件的内容哈希副本 + index.json 映射
|
|
6
|
+
* - 还原 = "先清后写"整文件覆盖,零冲突,幂等
|
|
7
|
+
* - 内容哈希去重:相同文件内容跨快照共享一份物理副本
|
|
8
|
+
*/
|
|
9
|
+
export interface SnapshotIndexEntry {
|
|
10
|
+
/** 备份文件名(= sha256(content).slice(0,16));null 表示快照时该文件不存在(占位) */
|
|
11
|
+
backupName: string;
|
|
12
|
+
size: number;
|
|
13
|
+
mtime: number;
|
|
14
|
+
mode: number;
|
|
15
|
+
}
|
|
16
|
+
export type SnapshotIndex = Record<string, SnapshotIndexEntry>;
|
|
17
|
+
export interface SnapshotMeta {
|
|
18
|
+
snapshotId: string;
|
|
19
|
+
workspacePath: string;
|
|
20
|
+
snapshotName: string;
|
|
21
|
+
triggerType: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
fileCount: number;
|
|
24
|
+
totalBytes: number;
|
|
25
|
+
workspaceHash: string;
|
|
26
|
+
}
|
|
27
|
+
export interface CreateSnapshotResult {
|
|
28
|
+
ok: boolean;
|
|
29
|
+
snapshotId: string;
|
|
30
|
+
snapshotKey: string;
|
|
31
|
+
fileCount: number;
|
|
32
|
+
totalBytes: number;
|
|
33
|
+
workspaceHash: string;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface RestoreSnapshotResult {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
filesRestored: number;
|
|
39
|
+
filesDeleted: number;
|
|
40
|
+
filesSkipped: number;
|
|
41
|
+
preRestoreSnapshotKey?: string;
|
|
42
|
+
error?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface SnapshotListItem {
|
|
45
|
+
snapshotId: string;
|
|
46
|
+
snapshotKey: string;
|
|
47
|
+
snapshotName: string;
|
|
48
|
+
triggerType: string;
|
|
49
|
+
createdAt: string;
|
|
50
|
+
fileCount: number;
|
|
51
|
+
totalBytes: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 创建工作区文件快照。
|
|
55
|
+
*
|
|
56
|
+
* 算法(借鉴 Claude Code fileHistoryMakeSnapshot):
|
|
57
|
+
* 1. 遍历工作区收集所有文件
|
|
58
|
+
* 2. 对每个文件计算内容哈希,拷贝到快照目录(去重)
|
|
59
|
+
* 3. 写入 index.json 和 meta.json
|
|
60
|
+
*/
|
|
61
|
+
export declare function createSnapshot(params: {
|
|
62
|
+
workspacePath: string;
|
|
63
|
+
snapshotId?: string;
|
|
64
|
+
snapshotName?: string;
|
|
65
|
+
triggerType?: string;
|
|
66
|
+
}): Promise<CreateSnapshotResult>;
|
|
67
|
+
/**
|
|
68
|
+
* 还原工作区到快照状态。
|
|
69
|
+
*
|
|
70
|
+
* 算法(借鉴 Claude Code applySnapshot):
|
|
71
|
+
* 1. 可选:还原前自动创建安全网快照(preRestoreBackup)
|
|
72
|
+
* 2. 读取目标快照 index.json
|
|
73
|
+
* 3. 删除工作区中"快照后新增"的文件
|
|
74
|
+
* 4. 从备份逐文件覆盖,内容相同则跳过
|
|
75
|
+
*/
|
|
76
|
+
export declare function restoreSnapshot(params: {
|
|
77
|
+
workspacePath: string;
|
|
78
|
+
snapshotKey: string;
|
|
79
|
+
preRestoreBackup?: boolean;
|
|
80
|
+
}): Promise<RestoreSnapshotResult>;
|
|
81
|
+
/**
|
|
82
|
+
* 列出指定工作区的所有快照
|
|
83
|
+
*/
|
|
84
|
+
export declare function listSnapshots(workspacePath: string): Promise<SnapshotListItem[]>;
|
|
85
|
+
/**
|
|
86
|
+
* 删除指定快照
|
|
87
|
+
*/
|
|
88
|
+
export declare function deleteSnapshot(snapshotKey: string): Promise<{
|
|
89
|
+
ok: boolean;
|
|
90
|
+
error?: string;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* 获取快照根目录(供诊断/调试使用)
|
|
94
|
+
*/
|
|
95
|
+
export declare function getSnapshotRootPath(): string;
|
|
96
|
+
//# sourceMappingURL=fileSnapshotStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileSnapshotStore.d.ts","sourceRoot":"","sources":["../../src/services/fileSnapshotStore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgDH,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AA+FD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAwHhC;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAgJjC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAuCtF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoElG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
|