@coralai/sps-cli 0.49.16 → 0.50.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.
- package/dist/commands/cardAdd.d.ts.map +1 -1
- package/dist/commands/cardAdd.js +47 -67
- package/dist/commands/cardAdd.js.map +1 -1
- package/dist/commands/cardMarkComplete.js +1 -1
- package/dist/commands/cardMarkComplete.js.map +1 -1
- package/dist/commands/cardMarkStarted.js +1 -1
- package/dist/commands/cardMarkStarted.js.map +1 -1
- package/dist/commands/consoleCommand.js +3 -3
- package/dist/commands/consoleCommand.js.map +1 -1
- package/dist/commands/hookCommand.d.ts +25 -0
- package/dist/commands/hookCommand.d.ts.map +1 -1
- package/dist/commands/hookCommand.js +2 -2
- package/dist/commands/hookCommand.js.map +1 -1
- package/dist/console/index.d.ts +15 -0
- package/dist/console/index.d.ts.map +1 -0
- package/dist/console/index.js +177 -0
- package/dist/console/index.js.map +1 -0
- package/dist/console/lib/lockFile.d.ts +17 -0
- package/dist/console/lib/lockFile.d.ts.map +1 -0
- package/dist/console/lib/lockFile.js +61 -0
- package/dist/console/lib/lockFile.js.map +1 -0
- package/dist/console/lib/portPicker.d.ts +3 -0
- package/dist/console/lib/portPicker.d.ts.map +1 -0
- package/dist/console/lib/portPicker.js +25 -0
- package/dist/console/lib/portPicker.js.map +1 -0
- package/dist/console/lib/resultToJson.d.ts +18 -0
- package/dist/console/lib/resultToJson.d.ts.map +1 -0
- package/dist/console/lib/resultToJson.js +19 -0
- package/dist/console/lib/resultToJson.js.map +1 -0
- package/dist/console/routes/cards.d.ts +26 -0
- package/dist/console/routes/cards.d.ts.map +1 -0
- package/dist/console/routes/cards.js +85 -0
- package/dist/console/routes/cards.js.map +1 -0
- package/dist/console/routes/chat.d.ts +36 -0
- package/dist/console/routes/chat.d.ts.map +1 -0
- package/dist/console/routes/chat.js +458 -0
- package/dist/console/routes/chat.js.map +1 -0
- package/dist/console/routes/logs.d.ts +17 -0
- package/dist/console/routes/logs.d.ts.map +1 -0
- package/dist/console/routes/logs.js +159 -0
- package/dist/console/routes/logs.js.map +1 -0
- package/dist/console/routes/pipeline.d.ts +10 -0
- package/dist/console/routes/pipeline.d.ts.map +1 -0
- package/dist/console/routes/pipeline.js +39 -0
- package/dist/console/routes/pipeline.js.map +1 -0
- package/dist/console/routes/projects.d.ts +15 -0
- package/dist/console/routes/projects.d.ts.map +1 -0
- package/dist/console/routes/projects.js +132 -0
- package/dist/console/routes/projects.js.map +1 -0
- package/dist/console/routes/skills.d.ts +4 -0
- package/dist/console/routes/skills.d.ts.map +1 -0
- package/dist/console/routes/skills.js +91 -0
- package/dist/console/routes/skills.js.map +1 -0
- package/dist/console/routes/system.d.ts +7 -0
- package/dist/console/routes/system.d.ts.map +1 -0
- package/dist/console/routes/system.js +288 -0
- package/dist/console/routes/system.js.map +1 -0
- package/dist/console/routes/workers.d.ts +5 -0
- package/dist/console/routes/workers.d.ts.map +1 -0
- package/dist/console/routes/workers.js +149 -0
- package/dist/console/routes/workers.js.map +1 -0
- package/dist/console/sse/eventBus.d.ts +25 -0
- package/dist/console/sse/eventBus.d.ts.map +1 -0
- package/dist/console/sse/eventBus.js +32 -0
- package/dist/console/sse/eventBus.js.map +1 -0
- package/dist/console/sse/projectStream.d.ts +13 -0
- package/dist/console/sse/projectStream.d.ts.map +1 -0
- package/dist/console/sse/projectStream.js +84 -0
- package/dist/console/sse/projectStream.js.map +1 -0
- package/dist/infra/chokidarWatchers.d.ts +38 -0
- package/dist/infra/chokidarWatchers.d.ts.map +1 -0
- package/dist/infra/chokidarWatchers.js +213 -0
- package/dist/infra/chokidarWatchers.js.map +1 -0
- package/dist/infra/clock.d.ts +35 -0
- package/dist/infra/clock.d.ts.map +1 -0
- package/dist/infra/clock.js +45 -0
- package/dist/infra/clock.js.map +1 -0
- package/dist/infra/filesystem.d.ts +89 -0
- package/dist/infra/filesystem.d.ts.map +1 -0
- package/dist/infra/filesystem.js +247 -0
- package/dist/infra/filesystem.js.map +1 -0
- package/dist/infra/spawn.d.ts +67 -0
- package/dist/infra/spawn.d.ts.map +1 -0
- package/dist/infra/spawn.js +116 -0
- package/dist/infra/spawn.js.map +1 -0
- package/dist/infra/sseBus.d.ts +36 -0
- package/dist/infra/sseBus.d.ts.map +1 -0
- package/dist/infra/sseBus.js +72 -0
- package/dist/infra/sseBus.js.map +1 -0
- package/dist/interfaces/ACPClient.d.ts +1 -1
- package/dist/interfaces/ACPClient.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/providers/LocalACPClient.d.ts +1 -1
- package/dist/providers/LocalACPClient.d.ts.map +1 -1
- package/dist/services/CardService.d.ts +86 -0
- package/dist/services/CardService.d.ts.map +1 -0
- package/dist/services/CardService.js +313 -0
- package/dist/services/CardService.js.map +1 -0
- package/dist/services/ChatService.d.ts +62 -0
- package/dist/services/ChatService.d.ts.map +1 -0
- package/dist/services/ChatService.js +157 -0
- package/dist/services/ChatService.js.map +1 -0
- package/dist/services/LogService.d.ts +46 -0
- package/dist/services/LogService.d.ts.map +1 -0
- package/dist/services/LogService.js +185 -0
- package/dist/services/LogService.js.map +1 -0
- package/dist/services/PipelineService.d.ts +71 -0
- package/dist/services/PipelineService.d.ts.map +1 -0
- package/dist/services/PipelineService.js +349 -0
- package/dist/services/PipelineService.js.map +1 -0
- package/dist/services/ProjectService.d.ts +105 -0
- package/dist/services/ProjectService.d.ts.map +1 -0
- package/dist/services/ProjectService.js +346 -0
- package/dist/services/ProjectService.js.map +1 -0
- package/dist/services/SkillService.d.ts +38 -0
- package/dist/services/SkillService.d.ts.map +1 -0
- package/dist/services/SkillService.js +301 -0
- package/dist/services/SkillService.js.map +1 -0
- package/dist/services/WorkerService.d.ts +83 -0
- package/dist/services/WorkerService.d.ts.map +1 -0
- package/dist/services/WorkerService.js +262 -0
- package/dist/services/WorkerService.js.map +1 -0
- package/dist/services/container.d.ts +47 -0
- package/dist/services/container.d.ts.map +1 -0
- package/dist/services/container.js +77 -0
- package/dist/services/container.js.map +1 -0
- package/dist/services/defaults.d.ts +15 -0
- package/dist/services/defaults.d.ts.map +1 -0
- package/dist/services/defaults.js +11 -0
- package/dist/services/defaults.js.map +1 -0
- package/dist/services/executors.d.ts +38 -0
- package/dist/services/executors.d.ts.map +1 -0
- package/dist/services/executors.js +157 -0
- package/dist/services/executors.js.map +1 -0
- package/dist/services/ports.d.ts +17 -0
- package/dist/services/ports.d.ts.map +1 -0
- package/dist/services/ports.js +2 -0
- package/dist/services/ports.js.map +1 -0
- package/dist/shared/domainEvents.d.ts +118 -0
- package/dist/shared/domainEvents.d.ts.map +1 -0
- package/dist/shared/domainEvents.js +40 -0
- package/dist/shared/domainEvents.js.map +1 -0
- package/dist/shared/errors.d.ts +59 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +79 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/result.d.ts +51 -0
- package/dist/shared/result.d.ts.map +1 -0
- package/dist/shared/result.js +48 -0
- package/dist/shared/result.js.map +1 -0
- package/dist/shared/runtimePaths.d.ts +78 -0
- package/dist/shared/runtimePaths.d.ts.map +1 -0
- package/dist/shared/runtimePaths.js +179 -0
- package/dist/shared/runtimePaths.js.map +1 -0
- package/dist/shared/runtimeSchemas.d.ts +324 -0
- package/dist/shared/runtimeSchemas.d.ts.map +1 -0
- package/dist/shared/runtimeSchemas.js +124 -0
- package/dist/shared/runtimeSchemas.js.map +1 -0
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared/errors
|
|
3
|
+
* @description DomainError —— 所有 Service 层错误的统一结构
|
|
4
|
+
*
|
|
5
|
+
* @layer shared
|
|
6
|
+
*
|
|
7
|
+
* Delivery 层(CLI / HTTP)负责翻译 DomainError 到各自输出格式:
|
|
8
|
+
* - HTTP:toHttpStatus + problem+json body
|
|
9
|
+
* - CLI:toExitCode + stderr 渲染
|
|
10
|
+
*
|
|
11
|
+
* Domain 层允许正常抛 Error;Service 层捕获后转 DomainError。
|
|
12
|
+
*/
|
|
13
|
+
export type DomainErrorKind =
|
|
14
|
+
/** 资源不存在 —— HTTP 404 / CLI exit 1 */
|
|
15
|
+
'not-found'
|
|
16
|
+
/** etag 冲突 / 状态冲突 / 并发竞争 —— HTTP 409 / CLI exit 1 */
|
|
17
|
+
| 'conflict'
|
|
18
|
+
/** 入参非法(格式、schema 违反)—— HTTP 422 / CLI exit 2 */
|
|
19
|
+
| 'validation'
|
|
20
|
+
/** 前置条件不满足(业务规则阻挡)—— HTTP 409 / CLI exit 2 */
|
|
21
|
+
| 'precondition'
|
|
22
|
+
/** 外部系统错误(Git 失败 / npm registry 不通)—— HTTP 502 / CLI exit 3 */
|
|
23
|
+
| 'external'
|
|
24
|
+
/** 未知内部错误 —— HTTP 500 / CLI exit 1 */
|
|
25
|
+
| 'internal';
|
|
26
|
+
export interface DomainError {
|
|
27
|
+
readonly kind: DomainErrorKind;
|
|
28
|
+
/** 机读码(全大写 + 下划线),便于 i18n / 客户端分支。 */
|
|
29
|
+
readonly code: string;
|
|
30
|
+
/** 人读消息(默认中文),展示给终端用户。 */
|
|
31
|
+
readonly message: string;
|
|
32
|
+
/** 结构化上下文 —— 不含大对象 / 不含敏感数据。 */
|
|
33
|
+
readonly details?: Readonly<Record<string, unknown>>;
|
|
34
|
+
/** 原始异常 —— 仅日志 / debug 用,不暴露给客户端。 */
|
|
35
|
+
readonly cause?: unknown;
|
|
36
|
+
}
|
|
37
|
+
/** 构造 DomainError 的 factory(避免到处写 `{ kind, code, message }` 字面量)。 */
|
|
38
|
+
export declare function domainError(kind: DomainErrorKind, code: string, message: string, extra?: {
|
|
39
|
+
details?: Record<string, unknown>;
|
|
40
|
+
cause?: unknown;
|
|
41
|
+
}): DomainError;
|
|
42
|
+
/** HTTP status code 映射 —— Console route 层用。 */
|
|
43
|
+
export declare function toHttpStatus(e: DomainError): number;
|
|
44
|
+
/** CLI exit code 映射 —— CLI command 层用。 */
|
|
45
|
+
export declare function toExitCode(e: DomainError): number;
|
|
46
|
+
/**
|
|
47
|
+
* 翻译为 application/problem+json(RFC 7807 兼容 shape)。
|
|
48
|
+
* Delivery 层的 HTTP 响应体用。
|
|
49
|
+
*/
|
|
50
|
+
export interface ProblemJson {
|
|
51
|
+
type: string;
|
|
52
|
+
title: string;
|
|
53
|
+
status: number;
|
|
54
|
+
detail: string;
|
|
55
|
+
code: string;
|
|
56
|
+
[k: string]: unknown;
|
|
57
|
+
}
|
|
58
|
+
export declare function toProblemJson(e: DomainError): ProblemJson;
|
|
59
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,eAAe;AACzB,qCAAqC;AACnC,WAAW;AACb,qDAAqD;GACnD,UAAU;AACZ,iDAAiD;GAC/C,YAAY;AACd,8CAA8C;GAC5C,cAAc;AAChB,+DAA+D;GAC7D,UAAU;AACZ,sCAAsC;GACpC,UAAU,CAAC;AAEf,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,qCAAqC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qEAAqE;AACrE,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,WAAW,CAQb;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAcnD;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAYjD;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CASzD"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared/errors
|
|
3
|
+
* @description DomainError —— 所有 Service 层错误的统一结构
|
|
4
|
+
*
|
|
5
|
+
* @layer shared
|
|
6
|
+
*
|
|
7
|
+
* Delivery 层(CLI / HTTP)负责翻译 DomainError 到各自输出格式:
|
|
8
|
+
* - HTTP:toHttpStatus + problem+json body
|
|
9
|
+
* - CLI:toExitCode + stderr 渲染
|
|
10
|
+
*
|
|
11
|
+
* Domain 层允许正常抛 Error;Service 层捕获后转 DomainError。
|
|
12
|
+
*/
|
|
13
|
+
/** 构造 DomainError 的 factory(避免到处写 `{ kind, code, message }` 字面量)。 */
|
|
14
|
+
export function domainError(kind, code, message, extra = {}) {
|
|
15
|
+
return {
|
|
16
|
+
kind,
|
|
17
|
+
code,
|
|
18
|
+
message,
|
|
19
|
+
...(extra.details ? { details: extra.details } : {}),
|
|
20
|
+
...(extra.cause !== undefined ? { cause: extra.cause } : {}),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** HTTP status code 映射 —— Console route 层用。 */
|
|
24
|
+
export function toHttpStatus(e) {
|
|
25
|
+
switch (e.kind) {
|
|
26
|
+
case 'not-found':
|
|
27
|
+
return 404;
|
|
28
|
+
case 'conflict':
|
|
29
|
+
case 'precondition':
|
|
30
|
+
return 409;
|
|
31
|
+
case 'validation':
|
|
32
|
+
return 422;
|
|
33
|
+
case 'external':
|
|
34
|
+
return 502;
|
|
35
|
+
case 'internal':
|
|
36
|
+
return 500;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** CLI exit code 映射 —— CLI command 层用。 */
|
|
40
|
+
export function toExitCode(e) {
|
|
41
|
+
switch (e.kind) {
|
|
42
|
+
case 'validation':
|
|
43
|
+
case 'precondition':
|
|
44
|
+
return 2;
|
|
45
|
+
case 'external':
|
|
46
|
+
return 3;
|
|
47
|
+
case 'not-found':
|
|
48
|
+
case 'conflict':
|
|
49
|
+
case 'internal':
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function toProblemJson(e) {
|
|
54
|
+
return {
|
|
55
|
+
type: e.kind,
|
|
56
|
+
title: titleFor(e.kind),
|
|
57
|
+
status: toHttpStatus(e),
|
|
58
|
+
detail: e.message,
|
|
59
|
+
code: e.code,
|
|
60
|
+
...(e.details ? { details: e.details } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function titleFor(kind) {
|
|
64
|
+
switch (kind) {
|
|
65
|
+
case 'not-found':
|
|
66
|
+
return 'Not Found';
|
|
67
|
+
case 'conflict':
|
|
68
|
+
return 'Conflict';
|
|
69
|
+
case 'precondition':
|
|
70
|
+
return 'Precondition Failed';
|
|
71
|
+
case 'validation':
|
|
72
|
+
return 'Validation Error';
|
|
73
|
+
case 'external':
|
|
74
|
+
return 'External Service Error';
|
|
75
|
+
case 'internal':
|
|
76
|
+
return 'Internal Error';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA4BH,qEAAqE;AACrE,MAAM,UAAU,WAAW,CACzB,IAAqB,EACrB,IAAY,EACZ,OAAe,EACf,QAAgE,EAAE;IAElE,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAC,CAAc;IACzC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,GAAG,CAAC;QACb,KAAK,UAAU,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,GAAG,CAAC;QACb,KAAK,YAAY;YACf,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,UAAU,CAAC,CAAc;IACvC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,CAAC,CAAC;QACX,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;QACX,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAeD,MAAM,UAAU,aAAa,CAAC,CAAc;IAC1C,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACvB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,IAAqB;IACrC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,cAAc;YACjB,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,kBAAkB,CAAC;QAC5B,KAAK,UAAU;YACb,OAAO,wBAAwB,CAAC;QAClC,KAAK,UAAU;YACb,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared/result
|
|
3
|
+
* @description Result<T, E> —— Service 层约定返回的容器类型
|
|
4
|
+
*
|
|
5
|
+
* @layer shared
|
|
6
|
+
*
|
|
7
|
+
* Service 方法不抛业务异常 —— 用 Result 表达"成功 + 值"或"失败 + 结构化错误"。
|
|
8
|
+
* `throw` 保留给真正的系统问题(OOM / 断言违反 / 库 panic)。
|
|
9
|
+
*/
|
|
10
|
+
import type { DomainError } from './errors.js';
|
|
11
|
+
export type Result<T, E = DomainError> = {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
readonly value: T;
|
|
14
|
+
} | {
|
|
15
|
+
readonly ok: false;
|
|
16
|
+
readonly error: E;
|
|
17
|
+
};
|
|
18
|
+
/** 包装成功结果。 */
|
|
19
|
+
export declare function ok<T>(value: T): Result<T, never>;
|
|
20
|
+
/** 包装失败结果。 */
|
|
21
|
+
export declare function err<E>(error: E): Result<never, E>;
|
|
22
|
+
/** 类型守卫:Result 是 Ok? */
|
|
23
|
+
export declare function isOk<T, E>(r: Result<T, E>): r is {
|
|
24
|
+
ok: true;
|
|
25
|
+
value: T;
|
|
26
|
+
};
|
|
27
|
+
/** 类型守卫:Result 是 Err? */
|
|
28
|
+
export declare function isErr<T, E>(r: Result<T, E>): r is {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: E;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* 成功时 map 值;失败时原样传递。
|
|
34
|
+
* 不改变 error 类型。
|
|
35
|
+
*/
|
|
36
|
+
export declare function mapOk<T, U, E>(r: Result<T, E>, f: (t: T) => U): Result<U, E>;
|
|
37
|
+
/**
|
|
38
|
+
* 失败时 map 错误;成功时原样传递。
|
|
39
|
+
*/
|
|
40
|
+
export declare function mapErr<T, E, F>(r: Result<T, E>, f: (e: E) => F): Result<T, F>;
|
|
41
|
+
/**
|
|
42
|
+
* 对 Ok 执行会返回 Result 的下一步(链式)。
|
|
43
|
+
* 任一步失败短路。
|
|
44
|
+
*/
|
|
45
|
+
export declare function andThen<T, U, E>(r: Result<T, E>, f: (t: T) => Promise<Result<U, E>>): Promise<Result<U, E>>;
|
|
46
|
+
/**
|
|
47
|
+
* 取 Ok 值,不是 Ok 就抛 —— 仅用于测试 / 边界场景。
|
|
48
|
+
* 生产代码应该用 isOk + 分支处理。
|
|
49
|
+
*/
|
|
50
|
+
export declare function unwrap<T, E>(r: Result<T, E>, ctx?: string): T;
|
|
51
|
+
//# sourceMappingURL=result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/shared/result.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,IACjC;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9C,cAAc;AACd,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAEhD;AAED,cAAc;AACd,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAEjD;AAED,wBAAwB;AACxB,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAEvE;AAED,yBAAyB;AACzB,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAEzE;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAE7E;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAEvB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAM7D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** 包装成功结果。 */
|
|
2
|
+
export function ok(value) {
|
|
3
|
+
return { ok: true, value };
|
|
4
|
+
}
|
|
5
|
+
/** 包装失败结果。 */
|
|
6
|
+
export function err(error) {
|
|
7
|
+
return { ok: false, error };
|
|
8
|
+
}
|
|
9
|
+
/** 类型守卫:Result 是 Ok? */
|
|
10
|
+
export function isOk(r) {
|
|
11
|
+
return r.ok;
|
|
12
|
+
}
|
|
13
|
+
/** 类型守卫:Result 是 Err? */
|
|
14
|
+
export function isErr(r) {
|
|
15
|
+
return !r.ok;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 成功时 map 值;失败时原样传递。
|
|
19
|
+
* 不改变 error 类型。
|
|
20
|
+
*/
|
|
21
|
+
export function mapOk(r, f) {
|
|
22
|
+
return r.ok ? ok(f(r.value)) : r;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 失败时 map 错误;成功时原样传递。
|
|
26
|
+
*/
|
|
27
|
+
export function mapErr(r, f) {
|
|
28
|
+
return r.ok ? r : err(f(r.error));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 对 Ok 执行会返回 Result 的下一步(链式)。
|
|
32
|
+
* 任一步失败短路。
|
|
33
|
+
*/
|
|
34
|
+
export async function andThen(r, f) {
|
|
35
|
+
return r.ok ? await f(r.value) : r;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 取 Ok 值,不是 Ok 就抛 —— 仅用于测试 / 边界场景。
|
|
39
|
+
* 生产代码应该用 isOk + 分支处理。
|
|
40
|
+
*/
|
|
41
|
+
export function unwrap(r, ctx) {
|
|
42
|
+
if (!r.ok) {
|
|
43
|
+
const prefix = ctx ? `${ctx}: ` : '';
|
|
44
|
+
throw new Error(`${prefix}unwrap on Err: ${JSON.stringify(r.error)}`);
|
|
45
|
+
}
|
|
46
|
+
return r.value;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/shared/result.ts"],"names":[],"mappings":"AAeA,cAAc;AACd,MAAM,UAAU,EAAE,CAAI,KAAQ;IAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED,cAAc;AACd,MAAM,UAAU,GAAG,CAAI,KAAQ;IAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,IAAI,CAAO,CAAe;IACxC,OAAO,CAAC,CAAC,EAAE,CAAC;AACd,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,KAAK,CAAO,CAAe;IACzC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAU,CAAe,EAAE,CAAc;IAC5D,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAU,CAAe,EAAE,CAAc;IAC7D,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,CAAe,EACf,CAAkC;IAElC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAO,CAAe,EAAE,GAAY;IACxD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,kBAAkB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 读 HOME —— 每次调用都重读环境变量,方便测试 mock。
|
|
3
|
+
* 缺 HOME 立即抛 —— 这是严重配置错误,别 silently fallback。
|
|
4
|
+
*/
|
|
5
|
+
export declare function home(): string;
|
|
6
|
+
/** $HOME/.coral —— SPS 数据根目录 */
|
|
7
|
+
export declare function coralRoot(): string;
|
|
8
|
+
/** $HOME/.coral/console.lock —— Console 单实例锁文件 */
|
|
9
|
+
export declare function consoleLockFile(): string;
|
|
10
|
+
/** $HOME/.coral/env —— 全局环境变量文件 */
|
|
11
|
+
export declare function globalEnvFile(): string;
|
|
12
|
+
/** $HOME/.coral/sessions —— chat daemon unix socket 所在目录 */
|
|
13
|
+
export declare function sessionsDir(): string;
|
|
14
|
+
/** $HOME/.coral/chat-sessions —— chat 会话持久化目录 */
|
|
15
|
+
export declare function chatSessionsDir(): string;
|
|
16
|
+
/** $HOME/.coral/skills —— user-level skills */
|
|
17
|
+
export declare function userSkillsDir(): string;
|
|
18
|
+
/** $HOME/.coral/projects —— 项目根目录 */
|
|
19
|
+
export declare function projectsDir(): string;
|
|
20
|
+
/** $HOME/.coral/projects/<name> */
|
|
21
|
+
export declare function projectDir(project: string): string;
|
|
22
|
+
/** $HOME/.coral/projects/<name>/conf */
|
|
23
|
+
export declare function projectConfFile(project: string): string;
|
|
24
|
+
/** $HOME/.coral/projects/<name>/runtime */
|
|
25
|
+
export declare function runtimeDir(project: string): string;
|
|
26
|
+
/** $HOME/.coral/projects/<name>/runtime/state.json —— RuntimeStore 权威状态 */
|
|
27
|
+
export declare function stateFile(project: string): string;
|
|
28
|
+
/** $HOME/.coral/projects/<name>/runtime/supervisor.pid —— tick 进程 pid */
|
|
29
|
+
export declare function supervisorPidFile(project: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Worker marker 物理文件路径。
|
|
32
|
+
* @param project 项目名
|
|
33
|
+
* @param slotName slot 的完整字符串名(如 "worker-1"),不是数字
|
|
34
|
+
* @returns $HOME/.coral/projects/<project>/runtime/worker-<slotName>-current.json
|
|
35
|
+
* 即 worker-worker-N-current.json(双前缀)
|
|
36
|
+
*/
|
|
37
|
+
export declare function workerMarkerFile(project: string, slotName: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* 把数字 slot 转成 slotName("worker-<N>")—— 约定俗成。
|
|
40
|
+
* 当 UI / 外部 API 传数字时用这个规范化。
|
|
41
|
+
*/
|
|
42
|
+
export declare function slotNameFromNumber(slot: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* Worker marker 文件名的正则 —— 识别 runtime 目录里属于 marker 的文件。
|
|
45
|
+
* 匹配两种格式(兼容老数据):
|
|
46
|
+
* worker-worker-<N>-current.json ← 现在的实际格式(slotName="worker-N")
|
|
47
|
+
* worker-<N>-current.json ← 老兼容
|
|
48
|
+
* Capture group 1 是数字 slot(字符串形式)。
|
|
49
|
+
*/
|
|
50
|
+
export declare const WorkerMarkerFilenameRe: RegExp;
|
|
51
|
+
/**
|
|
52
|
+
* 从文件名抽 slot 数字。非 marker 文件名返 null。
|
|
53
|
+
*/
|
|
54
|
+
export declare function slotFromMarkerFilename(filename: string): number | null;
|
|
55
|
+
/** $HOME/.coral/projects/<name>/cards */
|
|
56
|
+
export declare function cardsDir(project: string): string;
|
|
57
|
+
/** $HOME/.coral/projects/<name>/cards/seq.txt —— 自增序列 */
|
|
58
|
+
export declare function cardsSeqFile(project: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* $HOME/.coral/projects/<name>/cards/<state-lower-snake>
|
|
61
|
+
* state 做小写 + 非字母数字替成 '-' 的正规化(和 MarkdownTaskBackend 保持一致)。
|
|
62
|
+
*/
|
|
63
|
+
export declare function cardsStateDir(project: string, state: string): string;
|
|
64
|
+
/** $HOME/.coral/projects/<name>/logs */
|
|
65
|
+
export declare function logsDir(project: string): string;
|
|
66
|
+
/** pipeline-<YYYY-MM-DD>.log 文件名 pattern */
|
|
67
|
+
export declare const PipelineLogFilenameRe: RegExp;
|
|
68
|
+
/** worker-<N> 标签在日志行里出现的 pattern,用于过滤 */
|
|
69
|
+
export declare function workerLogLineTag(slot: number): string;
|
|
70
|
+
/** $HOME/.coral/projects/<name>/pipelines */
|
|
71
|
+
export declare function pipelinesDir(project: string): string;
|
|
72
|
+
/** $HOME/.coral/projects/<name>/pipelines/project.yaml —— 活动 pipeline */
|
|
73
|
+
export declare function activePipelineFile(project: string): string;
|
|
74
|
+
/** 命名具体某个 pipeline yaml 文件 */
|
|
75
|
+
export declare function pipelineFile(project: string, filename: string): string;
|
|
76
|
+
/** pipeline yaml 文件名白名单正则 —— 防路径穿越 */
|
|
77
|
+
export declare const PipelineFilenameRe: RegExp;
|
|
78
|
+
//# sourceMappingURL=runtimePaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimePaths.d.ts","sourceRoot":"","sources":["../../src/shared/runtimePaths.ts"],"names":[],"mappings":"AAuCA;;;GAGG;AACH,wBAAgB,IAAI,IAAI,MAAM,CAM7B;AAED,gCAAgC;AAChC,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,mCAAmC;AACnC,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,iDAAiD;AACjD,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,qCAAqC;AACrC,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAID,mCAAmC;AACnC,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wCAAwC;AACxC,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,2CAA2C;AAC3C,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzD;AAMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,QAA6C,CAAC;AAEjF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKtE;AAID,yCAAyC;AACzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpE;AAID,wCAAwC;AACxC,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,QAAsC,CAAC;AAEzE,yCAAyC;AACzC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAID,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,8BAA8B;AAC9B,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,QAAwC,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module shared/runtimePaths
|
|
3
|
+
* @description SPS 磁盘布局的唯一出处 —— 所有业务代码都从这里拼路径
|
|
4
|
+
*
|
|
5
|
+
* @layer shared
|
|
6
|
+
*
|
|
7
|
+
* 解决 v0.49.5 / 15 / 16 反复踩到的"writer/reader 各自硬编码路径字符串"问题。
|
|
8
|
+
* 全仓业务代码禁止再出现 literal `.coral` / `runtime/` / `worker-*-current.json`。
|
|
9
|
+
*
|
|
10
|
+
* 目录布局(v0.49.16 当前):
|
|
11
|
+
* $HOME/.coral/
|
|
12
|
+
* ├── console.lock 单实例 Console 锁
|
|
13
|
+
* ├── env 全局 env
|
|
14
|
+
* ├── sessions/ chat daemon socket + sessions
|
|
15
|
+
* ├── chat-sessions/
|
|
16
|
+
* ├── skills/ user-level skills
|
|
17
|
+
* └── projects/<project>/
|
|
18
|
+
* ├── conf shell-export 项目配置
|
|
19
|
+
* ├── cards/
|
|
20
|
+
* │ ├── seq.txt 自增序列
|
|
21
|
+
* │ └── <state>/ planning/backlog/todo/inprogress/qa/done
|
|
22
|
+
* │ └── <seq>-<slug>.md
|
|
23
|
+
* ├── pipelines/
|
|
24
|
+
* │ ├── project.yaml active pipeline
|
|
25
|
+
* │ └── *.yaml 其它 preset
|
|
26
|
+
* ├── runtime/
|
|
27
|
+
* │ ├── state.json RuntimeStore 权威状态
|
|
28
|
+
* │ ├── supervisor.pid tick 进程 pid
|
|
29
|
+
* │ └── worker-<slotName>-current.json marker(slotName="worker-N",双前缀)
|
|
30
|
+
* └── logs/
|
|
31
|
+
* ├── pipeline-<date>.log
|
|
32
|
+
* └── sps-acp-<project>-<slot>-acp-<ts>.log
|
|
33
|
+
*
|
|
34
|
+
* 所有以下常量 / builder / pattern 都是该布局的投影。改布局必须改这里。
|
|
35
|
+
*/
|
|
36
|
+
import { resolve } from 'node:path';
|
|
37
|
+
// ─── Coral root ───────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* 读 HOME —— 每次调用都重读环境变量,方便测试 mock。
|
|
40
|
+
* 缺 HOME 立即抛 —— 这是严重配置错误,别 silently fallback。
|
|
41
|
+
*/
|
|
42
|
+
export function home() {
|
|
43
|
+
const h = process.env.HOME;
|
|
44
|
+
if (!h) {
|
|
45
|
+
throw new Error('HOME environment variable not set — cannot resolve SPS paths');
|
|
46
|
+
}
|
|
47
|
+
return h;
|
|
48
|
+
}
|
|
49
|
+
/** $HOME/.coral —— SPS 数据根目录 */
|
|
50
|
+
export function coralRoot() {
|
|
51
|
+
return resolve(home(), '.coral');
|
|
52
|
+
}
|
|
53
|
+
/** $HOME/.coral/console.lock —— Console 单实例锁文件 */
|
|
54
|
+
export function consoleLockFile() {
|
|
55
|
+
return resolve(coralRoot(), 'console.lock');
|
|
56
|
+
}
|
|
57
|
+
/** $HOME/.coral/env —— 全局环境变量文件 */
|
|
58
|
+
export function globalEnvFile() {
|
|
59
|
+
return resolve(coralRoot(), 'env');
|
|
60
|
+
}
|
|
61
|
+
/** $HOME/.coral/sessions —— chat daemon unix socket 所在目录 */
|
|
62
|
+
export function sessionsDir() {
|
|
63
|
+
return resolve(coralRoot(), 'sessions');
|
|
64
|
+
}
|
|
65
|
+
/** $HOME/.coral/chat-sessions —— chat 会话持久化目录 */
|
|
66
|
+
export function chatSessionsDir() {
|
|
67
|
+
return resolve(coralRoot(), 'chat-sessions');
|
|
68
|
+
}
|
|
69
|
+
/** $HOME/.coral/skills —— user-level skills */
|
|
70
|
+
export function userSkillsDir() {
|
|
71
|
+
return resolve(coralRoot(), 'skills');
|
|
72
|
+
}
|
|
73
|
+
/** $HOME/.coral/projects —— 项目根目录 */
|
|
74
|
+
export function projectsDir() {
|
|
75
|
+
return resolve(coralRoot(), 'projects');
|
|
76
|
+
}
|
|
77
|
+
// ─── Project layout ───────────────────────────────────────────────
|
|
78
|
+
/** $HOME/.coral/projects/<name> */
|
|
79
|
+
export function projectDir(project) {
|
|
80
|
+
return resolve(projectsDir(), project);
|
|
81
|
+
}
|
|
82
|
+
/** $HOME/.coral/projects/<name>/conf */
|
|
83
|
+
export function projectConfFile(project) {
|
|
84
|
+
return resolve(projectDir(project), 'conf');
|
|
85
|
+
}
|
|
86
|
+
/** $HOME/.coral/projects/<name>/runtime */
|
|
87
|
+
export function runtimeDir(project) {
|
|
88
|
+
return resolve(projectDir(project), 'runtime');
|
|
89
|
+
}
|
|
90
|
+
/** $HOME/.coral/projects/<name>/runtime/state.json —— RuntimeStore 权威状态 */
|
|
91
|
+
export function stateFile(project) {
|
|
92
|
+
return resolve(runtimeDir(project), 'state.json');
|
|
93
|
+
}
|
|
94
|
+
/** $HOME/.coral/projects/<name>/runtime/supervisor.pid —— tick 进程 pid */
|
|
95
|
+
export function supervisorPidFile(project) {
|
|
96
|
+
return resolve(runtimeDir(project), 'supervisor.pid');
|
|
97
|
+
}
|
|
98
|
+
// ─── Worker marker ────────────────────────────────────────────────
|
|
99
|
+
// 这是 v0.49.16 踩最深的坑:slotName 形如 "worker-1",拼出来就是
|
|
100
|
+
// worker-worker-1-current.json(双 worker- 前缀)。此常量是唯一真相。
|
|
101
|
+
/**
|
|
102
|
+
* Worker marker 物理文件路径。
|
|
103
|
+
* @param project 项目名
|
|
104
|
+
* @param slotName slot 的完整字符串名(如 "worker-1"),不是数字
|
|
105
|
+
* @returns $HOME/.coral/projects/<project>/runtime/worker-<slotName>-current.json
|
|
106
|
+
* 即 worker-worker-N-current.json(双前缀)
|
|
107
|
+
*/
|
|
108
|
+
export function workerMarkerFile(project, slotName) {
|
|
109
|
+
return resolve(runtimeDir(project), `worker-${slotName}-current.json`);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 把数字 slot 转成 slotName("worker-<N>")—— 约定俗成。
|
|
113
|
+
* 当 UI / 外部 API 传数字时用这个规范化。
|
|
114
|
+
*/
|
|
115
|
+
export function slotNameFromNumber(slot) {
|
|
116
|
+
return `worker-${slot}`;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Worker marker 文件名的正则 —— 识别 runtime 目录里属于 marker 的文件。
|
|
120
|
+
* 匹配两种格式(兼容老数据):
|
|
121
|
+
* worker-worker-<N>-current.json ← 现在的实际格式(slotName="worker-N")
|
|
122
|
+
* worker-<N>-current.json ← 老兼容
|
|
123
|
+
* Capture group 1 是数字 slot(字符串形式)。
|
|
124
|
+
*/
|
|
125
|
+
export const WorkerMarkerFilenameRe = /^worker-(?:worker-)?(\d+)-current\.json$/;
|
|
126
|
+
/**
|
|
127
|
+
* 从文件名抽 slot 数字。非 marker 文件名返 null。
|
|
128
|
+
*/
|
|
129
|
+
export function slotFromMarkerFilename(filename) {
|
|
130
|
+
const m = filename.match(WorkerMarkerFilenameRe);
|
|
131
|
+
if (!m)
|
|
132
|
+
return null;
|
|
133
|
+
const n = Number.parseInt(m[1] ?? '', 10);
|
|
134
|
+
return Number.isFinite(n) && n > 0 ? n : null;
|
|
135
|
+
}
|
|
136
|
+
// ─── Cards ────────────────────────────────────────────────────────
|
|
137
|
+
/** $HOME/.coral/projects/<name>/cards */
|
|
138
|
+
export function cardsDir(project) {
|
|
139
|
+
return resolve(projectDir(project), 'cards');
|
|
140
|
+
}
|
|
141
|
+
/** $HOME/.coral/projects/<name>/cards/seq.txt —— 自增序列 */
|
|
142
|
+
export function cardsSeqFile(project) {
|
|
143
|
+
return resolve(cardsDir(project), 'seq.txt');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* $HOME/.coral/projects/<name>/cards/<state-lower-snake>
|
|
147
|
+
* state 做小写 + 非字母数字替成 '-' 的正规化(和 MarkdownTaskBackend 保持一致)。
|
|
148
|
+
*/
|
|
149
|
+
export function cardsStateDir(project, state) {
|
|
150
|
+
const dirName = state.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
151
|
+
return resolve(cardsDir(project), dirName);
|
|
152
|
+
}
|
|
153
|
+
// ─── Logs ─────────────────────────────────────────────────────────
|
|
154
|
+
/** $HOME/.coral/projects/<name>/logs */
|
|
155
|
+
export function logsDir(project) {
|
|
156
|
+
return resolve(projectDir(project), 'logs');
|
|
157
|
+
}
|
|
158
|
+
/** pipeline-<YYYY-MM-DD>.log 文件名 pattern */
|
|
159
|
+
export const PipelineLogFilenameRe = /^pipeline-\d{4}-\d{2}-\d{2}\.log$/;
|
|
160
|
+
/** worker-<N> 标签在日志行里出现的 pattern,用于过滤 */
|
|
161
|
+
export function workerLogLineTag(slot) {
|
|
162
|
+
return `worker-${slot}`;
|
|
163
|
+
}
|
|
164
|
+
// ─── Pipelines ────────────────────────────────────────────────────
|
|
165
|
+
/** $HOME/.coral/projects/<name>/pipelines */
|
|
166
|
+
export function pipelinesDir(project) {
|
|
167
|
+
return resolve(projectDir(project), 'pipelines');
|
|
168
|
+
}
|
|
169
|
+
/** $HOME/.coral/projects/<name>/pipelines/project.yaml —— 活动 pipeline */
|
|
170
|
+
export function activePipelineFile(project) {
|
|
171
|
+
return resolve(pipelinesDir(project), 'project.yaml');
|
|
172
|
+
}
|
|
173
|
+
/** 命名具体某个 pipeline yaml 文件 */
|
|
174
|
+
export function pipelineFile(project, filename) {
|
|
175
|
+
return resolve(pipelinesDir(project), filename);
|
|
176
|
+
}
|
|
177
|
+
/** pipeline yaml 文件名白名单正则 —— 防路径穿越 */
|
|
178
|
+
export const PipelineFilenameRe = /^[a-zA-Z0-9_.-]+\.yaml(\.example)?$/;
|
|
179
|
+
//# sourceMappingURL=runtimePaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimePaths.js","sourceRoot":"","sources":["../../src/shared/runtimePaths.ts"],"names":[],"mappings":"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"}
|