@coralai/sps-cli 0.10.2 → 0.11.1
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 +63 -23
- package/dist/commands/workerDashboard.d.ts.map +1 -1
- package/dist/commands/workerDashboard.js +39 -11
- package/dist/commands/workerDashboard.js.map +1 -1
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +1 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/state.d.ts +10 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +5 -0
- package/dist/core/state.js.map +1 -1
- package/dist/engines/CloseoutEngine.d.ts.map +1 -1
- package/dist/engines/CloseoutEngine.js +79 -28
- package/dist/engines/CloseoutEngine.js.map +1 -1
- package/dist/engines/ExecutionEngine.d.ts +5 -0
- package/dist/engines/ExecutionEngine.d.ts.map +1 -1
- package/dist/engines/ExecutionEngine.js +80 -16
- package/dist/engines/ExecutionEngine.js.map +1 -1
- package/dist/engines/MonitorEngine.d.ts.map +1 -1
- package/dist/engines/MonitorEngine.js +6 -1
- package/dist/engines/MonitorEngine.js.map +1 -1
- package/dist/interfaces/WorkerProvider.d.ts +68 -15
- package/dist/interfaces/WorkerProvider.d.ts.map +1 -1
- package/dist/models/types.d.ts +3 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/providers/ClaudePrintProvider.d.ts +54 -0
- package/dist/providers/ClaudePrintProvider.d.ts.map +1 -0
- package/dist/providers/ClaudePrintProvider.js +279 -0
- package/dist/providers/ClaudePrintProvider.js.map +1 -0
- package/dist/providers/ClaudeTmuxProvider.d.ts +94 -0
- package/dist/providers/ClaudeTmuxProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeTmuxProvider.js +331 -0
- package/dist/providers/ClaudeTmuxProvider.js.map +1 -0
- package/dist/providers/ClaudeWorkerProvider.d.ts +5 -93
- package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -1
- package/dist/providers/ClaudeWorkerProvider.js +3 -303
- package/dist/providers/ClaudeWorkerProvider.js.map +1 -1
- package/dist/providers/CodexExecProvider.d.ts +36 -0
- package/dist/providers/CodexExecProvider.d.ts.map +1 -0
- package/dist/providers/CodexExecProvider.js +238 -0
- package/dist/providers/CodexExecProvider.js.map +1 -0
- package/dist/providers/CodexTmuxProvider.d.ts +71 -0
- package/dist/providers/CodexTmuxProvider.d.ts.map +1 -0
- package/dist/providers/CodexTmuxProvider.js +351 -0
- package/dist/providers/CodexTmuxProvider.js.map +1 -0
- package/dist/providers/CodexWorkerProvider.d.ts +5 -70
- package/dist/providers/CodexWorkerProvider.d.ts.map +1 -1
- package/dist/providers/CodexWorkerProvider.js +3 -328
- package/dist/providers/CodexWorkerProvider.js.map +1 -1
- package/dist/providers/outputParser.d.ts +50 -0
- package/dist/providers/outputParser.d.ts.map +1 -0
- package/dist/providers/outputParser.js +219 -0
- package/dist/providers/outputParser.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +18 -6
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/streamRenderer.d.ts +13 -0
- package/dist/providers/streamRenderer.d.ts.map +1 -0
- package/dist/providers/streamRenderer.js +106 -0
- package/dist/providers/streamRenderer.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { PlaneTaskBackend } from './PlaneTaskBackend.js';
|
|
2
2
|
import { TrelloTaskBackend } from './TrelloTaskBackend.js';
|
|
3
3
|
import { MarkdownTaskBackend } from './MarkdownTaskBackend.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { ClaudePrintProvider } from './ClaudePrintProvider.js';
|
|
5
|
+
import { CodexExecProvider } from './CodexExecProvider.js';
|
|
6
|
+
import { ClaudeTmuxProvider } from './ClaudeTmuxProvider.js';
|
|
7
|
+
import { CodexTmuxProvider } from './CodexTmuxProvider.js';
|
|
6
8
|
import { GitLabRepoBackend } from './GitLabRepoBackend.js';
|
|
7
9
|
import { MatrixNotifier } from './MatrixNotifier.js';
|
|
8
10
|
export function createTaskBackend(config) {
|
|
@@ -14,10 +16,20 @@ export function createTaskBackend(config) {
|
|
|
14
16
|
}
|
|
15
17
|
}
|
|
16
18
|
export function createWorkerProvider(config) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const mode = config.WORKER_MODE || 'print';
|
|
20
|
+
const tool = config.WORKER_TOOL || 'claude';
|
|
21
|
+
if (mode === 'print') {
|
|
22
|
+
switch (tool) {
|
|
23
|
+
case 'claude': return new ClaudePrintProvider(config);
|
|
24
|
+
case 'codex': return new CodexExecProvider(config);
|
|
25
|
+
default: throw new Error(`Unknown WORKER_TOOL: ${tool}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Interactive (tmux) mode — legacy fallback
|
|
29
|
+
switch (tool) {
|
|
30
|
+
case 'claude': return new ClaudeTmuxProvider(config);
|
|
31
|
+
case 'codex': return new CodexTmuxProvider(config);
|
|
32
|
+
default: throw new Error(`Unknown WORKER_TOOL: ${tool}`);
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
export function createRepoBackend(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC;IAE5C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACtD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACrD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms raw stream-json/JSONL output into human-readable dashboard text.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Render Claude stream-json lines into readable output for the dashboard.
|
|
6
|
+
* Each input line is a JSON object from --output-format stream-json.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderClaudeStreamLines(rawLines: string[]): string[];
|
|
9
|
+
/**
|
|
10
|
+
* Render Codex exec --json JSONL lines into readable output.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderCodexStreamLines(rawLines: string[]): string[];
|
|
13
|
+
//# sourceMappingURL=streamRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamRenderer.d.ts","sourceRoot":"","sources":["../../src/providers/streamRenderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAgBpE;AA2CD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAenE"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms raw stream-json/JSONL output into human-readable dashboard text.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Render Claude stream-json lines into readable output for the dashboard.
|
|
6
|
+
* Each input line is a JSON object from --output-format stream-json.
|
|
7
|
+
*/
|
|
8
|
+
export function renderClaudeStreamLines(rawLines) {
|
|
9
|
+
const output = [];
|
|
10
|
+
for (const line of rawLines) {
|
|
11
|
+
if (!line.trim())
|
|
12
|
+
continue;
|
|
13
|
+
try {
|
|
14
|
+
const obj = JSON.parse(line);
|
|
15
|
+
const rendered = renderClaudeEvent(obj);
|
|
16
|
+
if (rendered)
|
|
17
|
+
output.push(rendered);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Not valid JSON — show as-is (might be stderr mixed in)
|
|
21
|
+
if (line.trim())
|
|
22
|
+
output.push(line);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return output;
|
|
26
|
+
}
|
|
27
|
+
function renderClaudeEvent(obj) {
|
|
28
|
+
switch (obj.type) {
|
|
29
|
+
case 'system':
|
|
30
|
+
return null; // skip system messages
|
|
31
|
+
case 'assistant': {
|
|
32
|
+
const msg = obj.message;
|
|
33
|
+
if (msg && typeof msg.content === 'string') {
|
|
34
|
+
return truncate(msg.content, 120);
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
case 'tool_use': {
|
|
39
|
+
const name = obj.name || 'Tool';
|
|
40
|
+
const input = obj.input;
|
|
41
|
+
let detail = '';
|
|
42
|
+
if (input) {
|
|
43
|
+
if (typeof input.command === 'string')
|
|
44
|
+
detail = ` ${truncate(input.command, 80)}`;
|
|
45
|
+
else if (typeof input.pattern === 'string')
|
|
46
|
+
detail = ` ${input.pattern}`;
|
|
47
|
+
else if (typeof input.file_path === 'string')
|
|
48
|
+
detail = ` ${input.file_path}`;
|
|
49
|
+
}
|
|
50
|
+
return `[${name}]${detail}`;
|
|
51
|
+
}
|
|
52
|
+
case 'tool_result':
|
|
53
|
+
return null; // too verbose for dashboard
|
|
54
|
+
case 'result': {
|
|
55
|
+
const cost = typeof obj.total_cost_usd === 'number'
|
|
56
|
+
? ` ($${obj.total_cost_usd.toFixed(2)})`
|
|
57
|
+
: '';
|
|
58
|
+
const reason = obj.subtype === 'success' ? 'Done' : `Exit: ${obj.subtype}`;
|
|
59
|
+
return `✓ ${reason}${cost}`;
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render Codex exec --json JSONL lines into readable output.
|
|
67
|
+
*/
|
|
68
|
+
export function renderCodexStreamLines(rawLines) {
|
|
69
|
+
const output = [];
|
|
70
|
+
for (const line of rawLines) {
|
|
71
|
+
if (!line.trim())
|
|
72
|
+
continue;
|
|
73
|
+
try {
|
|
74
|
+
const obj = JSON.parse(line);
|
|
75
|
+
const rendered = renderCodexEvent(obj);
|
|
76
|
+
if (rendered)
|
|
77
|
+
output.push(rendered);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
if (line.trim())
|
|
81
|
+
output.push(line);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return output;
|
|
85
|
+
}
|
|
86
|
+
function renderCodexEvent(obj) {
|
|
87
|
+
const type = obj.type;
|
|
88
|
+
if (type === 'message' && typeof obj.content === 'string') {
|
|
89
|
+
return truncate(obj.content, 120);
|
|
90
|
+
}
|
|
91
|
+
if (type === 'function_call' || type === 'tool_call') {
|
|
92
|
+
const name = (obj.name || obj.function || 'Tool');
|
|
93
|
+
return `[${name}]`;
|
|
94
|
+
}
|
|
95
|
+
if (type === 'completed' || type === 'done') {
|
|
96
|
+
return '✓ Done';
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
function truncate(s, maxLen) {
|
|
101
|
+
const oneLine = s.replace(/\n/g, ' ').trim();
|
|
102
|
+
if (oneLine.length <= maxLen)
|
|
103
|
+
return oneLine;
|
|
104
|
+
return oneLine.slice(0, maxLen - 1) + '…';
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=streamRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamRenderer.js","sourceRoot":"","sources":["../../src/providers/streamRenderer.ts"],"names":[],"mappings":"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"}
|