@gt-fe/eap-runtime 0.0.8
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 +323 -0
- package/dist/api/handlers/index.d.ts +3 -0
- package/dist/api/handlers/index.js +4 -0
- package/dist/api/handlers/invoke.handler.d.ts +77 -0
- package/dist/api/handlers/invoke.handler.js +411 -0
- package/dist/api/handlers/messages.handler.d.ts +53 -0
- package/dist/api/handlers/messages.handler.js +80 -0
- package/dist/api/handlers/stream.handler.d.ts +92 -0
- package/dist/api/handlers/stream.handler.js +432 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +4 -0
- package/dist/api/middleware/auth.middleware.d.ts +96 -0
- package/dist/api/middleware/auth.middleware.js +158 -0
- package/dist/api/middleware/index.d.ts +1 -0
- package/dist/api/middleware/index.js +2 -0
- package/dist/api/routes/agent.routes.d.ts +44 -0
- package/dist/api/routes/agent.routes.js +204 -0
- package/dist/api/routes/index.d.ts +3 -0
- package/dist/api/routes/index.js +4 -0
- package/dist/api/routes/session.routes.d.ts +82 -0
- package/dist/api/routes/session.routes.js +169 -0
- package/dist/api/routes/task.routes.d.ts +75 -0
- package/dist/api/routes/task.routes.js +108 -0
- package/dist/checkpoint/checkpoint-serializer.d.ts +58 -0
- package/dist/checkpoint/checkpoint-serializer.js +81 -0
- package/dist/checkpoint/composite-checkpoint-saver.d.ts +42 -0
- package/dist/checkpoint/composite-checkpoint-saver.js +118 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.d.ts +65 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.js +12 -0
- package/dist/checkpoint/contracts/index.d.ts +1 -0
- package/dist/checkpoint/contracts/index.js +1 -0
- package/dist/checkpoint/file-checkpoint-saver.d.ts +19 -0
- package/dist/checkpoint/file-checkpoint-saver.js +98 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.d.ts +130 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.js +211 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.d.ts +14 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.js +46 -0
- package/dist/checkpoint/index.d.ts +16 -0
- package/dist/checkpoint/index.js +13 -0
- package/dist/checkpoint/mongo-checkpoint-saver.d.ts +38 -0
- package/dist/checkpoint/mongo-checkpoint-saver.js +56 -0
- package/dist/checkpoint/pg-checkpoint-saver.d.ts +59 -0
- package/dist/checkpoint/pg-checkpoint-saver.js +140 -0
- package/dist/checkpoint/redis-checkpoint-saver.d.ts +68 -0
- package/dist/checkpoint/redis-checkpoint-saver.js +173 -0
- package/dist/checkpoint/restore-checkpoint.d.ts +33 -0
- package/dist/checkpoint/restore-checkpoint.js +33 -0
- package/dist/common/agent-code.d.ts +10 -0
- package/dist/common/agent-code.js +12 -0
- package/dist/common/concurrency.d.ts +79 -0
- package/dist/common/concurrency.js +121 -0
- package/dist/common/health.d.ts +40 -0
- package/dist/common/health.js +37 -0
- package/dist/common/index.d.ts +5 -0
- package/dist/common/index.js +5 -0
- package/dist/common/logger.d.ts +34 -0
- package/dist/common/logger.js +38 -0
- package/dist/common/queue-consumer.d.ts +125 -0
- package/dist/common/queue-consumer.js +159 -0
- package/dist/common/trace-id.d.ts +2 -0
- package/dist/common/trace-id.js +8 -0
- package/dist/common/types.d.ts +104 -0
- package/dist/common/types.js +14 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/permission-checker.d.ts +10 -0
- package/dist/contracts/permission-checker.js +4 -0
- package/dist/contracts/trace-collector.d.ts +211 -0
- package/dist/contracts/trace-collector.js +13 -0
- package/dist/governance/governance-client.d.ts +38 -0
- package/dist/governance/governance-client.js +95 -0
- package/dist/governance/index.d.ts +7 -0
- package/dist/governance/index.js +5 -0
- package/dist/governance/permission-guard.d.ts +19 -0
- package/dist/governance/permission-guard.js +59 -0
- package/dist/graph/adapters/index.d.ts +3 -0
- package/dist/graph/adapters/index.js +3 -0
- package/dist/graph/adapters/langgraph-checkpointer.d.ts +40 -0
- package/dist/graph/adapters/langgraph-checkpointer.js +211 -0
- package/dist/graph/adapters/langgraph.adapter.d.ts +190 -0
- package/dist/graph/adapters/langgraph.adapter.js +1303 -0
- package/dist/graph/adapters/subgraph-compiler.d.ts +39 -0
- package/dist/graph/adapters/subgraph-compiler.js +248 -0
- package/dist/graph/condition-evaluator.d.ts +57 -0
- package/dist/graph/condition-evaluator.js +162 -0
- package/dist/graph/contracts/executable-graph.d.ts +340 -0
- package/dist/graph/contracts/executable-graph.js +10 -0
- package/dist/graph/contracts/index.d.ts +2 -0
- package/dist/graph/contracts/index.js +2 -0
- package/dist/graph/contracts/state-graph.contract.d.ts +76 -0
- package/dist/graph/contracts/state-graph.contract.js +11 -0
- package/dist/graph/hitl/hitl-handler.d.ts +199 -0
- package/dist/graph/hitl/hitl-handler.js +480 -0
- package/dist/graph/hitl/index.d.ts +1 -0
- package/dist/graph/hitl/index.js +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +7 -0
- package/dist/graph/nodes/index.d.ts +2 -0
- package/dist/graph/nodes/index.js +2 -0
- package/dist/graph/nodes/llm-node.d.ts +182 -0
- package/dist/graph/nodes/llm-node.js +281 -0
- package/dist/graph/nodes/skill-bind-node.d.ts +32 -0
- package/dist/graph/nodes/skill-bind-node.js +116 -0
- package/dist/graph/nodes/tool-node.d.ts +75 -0
- package/dist/graph/nodes/tool-node.js +324 -0
- package/dist/graph/resolve-graph-prompt.d.ts +5 -0
- package/dist/graph/resolve-graph-prompt.js +75 -0
- package/dist/graph/retry/budget-aware-retry.d.ts +91 -0
- package/dist/graph/retry/budget-aware-retry.js +126 -0
- package/dist/graph/retry/index.d.ts +9 -0
- package/dist/graph/retry/index.js +8 -0
- package/dist/graph/retry/node-retry.d.ts +123 -0
- package/dist/graph/retry/node-retry.js +235 -0
- package/dist/graph/skill-audit-recorder.d.ts +126 -0
- package/dist/graph/skill-audit-recorder.js +114 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +32 -0
- package/dist/memory/compression/compression-stats.d.ts +109 -0
- package/dist/memory/compression/compression-stats.js +144 -0
- package/dist/memory/compression/compression.repository.d.ts +62 -0
- package/dist/memory/compression/compression.repository.js +71 -0
- package/dist/memory/compression/index.d.ts +10 -0
- package/dist/memory/compression/index.js +15 -0
- package/dist/memory/compression/llm-summarize.d.ts +58 -0
- package/dist/memory/compression/llm-summarize.js +192 -0
- package/dist/memory/compression/sliding-window.compression.d.ts +60 -0
- package/dist/memory/compression/sliding-window.compression.js +175 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/long-term-memory.service.d.ts +94 -0
- package/dist/memory/long-term-memory.service.js +120 -0
- package/dist/memory/message-compression.service.d.ts +128 -0
- package/dist/memory/message-compression.service.js +69 -0
- package/dist/memory/pg-memory.repository.d.ts +44 -0
- package/dist/memory/pg-memory.repository.js +108 -0
- package/dist/memory/semantic-retrieval.service.d.ts +148 -0
- package/dist/memory/semantic-retrieval.service.js +238 -0
- package/dist/providers/echo-llm-provider.d.ts +10 -0
- package/dist/providers/echo-llm-provider.js +87 -0
- package/dist/providers/http-llm-provider.d.ts +35 -0
- package/dist/providers/http-llm-provider.js +404 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/local-llm-provider.d.ts +27 -0
- package/dist/providers/local-llm-provider.js +105 -0
- package/dist/providers/resolve-llm-model.d.ts +13 -0
- package/dist/providers/resolve-llm-model.js +30 -0
- package/dist/providers/routing-llm-provider.d.ts +28 -0
- package/dist/providers/routing-llm-provider.js +79 -0
- package/dist/registry/agent-models.d.ts +1 -0
- package/dist/registry/agent-models.js +1 -0
- package/dist/registry/agent-registry-client.d.ts +56 -0
- package/dist/registry/agent-registry-client.js +36 -0
- package/dist/registry/definition-cache.d.ts +37 -0
- package/dist/registry/definition-cache.js +82 -0
- package/dist/registry/deployment-snapshot.d.ts +99 -0
- package/dist/registry/deployment-snapshot.js +542 -0
- package/dist/registry/graph-loader.d.ts +134 -0
- package/dist/registry/graph-loader.js +985 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.js +9 -0
- package/dist/registry/preload-errors.d.ts +13 -0
- package/dist/registry/preload-errors.js +35 -0
- package/dist/registry/preload-flags.d.ts +22 -0
- package/dist/registry/preload-flags.js +44 -0
- package/dist/registry/skill-io-guard.d.ts +25 -0
- package/dist/registry/skill-io-guard.js +98 -0
- package/dist/registry/skill-tree.d.ts +27 -0
- package/dist/registry/skill-tree.js +183 -0
- package/dist/runtime/agent-runtime.d.ts +106 -0
- package/dist/runtime/agent-runtime.js +777 -0
- package/dist/runtime/dev-runtime.d.ts +69 -0
- package/dist/runtime/dev-runtime.js +199 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/storage-profile.d.ts +50 -0
- package/dist/runtime/storage-profile.js +138 -0
- package/dist/runtime/types.d.ts +120 -0
- package/dist/runtime/types.js +9 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.js +161 -0
- package/dist/session/compression-middleware.d.ts +126 -0
- package/dist/session/compression-middleware.js +230 -0
- package/dist/session/file-message.repository.d.ts +25 -0
- package/dist/session/file-message.repository.js +78 -0
- package/dist/session/file-session.repository.d.ts +72 -0
- package/dist/session/file-session.repository.js +212 -0
- package/dist/session/index.d.ts +13 -0
- package/dist/session/index.js +12 -0
- package/dist/session/message.service.d.ts +80 -0
- package/dist/session/message.service.js +128 -0
- package/dist/session/persist-turn-messages.d.ts +145 -0
- package/dist/session/persist-turn-messages.js +325 -0
- package/dist/session/pg-message.repository.d.ts +49 -0
- package/dist/session/pg-message.repository.js +149 -0
- package/dist/session/pg-session.repository.d.ts +46 -0
- package/dist/session/pg-session.repository.js +117 -0
- package/dist/session/session-context.service.d.ts +49 -0
- package/dist/session/session-context.service.js +66 -0
- package/dist/session/session.service.d.ts +194 -0
- package/dist/session/session.service.js +166 -0
- package/dist/sse/connection-event-logger.d.ts +21 -0
- package/dist/sse/connection-event-logger.js +33 -0
- package/dist/sse/contracts/index.d.ts +1 -0
- package/dist/sse/contracts/index.js +1 -0
- package/dist/sse/contracts/sse-emitter.contract.d.ts +74 -0
- package/dist/sse/contracts/sse-emitter.contract.js +11 -0
- package/dist/sse/event-buffer.d.ts +20 -0
- package/dist/sse/event-buffer.js +45 -0
- package/dist/sse/events/code-events.d.ts +19 -0
- package/dist/sse/events/code-events.js +9 -0
- package/dist/sse/events/collaboration-events.d.ts +37 -0
- package/dist/sse/events/collaboration-events.js +11 -0
- package/dist/sse/events/connection-events.d.ts +13 -0
- package/dist/sse/events/connection-events.js +9 -0
- package/dist/sse/events/file-events.d.ts +29 -0
- package/dist/sse/events/file-events.js +10 -0
- package/dist/sse/events/hitl-events.d.ts +33 -0
- package/dist/sse/events/hitl-events.js +10 -0
- package/dist/sse/events/index.d.ts +107 -0
- package/dist/sse/events/index.js +96 -0
- package/dist/sse/events/plan-events.d.ts +38 -0
- package/dist/sse/events/plan-events.js +11 -0
- package/dist/sse/events/reasoning-events.d.ts +35 -0
- package/dist/sse/events/reasoning-events.js +13 -0
- package/dist/sse/events/response-events.d.ts +25 -0
- package/dist/sse/events/response-events.js +12 -0
- package/dist/sse/events/session-events.d.ts +43 -0
- package/dist/sse/events/session-events.js +12 -0
- package/dist/sse/events/skill-events.d.ts +48 -0
- package/dist/sse/events/skill-events.js +11 -0
- package/dist/sse/events/stats-events.d.ts +44 -0
- package/dist/sse/events/stats-events.js +12 -0
- package/dist/sse/events/tool-events.d.ts +68 -0
- package/dist/sse/events/tool-events.js +14 -0
- package/dist/sse/index.d.ts +8 -0
- package/dist/sse/index.js +8 -0
- package/dist/sse/sse-connection-manager.d.ts +116 -0
- package/dist/sse/sse-connection-manager.js +185 -0
- package/dist/sse/sse-emitter.d.ts +108 -0
- package/dist/sse/sse-emitter.js +210 -0
- package/dist/sse/sse-heartbeat.d.ts +58 -0
- package/dist/sse/sse-heartbeat.js +76 -0
- package/dist/sse/trace-collector.d.ts +60 -0
- package/dist/sse/trace-collector.js +107 -0
- package/dist/task/contracts/index.d.ts +2 -0
- package/dist/task/contracts/index.js +1 -0
- package/dist/task/contracts/task-manager.contract.d.ts +160 -0
- package/dist/task/contracts/task-manager.contract.js +10 -0
- package/dist/task/index.d.ts +7 -0
- package/dist/task/index.js +5 -0
- package/dist/task/pg-task.repository.d.ts +47 -0
- package/dist/task/pg-task.repository.js +131 -0
- package/dist/task/task-progress-tracker.d.ts +67 -0
- package/dist/task/task-progress-tracker.js +80 -0
- package/dist/task/task-timeout.d.ts +70 -0
- package/dist/task/task-timeout.js +116 -0
- package/dist/task/task.service.d.ts +84 -0
- package/dist/task/task.service.js +233 -0
- package/dist/token/compression-budget-integration.d.ts +145 -0
- package/dist/token/compression-budget-integration.js +185 -0
- package/dist/token/context-window-budget.d.ts +113 -0
- package/dist/token/context-window-budget.js +134 -0
- package/dist/token/contracts/index.d.ts +1 -0
- package/dist/token/contracts/index.js +1 -0
- package/dist/token/contracts/token-budget.contract.d.ts +77 -0
- package/dist/token/contracts/token-budget.contract.js +11 -0
- package/dist/token/index.d.ts +12 -0
- package/dist/token/index.js +10 -0
- package/dist/token/pg-token-budget.repository.d.ts +39 -0
- package/dist/token/pg-token-budget.repository.js +116 -0
- package/dist/token/session-budget-checker.d.ts +54 -0
- package/dist/token/session-budget-checker.js +72 -0
- package/dist/token/token-budget-guard.d.ts +66 -0
- package/dist/token/token-budget-guard.js +97 -0
- package/dist/token/token-budget.service.d.ts +86 -0
- package/dist/token/token-budget.service.js +130 -0
- package/dist/token/token-detail-mode.d.ts +73 -0
- package/dist/token/token-detail-mode.js +107 -0
- package/dist/token/token-estimator.d.ts +80 -0
- package/dist/token/token-estimator.js +134 -0
- package/dist/token/token-stats.service.d.ts +88 -0
- package/dist/token/token-stats.service.js +94 -0
- package/dist/tool/create-tool-executor.d.ts +33 -0
- package/dist/tool/create-tool-executor.js +60 -0
- package/dist/tool/dev-http-executor.d.ts +18 -0
- package/dist/tool/dev-http-executor.js +96 -0
- package/dist/tool/dev-mcp-executor.d.ts +29 -0
- package/dist/tool/dev-mcp-executor.js +84 -0
- package/dist/tool/dev-tool-executor.d.ts +23 -0
- package/dist/tool/dev-tool-executor.js +55 -0
- package/dist/tool/file-artifact.d.ts +11 -0
- package/dist/tool/file-artifact.js +90 -0
- package/dist/tool/http-tool-executor.d.ts +17 -0
- package/dist/tool/http-tool-executor.js +158 -0
- package/dist/tool/index.d.ts +18 -0
- package/dist/tool/index.js +17 -0
- package/dist/tool/loaded-tool-definition.d.ts +35 -0
- package/dist/tool/loaded-tool-definition.js +9 -0
- package/dist/tool/local-mcp-client.d.ts +23 -0
- package/dist/tool/local-mcp-client.js +225 -0
- package/dist/tool/local-tool-executor.d.ts +37 -0
- package/dist/tool/local-tool-executor.js +249 -0
- package/dist/tool/mcp-tool-executor.d.ts +23 -0
- package/dist/tool/mcp-tool-executor.js +160 -0
- package/dist/tool/mock-tool-executor.d.ts +28 -0
- package/dist/tool/mock-tool-executor.js +65 -0
- package/dist/tool/system-prompt-builder.d.ts +114 -0
- package/dist/tool/system-prompt-builder.js +213 -0
- package/dist/tool/tool-confirmation.d.ts +29 -0
- package/dist/tool/tool-confirmation.js +81 -0
- package/dist/tool/tool-event-emitter.d.ts +58 -0
- package/dist/tool/tool-event-emitter.js +154 -0
- package/dist/tool/tool-execution-router.d.ts +25 -0
- package/dist/tool/tool-execution-router.js +50 -0
- package/dist/tool/tool-executor.interface.d.ts +85 -0
- package/dist/tool/tool-executor.interface.js +7 -0
- package/dist/tool/tool-orchestrator.d.ts +22 -0
- package/dist/tool/tool-orchestrator.js +104 -0
- package/dist/tool/tool-result-injector.d.ts +64 -0
- package/dist/tool/tool-result-injector.js +65 -0
- package/dist/utils/format-error.d.ts +4 -0
- package/dist/utils/format-error.js +4 -0
- package/dist/utils/http-error.d.ts +11 -0
- package/dist/utils/http-error.js +24 -0
- package/package.json +56 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresTaskRepository — Task 持久化 PostgreSQL 实现
|
|
3
|
+
*
|
|
4
|
+
* 基于 pg 连接池实现 ITaskRepository 接口。
|
|
5
|
+
* JSON 字段(input, output, token_usage)使用 JSONB 类型存储。
|
|
6
|
+
* 支持审计字段和软删除。
|
|
7
|
+
*
|
|
8
|
+
* @see design.md §1.3 数据模型 — tasks 表
|
|
9
|
+
* @see task.service.ts ITaskRepository 接口定义
|
|
10
|
+
*/
|
|
11
|
+
import type { TaskRecord } from './contracts/task-manager.contract.js';
|
|
12
|
+
import type { ITaskRepository } from './task.service.js';
|
|
13
|
+
/** pg Pool 抽象接口 */
|
|
14
|
+
export interface IPgPool {
|
|
15
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
|
|
16
|
+
rows: T[];
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export declare class PostgresTaskRepository implements ITaskRepository {
|
|
20
|
+
private readonly pool;
|
|
21
|
+
constructor(pool: IPgPool);
|
|
22
|
+
/**
|
|
23
|
+
* INSERT task record with all fields including audit fields
|
|
24
|
+
*/
|
|
25
|
+
save(task: TaskRecord): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* SELECT task by id, deserialize JSON fields
|
|
28
|
+
* Excludes soft-deleted records
|
|
29
|
+
*/
|
|
30
|
+
findById(id: string): Promise<TaskRecord | null>;
|
|
31
|
+
/**
|
|
32
|
+
* UPDATE all mutable fields by id
|
|
33
|
+
*/
|
|
34
|
+
update(task: TaskRecord): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Soft delete task
|
|
37
|
+
*/
|
|
38
|
+
softDelete(id: string, deletedBy: string): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* 将 PostgreSQL 行数据转换为 TaskRecord
|
|
41
|
+
*/
|
|
42
|
+
private rowToRecord;
|
|
43
|
+
/**
|
|
44
|
+
* 解析 JSON 字段 — pg 可能已自动解析 JSONB 列,也可能返回字符串
|
|
45
|
+
*/
|
|
46
|
+
private parseJson;
|
|
47
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgresTaskRepository — Task 持久化 PostgreSQL 实现
|
|
3
|
+
*
|
|
4
|
+
* 基于 pg 连接池实现 ITaskRepository 接口。
|
|
5
|
+
* JSON 字段(input, output, token_usage)使用 JSONB 类型存储。
|
|
6
|
+
* 支持审计字段和软删除。
|
|
7
|
+
*
|
|
8
|
+
* @see design.md §1.3 数据模型 — tasks 表
|
|
9
|
+
* @see task.service.ts ITaskRepository 接口定义
|
|
10
|
+
*/
|
|
11
|
+
// ─────────────────────────────────────────────
|
|
12
|
+
// PostgresTaskRepository
|
|
13
|
+
// ─────────────────────────────────────────────
|
|
14
|
+
export class PostgresTaskRepository {
|
|
15
|
+
pool;
|
|
16
|
+
constructor(pool) {
|
|
17
|
+
this.pool = pool;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* INSERT task record with all fields including audit fields
|
|
21
|
+
*/
|
|
22
|
+
async save(task) {
|
|
23
|
+
const sql = `
|
|
24
|
+
INSERT INTO tasks (id, agent_id, session_id, user_id, correlation_id, input, output, status, trace_id, token_usage, cost, started_at, completed_at, created_by, created_at, updated_by, updated_at)
|
|
25
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)
|
|
26
|
+
`;
|
|
27
|
+
await this.pool.query(sql, [
|
|
28
|
+
task.id,
|
|
29
|
+
task.agentId,
|
|
30
|
+
task.sessionId,
|
|
31
|
+
task.userId,
|
|
32
|
+
task.correlationId,
|
|
33
|
+
JSON.stringify(task.input),
|
|
34
|
+
task.output != null ? JSON.stringify(task.output) : null,
|
|
35
|
+
task.status,
|
|
36
|
+
task.traceId,
|
|
37
|
+
JSON.stringify(task.tokenUsage),
|
|
38
|
+
task.cost,
|
|
39
|
+
task.startedAt,
|
|
40
|
+
task.completedAt,
|
|
41
|
+
task.createdBy || 'system',
|
|
42
|
+
task.createdAt,
|
|
43
|
+
task.updatedBy || 'system',
|
|
44
|
+
task.updatedAt,
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* SELECT task by id, deserialize JSON fields
|
|
49
|
+
* Excludes soft-deleted records
|
|
50
|
+
*/
|
|
51
|
+
async findById(id) {
|
|
52
|
+
const sql = `SELECT * FROM tasks WHERE id = $1 AND is_deleted = FALSE`;
|
|
53
|
+
const { rows } = await this.pool.query(sql, [id]);
|
|
54
|
+
if (rows.length === 0) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
return this.rowToRecord(rows[0]);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* UPDATE all mutable fields by id
|
|
61
|
+
*/
|
|
62
|
+
async update(task) {
|
|
63
|
+
const sql = `
|
|
64
|
+
UPDATE tasks
|
|
65
|
+
SET output = $1, status = $2, trace_id = $3, token_usage = $4, cost = $5, started_at = $6, completed_at = $7, updated_by = $8, updated_at = $9
|
|
66
|
+
WHERE id = $10 AND is_deleted = FALSE
|
|
67
|
+
`;
|
|
68
|
+
await this.pool.query(sql, [
|
|
69
|
+
task.output != null ? JSON.stringify(task.output) : null,
|
|
70
|
+
task.status,
|
|
71
|
+
task.traceId,
|
|
72
|
+
JSON.stringify(task.tokenUsage),
|
|
73
|
+
task.cost,
|
|
74
|
+
task.startedAt,
|
|
75
|
+
task.completedAt,
|
|
76
|
+
task.updatedBy || 'system',
|
|
77
|
+
task.updatedAt,
|
|
78
|
+
task.id,
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Soft delete task
|
|
83
|
+
*/
|
|
84
|
+
async softDelete(id, deletedBy) {
|
|
85
|
+
const sql = `
|
|
86
|
+
UPDATE tasks
|
|
87
|
+
SET is_deleted = TRUE, deleted_by = $1, deleted_at = NOW()
|
|
88
|
+
WHERE id = $2 AND is_deleted = FALSE
|
|
89
|
+
`;
|
|
90
|
+
await this.pool.query(sql, [deletedBy, id]);
|
|
91
|
+
}
|
|
92
|
+
// ─────────────────────────────────────────────
|
|
93
|
+
// Private Helpers
|
|
94
|
+
// ─────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* 将 PostgreSQL 行数据转换为 TaskRecord
|
|
97
|
+
*/
|
|
98
|
+
rowToRecord(row) {
|
|
99
|
+
return {
|
|
100
|
+
id: row.id,
|
|
101
|
+
agentId: row.agent_id,
|
|
102
|
+
sessionId: row.session_id,
|
|
103
|
+
userId: row.user_id,
|
|
104
|
+
correlationId: row.correlation_id,
|
|
105
|
+
input: this.parseJson(row.input),
|
|
106
|
+
output: row.output != null ? this.parseJson(row.output) : null,
|
|
107
|
+
status: row.status,
|
|
108
|
+
traceId: row.trace_id,
|
|
109
|
+
tokenUsage: this.parseJson(row.token_usage),
|
|
110
|
+
cost: parseFloat(String(row.cost)),
|
|
111
|
+
startedAt: row.started_at ? row.started_at.toISOString() : null,
|
|
112
|
+
completedAt: row.completed_at ? row.completed_at.toISOString() : null,
|
|
113
|
+
createdBy: row.created_by,
|
|
114
|
+
createdAt: row.created_at.toISOString(),
|
|
115
|
+
updatedBy: row.updated_by,
|
|
116
|
+
updatedAt: row.updated_at.toISOString(),
|
|
117
|
+
isDeleted: row.is_deleted,
|
|
118
|
+
deletedBy: row.deleted_by,
|
|
119
|
+
deletedAt: row.deleted_at?.toISOString(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 解析 JSON 字段 — pg 可能已自动解析 JSONB 列,也可能返回字符串
|
|
124
|
+
*/
|
|
125
|
+
parseJson(value) {
|
|
126
|
+
if (typeof value === 'string') {
|
|
127
|
+
return JSON.parse(value);
|
|
128
|
+
}
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskProgressTracker — 长任务细粒度进度跟踪
|
|
3
|
+
*
|
|
4
|
+
* 支持两种进度模式:
|
|
5
|
+
* 1. 显式设置:调用方直接 updateProgress(taskId, progress)
|
|
6
|
+
* 2. 基于 Graph 节点:根据已完成节点 / 总节点数自动计算
|
|
7
|
+
*
|
|
8
|
+
* 当没有显式进度时,TaskService.getStatus() 回退到基于状态的粗粒度计算。
|
|
9
|
+
*
|
|
10
|
+
* @see requirements.md Requirement 7 AC5
|
|
11
|
+
* @see design.md §1.1 长任务支持
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* 单个 Task 的进度信息
|
|
15
|
+
*/
|
|
16
|
+
export interface TaskProgressInfo {
|
|
17
|
+
/** 当前进度百分比 (0-100) */
|
|
18
|
+
progress: number;
|
|
19
|
+
/** 已完成的节点数 */
|
|
20
|
+
completedNodes: number;
|
|
21
|
+
/** 总节点数 */
|
|
22
|
+
totalNodes: number;
|
|
23
|
+
/** 最后更新时间 (ISO 8601) */
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* TaskProgressTracker — 内存进度跟踪器
|
|
28
|
+
*
|
|
29
|
+
* 用于 Graph 执行过程中跟踪任务进度,供 getStatus() 返回细粒度进度。
|
|
30
|
+
*/
|
|
31
|
+
export declare class TaskProgressTracker {
|
|
32
|
+
private readonly progressMap;
|
|
33
|
+
/**
|
|
34
|
+
* 设置显式进度百分比
|
|
35
|
+
*
|
|
36
|
+
* @param taskId - Task ID
|
|
37
|
+
* @param progress - 进度百分比 (0-100),会被 clamp 到合法范围
|
|
38
|
+
*/
|
|
39
|
+
updateProgress(taskId: string, progress: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* 基于 Graph 节点执行进度更新
|
|
42
|
+
*
|
|
43
|
+
* 根据 completedNodes / totalNodes 自动计算百分比。
|
|
44
|
+
*
|
|
45
|
+
* @param taskId - Task ID
|
|
46
|
+
* @param completedNodes - 已完成的节点数
|
|
47
|
+
* @param totalNodes - Graph 中总节点数
|
|
48
|
+
*/
|
|
49
|
+
updateNodeProgress(taskId: string, completedNodes: number, totalNodes: number): void;
|
|
50
|
+
/**
|
|
51
|
+
* 获取 Task 的进度信息
|
|
52
|
+
*
|
|
53
|
+
* @param taskId - Task ID
|
|
54
|
+
* @returns 进度信息,若未跟踪则返回 null
|
|
55
|
+
*/
|
|
56
|
+
getProgress(taskId: string): TaskProgressInfo | null;
|
|
57
|
+
/**
|
|
58
|
+
* 移除 Task 的进度跟踪(Task 结束后清理)
|
|
59
|
+
*
|
|
60
|
+
* @param taskId - Task ID
|
|
61
|
+
*/
|
|
62
|
+
removeProgress(taskId: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* 清空所有进度跟踪数据(测试用)
|
|
65
|
+
*/
|
|
66
|
+
clear(): void;
|
|
67
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskProgressTracker — 长任务细粒度进度跟踪
|
|
3
|
+
*
|
|
4
|
+
* 支持两种进度模式:
|
|
5
|
+
* 1. 显式设置:调用方直接 updateProgress(taskId, progress)
|
|
6
|
+
* 2. 基于 Graph 节点:根据已完成节点 / 总节点数自动计算
|
|
7
|
+
*
|
|
8
|
+
* 当没有显式进度时,TaskService.getStatus() 回退到基于状态的粗粒度计算。
|
|
9
|
+
*
|
|
10
|
+
* @see requirements.md Requirement 7 AC5
|
|
11
|
+
* @see design.md §1.1 长任务支持
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* TaskProgressTracker — 内存进度跟踪器
|
|
15
|
+
*
|
|
16
|
+
* 用于 Graph 执行过程中跟踪任务进度,供 getStatus() 返回细粒度进度。
|
|
17
|
+
*/
|
|
18
|
+
export class TaskProgressTracker {
|
|
19
|
+
progressMap = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* 设置显式进度百分比
|
|
22
|
+
*
|
|
23
|
+
* @param taskId - Task ID
|
|
24
|
+
* @param progress - 进度百分比 (0-100),会被 clamp 到合法范围
|
|
25
|
+
*/
|
|
26
|
+
updateProgress(taskId, progress) {
|
|
27
|
+
const clamped = Math.max(0, Math.min(100, progress));
|
|
28
|
+
const existing = this.progressMap.get(taskId);
|
|
29
|
+
this.progressMap.set(taskId, {
|
|
30
|
+
progress: clamped,
|
|
31
|
+
completedNodes: existing?.completedNodes ?? 0,
|
|
32
|
+
totalNodes: existing?.totalNodes ?? 0,
|
|
33
|
+
updatedAt: new Date().toISOString(),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 基于 Graph 节点执行进度更新
|
|
38
|
+
*
|
|
39
|
+
* 根据 completedNodes / totalNodes 自动计算百分比。
|
|
40
|
+
*
|
|
41
|
+
* @param taskId - Task ID
|
|
42
|
+
* @param completedNodes - 已完成的节点数
|
|
43
|
+
* @param totalNodes - Graph 中总节点数
|
|
44
|
+
*/
|
|
45
|
+
updateNodeProgress(taskId, completedNodes, totalNodes) {
|
|
46
|
+
if (totalNodes <= 0) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const progress = Math.round((completedNodes / totalNodes) * 100);
|
|
50
|
+
this.progressMap.set(taskId, {
|
|
51
|
+
progress: Math.max(0, Math.min(100, progress)),
|
|
52
|
+
completedNodes,
|
|
53
|
+
totalNodes,
|
|
54
|
+
updatedAt: new Date().toISOString(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 获取 Task 的进度信息
|
|
59
|
+
*
|
|
60
|
+
* @param taskId - Task ID
|
|
61
|
+
* @returns 进度信息,若未跟踪则返回 null
|
|
62
|
+
*/
|
|
63
|
+
getProgress(taskId) {
|
|
64
|
+
return this.progressMap.get(taskId) ?? null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 移除 Task 的进度跟踪(Task 结束后清理)
|
|
68
|
+
*
|
|
69
|
+
* @param taskId - Task ID
|
|
70
|
+
*/
|
|
71
|
+
removeProgress(taskId) {
|
|
72
|
+
this.progressMap.delete(taskId);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 清空所有进度跟踪数据(测试用)
|
|
76
|
+
*/
|
|
77
|
+
clear() {
|
|
78
|
+
this.progressMap.clear();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskTimeoutManager — Task 超时检测管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理 Task 执行超时:
|
|
5
|
+
* - 当 Task 进入 running 状态时启动计时器
|
|
6
|
+
* - 超时触发时通过 onTimeout 回调标记 Task 为 timeout 并终止 Graph 执行
|
|
7
|
+
* - 使用 AbortController/AbortSignal 模式传递取消信号
|
|
8
|
+
*
|
|
9
|
+
* @see design.md §1.1 任务管理 — Task级超时
|
|
10
|
+
* @see requirements.md Requirement 7 AC4
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* TaskTimeoutManager 配置选项
|
|
14
|
+
*/
|
|
15
|
+
export interface TaskTimeoutManagerOptions {
|
|
16
|
+
/** 默认超时时间(毫秒),默认 60000 (60s) */
|
|
17
|
+
defaultTimeoutMs?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* TaskTimeoutManager — 管理 running 状态 Task 的超时计时器
|
|
21
|
+
*
|
|
22
|
+
* 使用方式:
|
|
23
|
+
* 1. Task 进入 running 时调用 startTimer() 启动倒计时
|
|
24
|
+
* 2. Task 正常完成时调用 clearTimer() 取消倒计时
|
|
25
|
+
* 3. 超时触发时执行 onTimeout 回调(标记 task 为 timeout + abort graph)
|
|
26
|
+
* 4. 服务关停时调用 dispose() 清理所有活跃计时器
|
|
27
|
+
*/
|
|
28
|
+
export declare class TaskTimeoutManager {
|
|
29
|
+
private readonly entries;
|
|
30
|
+
private readonly defaultTimeoutMs;
|
|
31
|
+
constructor(options?: TaskTimeoutManagerOptions);
|
|
32
|
+
/**
|
|
33
|
+
* 启动超时计时器
|
|
34
|
+
*
|
|
35
|
+
* @param taskId - Task ID
|
|
36
|
+
* @param timeoutMs - 超时时间(毫秒),若不传则使用默认值。上限 3600s。
|
|
37
|
+
* @param onTimeout - 超时触发时执行的回调(应标记 task 状态并终止 graph)
|
|
38
|
+
* @returns AbortSignal,供 Graph 执行引擎监听取消信号
|
|
39
|
+
* @throws 如果该 taskId 已存在活跃计时器
|
|
40
|
+
*/
|
|
41
|
+
startTimer(taskId: string, timeoutMs: number | undefined, onTimeout: () => Promise<void>): AbortSignal;
|
|
42
|
+
/**
|
|
43
|
+
* 取消超时计时器(Task 正常完成时调用)
|
|
44
|
+
*
|
|
45
|
+
* @param taskId - Task ID
|
|
46
|
+
* @returns true 表示成功取消,false 表示该 taskId 无活跃计时器
|
|
47
|
+
*/
|
|
48
|
+
clearTimer(taskId: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 获取指定 Task 的 AbortSignal(用于后续关联 Graph 执行取消)
|
|
51
|
+
*
|
|
52
|
+
* @param taskId - Task ID
|
|
53
|
+
* @returns AbortSignal 或 undefined(若无活跃计时器)
|
|
54
|
+
*/
|
|
55
|
+
getAbortSignal(taskId: string): AbortSignal | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* 检查指定 Task 是否有活跃的超时计时器
|
|
58
|
+
*/
|
|
59
|
+
hasTimer(taskId: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* 获取当前活跃计时器数量
|
|
62
|
+
*/
|
|
63
|
+
get activeCount(): number;
|
|
64
|
+
/**
|
|
65
|
+
* 清理所有活跃计时器(graceful shutdown 时调用)
|
|
66
|
+
*
|
|
67
|
+
* 不会触发 onTimeout 回调,仅取消定时器和 abort 信号。
|
|
68
|
+
*/
|
|
69
|
+
dispose(): void;
|
|
70
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskTimeoutManager — Task 超时检测管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理 Task 执行超时:
|
|
5
|
+
* - 当 Task 进入 running 状态时启动计时器
|
|
6
|
+
* - 超时触发时通过 onTimeout 回调标记 Task 为 timeout 并终止 Graph 执行
|
|
7
|
+
* - 使用 AbortController/AbortSignal 模式传递取消信号
|
|
8
|
+
*
|
|
9
|
+
* @see design.md §1.1 任务管理 — Task级超时
|
|
10
|
+
* @see requirements.md Requirement 7 AC4
|
|
11
|
+
*/
|
|
12
|
+
// ─────────────────────────────────────────────
|
|
13
|
+
// Default Constants
|
|
14
|
+
// ─────────────────────────────────────────────
|
|
15
|
+
/** 默认超时:60 秒 */
|
|
16
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
17
|
+
/** 最大允许超时:3600 秒(1 小时) */
|
|
18
|
+
const MAX_TIMEOUT_MS = 3_600_000;
|
|
19
|
+
// ─────────────────────────────────────────────
|
|
20
|
+
// TaskTimeoutManager
|
|
21
|
+
// ─────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* TaskTimeoutManager — 管理 running 状态 Task 的超时计时器
|
|
24
|
+
*
|
|
25
|
+
* 使用方式:
|
|
26
|
+
* 1. Task 进入 running 时调用 startTimer() 启动倒计时
|
|
27
|
+
* 2. Task 正常完成时调用 clearTimer() 取消倒计时
|
|
28
|
+
* 3. 超时触发时执行 onTimeout 回调(标记 task 为 timeout + abort graph)
|
|
29
|
+
* 4. 服务关停时调用 dispose() 清理所有活跃计时器
|
|
30
|
+
*/
|
|
31
|
+
export class TaskTimeoutManager {
|
|
32
|
+
entries = new Map();
|
|
33
|
+
defaultTimeoutMs;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.defaultTimeoutMs = options?.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 启动超时计时器
|
|
39
|
+
*
|
|
40
|
+
* @param taskId - Task ID
|
|
41
|
+
* @param timeoutMs - 超时时间(毫秒),若不传则使用默认值。上限 3600s。
|
|
42
|
+
* @param onTimeout - 超时触发时执行的回调(应标记 task 状态并终止 graph)
|
|
43
|
+
* @returns AbortSignal,供 Graph 执行引擎监听取消信号
|
|
44
|
+
* @throws 如果该 taskId 已存在活跃计时器
|
|
45
|
+
*/
|
|
46
|
+
startTimer(taskId, timeoutMs, onTimeout) {
|
|
47
|
+
if (this.entries.has(taskId)) {
|
|
48
|
+
throw new Error(`Timeout timer already exists for task '${taskId}'. Call clearTimer() first.`);
|
|
49
|
+
}
|
|
50
|
+
const effectiveTimeout = Math.min(Math.max(timeoutMs ?? this.defaultTimeoutMs, 0), MAX_TIMEOUT_MS);
|
|
51
|
+
const abortController = new AbortController();
|
|
52
|
+
const timer = setTimeout(() => {
|
|
53
|
+
// 超时触发:abort signal + 执行回调
|
|
54
|
+
abortController.abort(new Error(`Task '${taskId}' timed out after ${effectiveTimeout}ms`));
|
|
55
|
+
this.entries.delete(taskId);
|
|
56
|
+
// 触发外部回调(fire-and-forget,错误不应阻塞清理)
|
|
57
|
+
void onTimeout().catch(() => {
|
|
58
|
+
// onTimeout 回调的错误由调用方处理,这里静默忽略
|
|
59
|
+
});
|
|
60
|
+
}, effectiveTimeout);
|
|
61
|
+
// 防止 timer 阻止进程退出
|
|
62
|
+
if (timer.unref) {
|
|
63
|
+
timer.unref();
|
|
64
|
+
}
|
|
65
|
+
this.entries.set(taskId, { timer, abortController });
|
|
66
|
+
return abortController.signal;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 取消超时计时器(Task 正常完成时调用)
|
|
70
|
+
*
|
|
71
|
+
* @param taskId - Task ID
|
|
72
|
+
* @returns true 表示成功取消,false 表示该 taskId 无活跃计时器
|
|
73
|
+
*/
|
|
74
|
+
clearTimer(taskId) {
|
|
75
|
+
const entry = this.entries.get(taskId);
|
|
76
|
+
if (!entry) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
clearTimeout(entry.timer);
|
|
80
|
+
this.entries.delete(taskId);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 获取指定 Task 的 AbortSignal(用于后续关联 Graph 执行取消)
|
|
85
|
+
*
|
|
86
|
+
* @param taskId - Task ID
|
|
87
|
+
* @returns AbortSignal 或 undefined(若无活跃计时器)
|
|
88
|
+
*/
|
|
89
|
+
getAbortSignal(taskId) {
|
|
90
|
+
return this.entries.get(taskId)?.abortController.signal;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 检查指定 Task 是否有活跃的超时计时器
|
|
94
|
+
*/
|
|
95
|
+
hasTimer(taskId) {
|
|
96
|
+
return this.entries.has(taskId);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 获取当前活跃计时器数量
|
|
100
|
+
*/
|
|
101
|
+
get activeCount() {
|
|
102
|
+
return this.entries.size;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 清理所有活跃计时器(graceful shutdown 时调用)
|
|
106
|
+
*
|
|
107
|
+
* 不会触发 onTimeout 回调,仅取消定时器和 abort 信号。
|
|
108
|
+
*/
|
|
109
|
+
dispose() {
|
|
110
|
+
for (const [taskId, entry] of this.entries) {
|
|
111
|
+
clearTimeout(entry.timer);
|
|
112
|
+
entry.abortController.abort(new Error(`TaskTimeoutManager disposed, task '${taskId}' aborted`));
|
|
113
|
+
}
|
|
114
|
+
this.entries.clear();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskService — ITaskManager 实现
|
|
3
|
+
*
|
|
4
|
+
* 管理 Task 生命周期:创建、状态流转、查询、Token消耗记录、进度跟踪。
|
|
5
|
+
* v1 使用 in-memory Map 存储,后续由 TaskRepository 替换。
|
|
6
|
+
*
|
|
7
|
+
* @see task-manager.contract.ts
|
|
8
|
+
* @see requirements.md Requirement 7 AC1-AC5
|
|
9
|
+
*/
|
|
10
|
+
import type { TaskStatus } from '../common/types.js';
|
|
11
|
+
import type { CreateTaskParams, ITaskManager, TaskRecord, TaskStatusInfo, TokenUsageRecord } from './contracts/task-manager.contract.js';
|
|
12
|
+
import { TaskProgressTracker } from './task-progress-tracker.js';
|
|
13
|
+
export type { CreateTaskParams, ITaskManager, TaskRecord, TaskStatusInfo, TokenUsageRecord };
|
|
14
|
+
/**
|
|
15
|
+
* ITaskRepository — Task 持久化接口
|
|
16
|
+
*
|
|
17
|
+
* TaskService 通过此接口访问存储层,默认使用 InMemoryTaskRepository。
|
|
18
|
+
* Task 3.2 将提供 MySQL 实现。
|
|
19
|
+
*/
|
|
20
|
+
export interface ITaskRepository {
|
|
21
|
+
save(task: TaskRecord): Promise<void>;
|
|
22
|
+
findById(id: string): Promise<TaskRecord | null>;
|
|
23
|
+
update(task: TaskRecord): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* InMemoryTaskRepository — 内存存储实现
|
|
27
|
+
*
|
|
28
|
+
* 用于开发/测试阶段,后续替换为 MySQL 实现。
|
|
29
|
+
*/
|
|
30
|
+
export declare class InMemoryTaskRepository implements ITaskRepository {
|
|
31
|
+
private readonly store;
|
|
32
|
+
save(task: TaskRecord): Promise<void>;
|
|
33
|
+
findById(id: string): Promise<TaskRecord | null>;
|
|
34
|
+
update(task: TaskRecord): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
export declare class TaskService implements ITaskManager {
|
|
37
|
+
private readonly repository;
|
|
38
|
+
private readonly progressTracker;
|
|
39
|
+
constructor(repository?: ITaskRepository, progressTracker?: TaskProgressTracker);
|
|
40
|
+
/**
|
|
41
|
+
* 获取内部 progressTracker 实例(供 Graph 引擎更新节点进度)
|
|
42
|
+
*/
|
|
43
|
+
getProgressTracker(): TaskProgressTracker;
|
|
44
|
+
/**
|
|
45
|
+
* 创建新 Task,初始状态为 pending
|
|
46
|
+
*/
|
|
47
|
+
create(params: CreateTaskParams): Promise<TaskRecord>;
|
|
48
|
+
/**
|
|
49
|
+
* 获取完整 Task 记录(供 AgentRuntime.resumeHitl / fork 使用)
|
|
50
|
+
*/
|
|
51
|
+
getTask(taskId: string): Promise<TaskRecord | null>;
|
|
52
|
+
/**
|
|
53
|
+
* 更新 Task 状态
|
|
54
|
+
*
|
|
55
|
+
* 验证状态流转合法性,设置时间戳:
|
|
56
|
+
* - pending→running: 设置 startedAt
|
|
57
|
+
* - running→终态: 设置 completedAt 和 output
|
|
58
|
+
*/
|
|
59
|
+
updateStatus(taskId: string, status: TaskStatus, output?: unknown): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* 仅当当前状态为 `from` 时流转。并发下 timeout/resume 抢占时返回 false,不抛错。
|
|
62
|
+
*/
|
|
63
|
+
tryUpdateStatus(taskId: string, from: TaskStatus, to: TaskStatus, output?: unknown): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* 获取 Task 当前状态信息(供轮询使用)
|
|
66
|
+
*
|
|
67
|
+
* 优先返回 progressTracker 中的显式进度,回退到基于状态的粗粒度计算。
|
|
68
|
+
*/
|
|
69
|
+
getStatus(taskId: string): Promise<TaskStatusInfo>;
|
|
70
|
+
/**
|
|
71
|
+
* 记录一次 Token 消耗,累加到 Task 的 tokenUsage 和 cost
|
|
72
|
+
*/
|
|
73
|
+
recordTokenUsage(taskId: string, usage: TokenUsageRecord): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* 更新 Task 执行进度(用于长任务轮询)
|
|
76
|
+
*
|
|
77
|
+
* 进度值会被 clamp 到 0-100 范围。仅 running 状态的 Task 可更新进度。
|
|
78
|
+
*/
|
|
79
|
+
updateProgress(taskId: string, progress: number): Promise<void>;
|
|
80
|
+
private findTaskOrThrow;
|
|
81
|
+
private isValidTransition;
|
|
82
|
+
private calculateProgress;
|
|
83
|
+
private calculateDuration;
|
|
84
|
+
}
|