@applica-software-guru/sdd-core 1.8.1 → 1.8.3

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.
Files changed (90) hide show
  1. package/dist/agent/agent-defaults.js +2 -2
  2. package/dist/agent/agent-defaults.js.map +1 -1
  3. package/dist/agent/agent-runner.d.ts +17 -0
  4. package/dist/agent/agent-runner.d.ts.map +1 -1
  5. package/dist/agent/agent-runner.js +163 -11
  6. package/dist/agent/agent-runner.js.map +1 -1
  7. package/dist/agent/worker-daemon.d.ts +12 -0
  8. package/dist/agent/worker-daemon.d.ts.map +1 -0
  9. package/dist/agent/worker-daemon.js +220 -0
  10. package/dist/agent/worker-daemon.js.map +1 -0
  11. package/dist/git/git.d.ts +6 -0
  12. package/dist/git/git.d.ts.map +1 -1
  13. package/dist/git/git.js +60 -0
  14. package/dist/git/git.js.map +1 -1
  15. package/dist/index.d.ts +8 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +19 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/parser/bug-parser.d.ts.map +1 -1
  20. package/dist/parser/bug-parser.js +2 -1
  21. package/dist/parser/bug-parser.js.map +1 -1
  22. package/dist/parser/cr-parser.d.ts.map +1 -1
  23. package/dist/parser/cr-parser.js +2 -1
  24. package/dist/parser/cr-parser.js.map +1 -1
  25. package/dist/prompt/draft-prompt-generator.d.ts +1 -1
  26. package/dist/prompt/draft-prompt-generator.d.ts.map +1 -1
  27. package/dist/prompt/draft-prompt-generator.js +23 -35
  28. package/dist/prompt/draft-prompt-generator.js.map +1 -1
  29. package/dist/prompt/prompt-generator.d.ts.map +1 -1
  30. package/dist/prompt/prompt-generator.js +5 -0
  31. package/dist/prompt/prompt-generator.js.map +1 -1
  32. package/dist/remote/api-client.d.ts +2 -2
  33. package/dist/remote/api-client.d.ts.map +1 -1
  34. package/dist/remote/api-client.js +4 -4
  35. package/dist/remote/api-client.js.map +1 -1
  36. package/dist/remote/sync-engine.d.ts.map +1 -1
  37. package/dist/remote/sync-engine.js +13 -8
  38. package/dist/remote/sync-engine.js.map +1 -1
  39. package/dist/remote/worker-client.d.ts +22 -0
  40. package/dist/remote/worker-client.d.ts.map +1 -0
  41. package/dist/remote/worker-client.js +88 -0
  42. package/dist/remote/worker-client.js.map +1 -0
  43. package/dist/remote/worker-types.d.ts +38 -0
  44. package/dist/remote/worker-types.d.ts.map +1 -0
  45. package/dist/remote/worker-types.js +3 -0
  46. package/dist/remote/worker-types.js.map +1 -0
  47. package/dist/scaffold/skill-adapters.d.ts +0 -9
  48. package/dist/scaffold/skill-adapters.d.ts.map +1 -1
  49. package/dist/scaffold/skill-adapters.js +17 -0
  50. package/dist/scaffold/skill-adapters.js.map +1 -1
  51. package/dist/scaffold/templates.d.ts +1 -5
  52. package/dist/scaffold/templates.d.ts.map +1 -1
  53. package/dist/scaffold/templates.generated.d.ts +7 -0
  54. package/dist/scaffold/templates.generated.d.ts.map +1 -0
  55. package/dist/scaffold/templates.generated.js +482 -0
  56. package/dist/scaffold/templates.generated.js.map +1 -0
  57. package/dist/scaffold/templates.js +8 -338
  58. package/dist/scaffold/templates.js.map +1 -1
  59. package/dist/sdd.d.ts +0 -1
  60. package/dist/sdd.d.ts.map +1 -1
  61. package/dist/sdd.js +1 -18
  62. package/dist/sdd.js.map +1 -1
  63. package/package.json +2 -1
  64. package/scripts/generate-templates.mjs +38 -0
  65. package/src/agent/agent-defaults.ts +2 -2
  66. package/src/agent/agent-runner.ts +184 -12
  67. package/src/agent/worker-daemon.ts +254 -0
  68. package/src/git/git.ts +61 -0
  69. package/src/index.ts +8 -3
  70. package/src/parser/bug-parser.ts +5 -3
  71. package/src/parser/cr-parser.ts +5 -3
  72. package/src/prompt/draft-prompt-generator.ts +26 -38
  73. package/src/prompt/prompt-generator.ts +8 -0
  74. package/src/remote/api-client.ts +2 -2
  75. package/src/remote/sync-engine.ts +16 -15
  76. package/src/remote/worker-client.ts +141 -0
  77. package/src/remote/worker-types.ts +40 -0
  78. package/src/scaffold/skill-adapters.ts +18 -11
  79. package/src/scaffold/templates.generated.ts +484 -0
  80. package/src/scaffold/templates.ts +9 -342
  81. package/src/sdd.ts +1 -19
  82. package/tests/agent-defaults.test.ts +24 -0
  83. package/tests/api-client.test.ts +6 -6
  84. package/tests/draft-prompt.test.ts +78 -0
  85. package/dist/prompt/apply-prompt-generator.d.ts +0 -4
  86. package/dist/prompt/apply-prompt-generator.d.ts.map +0 -1
  87. package/dist/prompt/apply-prompt-generator.js +0 -97
  88. package/dist/prompt/apply-prompt-generator.js.map +0 -1
  89. package/src/prompt/apply-prompt-generator.ts +0 -117
  90. package/tests/apply.test.ts +0 -117
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_AGENTS = void 0;
4
4
  exports.resolveAgentCommand = resolveAgentCommand;
5
5
  exports.DEFAULT_AGENTS = {
6
- claude: 'claude -p "$(cat $PROMPT_FILE)" --dangerously-skip-permissions --verbose',
7
- codex: 'codex -q "$(cat $PROMPT_FILE)"',
6
+ claude: 'claude -p "$(cat $PROMPT_FILE)" --permission-mode auto --verbose --model $MODEL',
7
+ codex: 'codex -q "$(cat $PROMPT_FILE)" -m $MODEL',
8
8
  opencode: 'opencode -p "$(cat $PROMPT_FILE)"',
9
9
  };
10
10
  function resolveAgentCommand(name, configAgents) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-defaults.js","sourceRoot":"","sources":["../../src/agent/agent-defaults.ts"],"names":[],"mappings":";;;AAMA,kDAKC;AAXY,QAAA,cAAc,GAA2B;IACpD,MAAM,EAAE,0EAA0E;IAClF,KAAK,EAAE,gCAAgC;IACvC,QAAQ,EAAE,mCAAmC;CAC9C,CAAC;AAEF,SAAgB,mBAAmB,CACjC,IAAY,EACZ,YAAqC;IAErC,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,sBAAc,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"agent-defaults.js","sourceRoot":"","sources":["../../src/agent/agent-defaults.ts"],"names":[],"mappings":";;;AAMA,kDAKC;AAXY,QAAA,cAAc,GAA2B;IACpD,MAAM,EAAE,iFAAiF;IACzF,KAAK,EAAE,0CAA0C;IACjD,QAAQ,EAAE,mCAAmC;CAC9C,CAAC;AAEF,SAAgB,mBAAmB,CACjC,IAAY,EACZ,YAAqC;IAErC,OAAO,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,sBAAc,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -2,8 +2,25 @@ export interface AgentRunnerOptions {
2
2
  root: string;
3
3
  prompt: string;
4
4
  agent: string;
5
+ model?: string;
5
6
  agents?: Record<string, string>;
6
7
  onOutput?: (data: string) => void;
7
8
  }
9
+ /** Handle returned by startAgent() for interactive worker mode. */
10
+ export interface AgentRunnerHandle {
11
+ /** Resolves with the exit code when the agent process exits. */
12
+ exitPromise: Promise<number>;
13
+ /** Write data to the agent's stdin (for Q&A relay). */
14
+ writeStdin: (data: string) => void;
15
+ /** Kill the agent process. */
16
+ kill: () => void;
17
+ /** Path to the temp prompt file (cleaned up on exit). */
18
+ promptFile: string;
19
+ }
8
20
  export declare function runAgent(options: AgentRunnerOptions): Promise<number>;
21
+ /**
22
+ * Start an agent in interactive mode (stdin piped for Q&A).
23
+ * Returns a handle for writing to stdin, killing the process, and awaiting exit.
24
+ */
25
+ export declare function startAgent(options: AgentRunnerOptions): Promise<AgentRunnerHandle>;
9
26
  //# sourceMappingURL=agent-runner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/agent/agent-runner.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC3E"}
1
+ {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/agent/agent-runner.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,uDAAuD;IACvD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8BAA8B;IAC9B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAwHD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC3E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwCxF"}
@@ -1,35 +1,143 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runAgent = runAgent;
4
+ exports.startAgent = startAgent;
4
5
  const node_child_process_1 = require("node:child_process");
5
6
  const promises_1 = require("node:fs/promises");
6
7
  const node_os_1 = require("node:os");
7
8
  const node_path_1 = require("node:path");
8
9
  const node_crypto_1 = require("node:crypto");
9
10
  const agent_defaults_js_1 = require("./agent-defaults.js");
10
- async function runAgent(options) {
11
- const { root, prompt, agent, agents, onOutput } = options;
11
+ /**
12
+ * Extract human-readable text from a single stream-json NDJSON line.
13
+ * Returns the text to emit, or null if the line should be suppressed.
14
+ * Falls back to the raw line if it is not valid JSON (e.g. stderr noise).
15
+ */
16
+ function extractStreamJsonText(line) {
17
+ let event;
18
+ try {
19
+ event = JSON.parse(line);
20
+ }
21
+ catch {
22
+ // Not JSON — pass raw (e.g. stderr lines from subprocesses)
23
+ return line;
24
+ }
25
+ if (typeof event !== 'object' || event === null || !('type' in event)) {
26
+ return null;
27
+ }
28
+ const { type } = event;
29
+ if (type === 'assistant') {
30
+ const message = event.message;
31
+ if (typeof message === 'object' && message !== null && 'content' in message) {
32
+ const content = message.content;
33
+ if (Array.isArray(content)) {
34
+ const texts = content
35
+ .filter((b) => b?.type === 'text' && typeof b?.text === 'string')
36
+ .map((b) => b.text);
37
+ return texts.length > 0 ? texts.join('') : null;
38
+ }
39
+ }
40
+ return null;
41
+ }
42
+ if (type === 'result') {
43
+ const result = event.result;
44
+ if (typeof result === 'string' && result.trim()) {
45
+ return result;
46
+ }
47
+ return null;
48
+ }
49
+ // Suppress system/init/tool events — not useful for display
50
+ return null;
51
+ }
52
+ /**
53
+ * Attach NDJSON-parsing stream handlers to a child process.
54
+ * Each complete JSON line is parsed and the extracted text forwarded to `sink`.
55
+ * stderr lines are forwarded raw (they are not stream-json).
56
+ */
57
+ function pipeWithNdjsonParsing(child, sink) {
58
+ if (child.stdout) {
59
+ let buf = '';
60
+ child.stdout.on('data', (data) => {
61
+ buf += data.toString();
62
+ const lines = buf.split('\n');
63
+ buf = lines.pop() ?? '';
64
+ for (const line of lines) {
65
+ if (!line.trim())
66
+ continue;
67
+ const text = extractStreamJsonText(line);
68
+ if (text)
69
+ sink(text);
70
+ }
71
+ });
72
+ child.stdout.on('end', () => {
73
+ if (buf.trim()) {
74
+ const text = extractStreamJsonText(buf);
75
+ if (text)
76
+ sink(text);
77
+ }
78
+ });
79
+ }
80
+ if (child.stderr) {
81
+ child.stderr.on('data', (data) => sink(data.toString()));
82
+ }
83
+ }
84
+ async function prepareAgent(options) {
85
+ const { prompt, agent, model, agents } = options;
12
86
  const template = (0, agent_defaults_js_1.resolveAgentCommand)(agent, agents);
13
87
  if (!template) {
14
88
  throw new Error(`Unknown agent "${agent}". Available: ${Object.keys(agents ?? {}).join(', ') || 'claude, codex, opencode'}`);
15
89
  }
16
- // Write prompt to temp file (too large for CLI arg)
17
90
  const tmpFile = (0, node_path_1.join)((0, node_os_1.tmpdir)(), `sdd-prompt-${(0, node_crypto_1.randomBytes)(6).toString('hex')}.md`);
18
91
  await (0, promises_1.writeFile)(tmpFile, prompt, 'utf-8');
19
- // Replace $PROMPT_FILE with the temp file path in the command template
20
- const command = template.replace(/\$PROMPT_FILE/g, tmpFile);
92
+ let command = template.replace(/\$PROMPT_FILE/g, tmpFile);
93
+ if (model) {
94
+ command = command.replace(/\$MODEL/g, model);
95
+ // If template doesn't have $MODEL but model is specified, inject --model flag
96
+ if (!template.includes('$MODEL')) {
97
+ command = command.replace(/^(\S+)/, `$1 --model ${model}`);
98
+ }
99
+ }
100
+ else {
101
+ // Remove $MODEL placeholder and surrounding flags if not provided
102
+ command = command.replace(/--model\s+\$MODEL\s*/g, '');
103
+ command = command.replace(/\$MODEL\s*/g, '');
104
+ }
105
+ // For the claude CLI: switch to stream-json output for real-time streaming.
106
+ // --verbose is required alongside --output-format stream-json when using -p.
107
+ const isClaudeAgent = command.trimStart().startsWith('claude');
108
+ if (isClaudeAgent) {
109
+ // Ensure --verbose is present (required by stream-json in print mode)
110
+ if (!command.includes('--verbose')) {
111
+ command = command.trimEnd() + ' --verbose';
112
+ }
113
+ command = command.trimEnd() + ' --output-format stream-json';
114
+ }
115
+ return { command, tmpFile, isClaudeAgent };
116
+ }
117
+ async function runAgent(options) {
118
+ const { root, onOutput } = options;
119
+ const { command, tmpFile, isClaudeAgent } = await prepareAgent(options);
21
120
  try {
22
121
  const exitCode = await new Promise((resolve, reject) => {
122
+ // For claude with stream-json we always pipe stdout so we can parse NDJSON.
123
+ // For other agents we inherit stdio when no onOutput is provided.
124
+ const usesPipe = isClaudeAgent || !!onOutput;
23
125
  const child = (0, node_child_process_1.spawn)(command, {
24
126
  cwd: root,
25
127
  shell: true,
26
- stdio: onOutput ? ['inherit', 'pipe', 'pipe'] : 'inherit',
128
+ stdio: usesPipe ? ['inherit', 'pipe', 'pipe'] : 'inherit',
27
129
  });
28
- if (onOutput && child.stdout) {
29
- child.stdout.on('data', (data) => onOutput(data.toString()));
30
- }
31
- if (onOutput && child.stderr) {
32
- child.stderr.on('data', (data) => onOutput(data.toString()));
130
+ if (usesPipe) {
131
+ const sink = onOutput ?? ((text) => process.stdout.write(text));
132
+ if (isClaudeAgent) {
133
+ pipeWithNdjsonParsing(child, sink);
134
+ }
135
+ else {
136
+ if (child.stdout)
137
+ child.stdout.on('data', (data) => sink(data.toString()));
138
+ if (child.stderr)
139
+ child.stderr.on('data', (data) => sink(data.toString()));
140
+ }
33
141
  }
34
142
  child.on('error', reject);
35
143
  child.on('close', (code) => resolve(code ?? 1));
@@ -40,4 +148,48 @@ async function runAgent(options) {
40
148
  await (0, promises_1.unlink)(tmpFile).catch(() => { });
41
149
  }
42
150
  }
151
+ /**
152
+ * Start an agent in interactive mode (stdin piped for Q&A).
153
+ * Returns a handle for writing to stdin, killing the process, and awaiting exit.
154
+ */
155
+ async function startAgent(options) {
156
+ const { root, onOutput } = options;
157
+ const { command, tmpFile, isClaudeAgent } = await prepareAgent(options);
158
+ const child = (0, node_child_process_1.spawn)(command, {
159
+ cwd: root,
160
+ shell: true,
161
+ stdio: ['pipe', 'pipe', 'pipe'],
162
+ });
163
+ const sink = onOutput ?? ((text) => process.stdout.write(text));
164
+ if (isClaudeAgent) {
165
+ pipeWithNdjsonParsing(child, sink);
166
+ }
167
+ else {
168
+ if (child.stdout)
169
+ child.stdout.on('data', (data) => sink(data.toString()));
170
+ if (child.stderr)
171
+ child.stderr.on('data', (data) => sink(data.toString()));
172
+ }
173
+ const exitPromise = new Promise((resolve, reject) => {
174
+ child.on('error', reject);
175
+ child.on('close', (code) => {
176
+ (0, promises_1.unlink)(tmpFile).catch(() => { });
177
+ resolve(code ?? 1);
178
+ });
179
+ });
180
+ return {
181
+ exitPromise,
182
+ writeStdin: (data) => {
183
+ if (child.stdin && !child.stdin.destroyed) {
184
+ child.stdin.write(data);
185
+ }
186
+ },
187
+ kill: () => {
188
+ if (!child.killed) {
189
+ child.kill('SIGTERM');
190
+ }
191
+ },
192
+ promptFile: tmpFile,
193
+ };
194
+ }
43
195
  //# sourceMappingURL=agent-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/agent/agent-runner.ts"],"names":[],"mappings":";;AAeA,4BAsCC;AArDD,2DAA2C;AAC3C,+CAAqD;AACrD,qCAAiC;AACjC,yCAAiC;AACjC,6CAA0C;AAC1C,2DAA0D;AAUnD,KAAK,UAAU,QAAQ,CAAC,OAA2B;IACxD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1D,MAAM,QAAQ,GAAG,IAAA,uCAAmB,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,iBAAiB,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,oDAAoD;IACpD,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,cAAc,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,IAAA,oBAAS,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1C,uEAAuE;IACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7D,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE;gBAC3B,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;aAC1D,CAAC,CAAC;YAEH,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC7B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;YAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../src/agent/agent-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ApiClientConfig } from '../remote/api-client.js';
2
+ export interface WorkerDaemonOptions {
3
+ root: string;
4
+ name?: string;
5
+ agent: string;
6
+ agents?: Record<string, string>;
7
+ apiConfig: ApiClientConfig;
8
+ onLog?: (message: string) => void;
9
+ renderPrompt?: (prompt: string) => string;
10
+ }
11
+ export declare function startWorkerDaemon(options: WorkerDaemonOptions): Promise<void>;
12
+ //# sourceMappingURL=worker-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-daemon.d.ts","sourceRoot":"","sources":["../../src/agent/worker-daemon.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAe/D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAOD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwNnF"}
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startWorkerDaemon = startWorkerDaemon;
4
+ const node_os_1 = require("node:os");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const worker_client_js_1 = require("../remote/worker-client.js");
8
+ const agent_runner_js_1 = require("./agent-runner.js");
9
+ const git_js_1 = require("../git/git.js");
10
+ const HEARTBEAT_INTERVAL_MS = 15_000;
11
+ const OUTPUT_FLUSH_INTERVAL_MS = 2_000;
12
+ const QA_POLL_INTERVAL_MS = 2_000;
13
+ const WORKER_STATE_FILE = 'worker.json';
14
+ async function startWorkerDaemon(options) {
15
+ const { root, agent, agents, apiConfig, onLog, renderPrompt } = options;
16
+ const workerName = options.name ?? (0, node_os_1.hostname)();
17
+ const sddDir = (0, node_path_1.join)(root, '.sdd');
18
+ const stateFile = (0, node_path_1.join)(sddDir, WORKER_STATE_FILE);
19
+ const log = onLog ?? ((msg) => process.stderr.write(`[worker] ${msg}\n`));
20
+ const shortId = (id) => id.slice(0, 8);
21
+ // --- Read current branch (informational — no checkout) ---
22
+ const branch = (0, git_js_1.getCurrentBranch)(root) ?? undefined;
23
+ // --- Register ---
24
+ log(`Registering worker "${workerName}" with agent "${agent}"${branch ? ` (branch: ${branch})` : ''}...`);
25
+ const registration = await (0, worker_client_js_1.registerWorker)(apiConfig, workerName, agent, branch, {
26
+ hostname: (0, node_os_1.hostname)(),
27
+ platform: process.platform,
28
+ arch: process.arch,
29
+ });
30
+ const state = {
31
+ workerId: registration.id,
32
+ name: workerName,
33
+ registeredAt: registration.registered_at,
34
+ };
35
+ await (0, promises_1.writeFile)(stateFile, JSON.stringify(state, null, 2), 'utf-8');
36
+ log(`Registered as worker ${shortId(registration.id)}`);
37
+ let running = true;
38
+ let currentJobKill = null;
39
+ // --- Graceful shutdown ---
40
+ const shutdown = async () => {
41
+ log('Shutting down...');
42
+ running = false;
43
+ if (currentJobKill) {
44
+ currentJobKill();
45
+ }
46
+ try {
47
+ await (0, worker_client_js_1.workerHeartbeat)(apiConfig, registration.id, 'online');
48
+ }
49
+ catch {
50
+ // best effort
51
+ }
52
+ };
53
+ process.on('SIGINT', () => { shutdown(); });
54
+ process.on('SIGTERM', () => { shutdown(); });
55
+ // --- Heartbeat loop ---
56
+ const heartbeatLoop = async () => {
57
+ while (running) {
58
+ try {
59
+ await (0, worker_client_js_1.workerHeartbeat)(apiConfig, registration.id, currentJobKill ? 'busy' : 'online');
60
+ }
61
+ catch (err) {
62
+ const msg = err.message;
63
+ if (!msg.includes('abort')) {
64
+ log(`Heartbeat error: ${msg}`);
65
+ }
66
+ }
67
+ await sleep(HEARTBEAT_INTERVAL_MS);
68
+ }
69
+ };
70
+ // --- Poll & execute loop ---
71
+ const pollLoop = async () => {
72
+ while (running) {
73
+ try {
74
+ const job = await (0, worker_client_js_1.workerPoll)(apiConfig, registration.id);
75
+ if (job && running) {
76
+ await executeJob(job);
77
+ }
78
+ }
79
+ catch (err) {
80
+ if (!running)
81
+ break;
82
+ const msg = err.message;
83
+ // Don't log abort errors during shutdown
84
+ if (!msg.includes('abort')) {
85
+ log(`Poll error: ${msg}`);
86
+ }
87
+ await sleep(3_000);
88
+ }
89
+ }
90
+ };
91
+ // --- Job execution ---
92
+ const executeJob = async (job) => {
93
+ const jobDesc = job.entity_type ? `${job.entity_type}/${job.entity_id}` : 'sync';
94
+ const jid = shortId(job.job_id);
95
+ log(`┌─ Job ${jid} (${jobDesc})`);
96
+ log(`│ Agent: ${job.agent}${job.model ? ` Model: ${job.model}` : ''}${job.branch ? ` Branch: ${job.branch}` : ''}`);
97
+ const promptPreview = job.prompt.split('\n').find(l => l.trim().length > 0) ?? '';
98
+ log(`└─ ${promptPreview.length > 80 ? promptPreview.slice(0, 80) + '…' : promptPreview}`);
99
+ // Checkout branch if the job explicitly requests one different from the current
100
+ if (job.branch && job.branch !== (0, git_js_1.getCurrentBranch)(root)) {
101
+ log(`Checking out branch "${job.branch}" for job ${job.job_id}...`);
102
+ try {
103
+ (0, git_js_1.checkoutBranch)(root, job.branch);
104
+ }
105
+ catch (err) {
106
+ log(`Warning: could not checkout branch "${job.branch}": ${err.message}`);
107
+ }
108
+ }
109
+ // Capture git state before the job starts so we can diff at the end
110
+ const baseCommit = (0, git_js_1.getCurrentCommit)(root);
111
+ try {
112
+ await (0, worker_client_js_1.workerJobStarted)(apiConfig, job.job_id);
113
+ }
114
+ catch (err) {
115
+ log(`Failed to notify job start: ${err.message}`);
116
+ }
117
+ // Buffer for batched output
118
+ let outputBuffer = [];
119
+ let lastFlush = Date.now();
120
+ let lastAnswerSequence = 0;
121
+ let waitingForAnswer = false;
122
+ const flushOutput = async () => {
123
+ if (outputBuffer.length === 0)
124
+ return;
125
+ const lines = outputBuffer.splice(0);
126
+ try {
127
+ await (0, worker_client_js_1.workerJobOutput)(apiConfig, job.job_id, lines);
128
+ }
129
+ catch (err) {
130
+ log(`Output flush error: ${err.message}`);
131
+ }
132
+ };
133
+ // Start the agent with interactive mode
134
+ const handle = await (0, agent_runner_js_1.startAgent)({
135
+ root,
136
+ prompt: job.prompt,
137
+ agent: job.agent,
138
+ model: job.model,
139
+ agents,
140
+ onOutput: (data) => {
141
+ // Split into lines but preserve partial lines
142
+ const lines = data.split('\n');
143
+ for (const line of lines) {
144
+ // Suppress the Claude CLI stdin warning — prompt is passed via -p flag,
145
+ // stdin is kept open only for Q&A relay and does not need initial data.
146
+ if (line.includes('no stdin data received') || line.includes('redirect stdin explicitly')) {
147
+ continue;
148
+ }
149
+ if (line.length > 0) {
150
+ outputBuffer.push(line);
151
+ }
152
+ }
153
+ // Flush if enough time has passed
154
+ if (Date.now() - lastFlush >= OUTPUT_FLUSH_INTERVAL_MS) {
155
+ lastFlush = Date.now();
156
+ flushOutput();
157
+ }
158
+ },
159
+ });
160
+ currentJobKill = handle.kill;
161
+ // Periodic output flush + answer polling loop
162
+ const flushAndPollLoop = async () => {
163
+ while (running) {
164
+ // Flush pending output
165
+ await flushOutput();
166
+ lastFlush = Date.now();
167
+ // If we detected a question, poll for answers
168
+ if (waitingForAnswer) {
169
+ try {
170
+ const answers = await (0, worker_client_js_1.workerJobAnswers)(apiConfig, job.job_id, lastAnswerSequence);
171
+ if (answers.length > 0) {
172
+ for (const ans of answers) {
173
+ handle.writeStdin(ans.content + '\n');
174
+ lastAnswerSequence = ans.sequence;
175
+ }
176
+ waitingForAnswer = false;
177
+ }
178
+ }
179
+ catch (err) {
180
+ log(`Answer poll error: ${err.message}`);
181
+ }
182
+ }
183
+ await sleep(QA_POLL_INTERVAL_MS);
184
+ }
185
+ };
186
+ // Run the flush/poll loop concurrently with the agent
187
+ const flushPromise = flushAndPollLoop();
188
+ try {
189
+ const exitCode = await handle.exitPromise;
190
+ // Final flush
191
+ running = true; // temporarily re-enable to allow final flush
192
+ await flushOutput();
193
+ const changedFiles = (0, git_js_1.getJobChangedFiles)(root, baseCommit);
194
+ const filesMsg = changedFiles.length > 0 ? `, ${changedFiles.length} file(s) changed` : '';
195
+ log(`Job ${jid} done — exit ${exitCode}${filesMsg}`);
196
+ await (0, worker_client_js_1.workerJobCompleted)(apiConfig, job.job_id, exitCode, changedFiles);
197
+ }
198
+ catch (err) {
199
+ log(`Job ${jid} error: ${err.message}`);
200
+ try {
201
+ const changedFiles = (0, git_js_1.getJobChangedFiles)(root, baseCommit);
202
+ await (0, worker_client_js_1.workerJobCompleted)(apiConfig, job.job_id, 1, changedFiles);
203
+ }
204
+ catch {
205
+ // best effort
206
+ }
207
+ }
208
+ finally {
209
+ currentJobKill = null;
210
+ }
211
+ };
212
+ // --- Start concurrent loops ---
213
+ log(`Worker "${workerName}" is online. Waiting for jobs… (id: ${shortId(registration.id)})`);
214
+ await Promise.all([heartbeatLoop(), pollLoop()]);
215
+ log('Worker stopped.');
216
+ }
217
+ function sleep(ms) {
218
+ return new Promise((resolve) => setTimeout(resolve, ms));
219
+ }
220
+ //# sourceMappingURL=worker-daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-daemon.js","sourceRoot":"","sources":["../../src/agent/worker-daemon.ts"],"names":[],"mappings":"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"}
package/dist/git/git.d.ts CHANGED
@@ -5,6 +5,12 @@ export declare function getCurrentCommit(root: string): string | null;
5
5
  export declare function getGitDiff(root: string, fromCommit: string | null): string;
6
6
  export declare function getFileDiff(root: string, filePath: string): string;
7
7
  export declare function getGitModifiedFiles(root: string): Set<string>;
8
+ export declare function getCurrentBranch(root: string): string | null;
9
+ export declare function checkoutBranch(root: string, branch: string): void;
10
+ export declare function getJobChangedFiles(root: string, fromCommit: string | null): Array<{
11
+ path: string;
12
+ status: 'new' | 'modified' | 'deleted';
13
+ }>;
8
14
  export declare function getChangedFiles(root: string, fromCommit: string | null): Array<{
9
15
  path: string;
10
16
  status: 'new' | 'modified' | 'deleted';
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASpF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB1E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAgB7D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAyBxI"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"AAQA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CASpF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAoB1E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAgB7D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOjE;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAuCjE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAyBxI"}
package/dist/git/git.js CHANGED
@@ -7,6 +7,9 @@ exports.getCurrentCommit = getCurrentCommit;
7
7
  exports.getGitDiff = getGitDiff;
8
8
  exports.getFileDiff = getFileDiff;
9
9
  exports.getGitModifiedFiles = getGitModifiedFiles;
10
+ exports.getCurrentBranch = getCurrentBranch;
11
+ exports.checkoutBranch = checkoutBranch;
12
+ exports.getJobChangedFiles = getJobChangedFiles;
10
13
  exports.getChangedFiles = getChangedFiles;
11
14
  const node_child_process_1 = require("node:child_process");
12
15
  const node_fs_1 = require("node:fs");
@@ -96,6 +99,63 @@ function getGitModifiedFiles(root) {
96
99
  }
97
100
  return modified;
98
101
  }
102
+ function getCurrentBranch(root) {
103
+ try {
104
+ return run('git rev-parse --abbrev-ref HEAD', root) || null;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ }
110
+ function checkoutBranch(root, branch) {
111
+ try {
112
+ run(`git checkout ${branch}`, root);
113
+ }
114
+ catch {
115
+ // branch doesn't exist — create it
116
+ run(`git checkout -b ${branch}`, root);
117
+ }
118
+ }
119
+ function getJobChangedFiles(root, fromCommit) {
120
+ const result = new Map();
121
+ try {
122
+ // Committed changes since the base commit
123
+ if (fromCommit) {
124
+ const committed = run(`git diff --name-status ${fromCommit} HEAD`, root);
125
+ for (const line of committed.split('\n').filter(Boolean)) {
126
+ const parts = line.split('\t');
127
+ const flag = parts[0][0]; // first char (A/M/D/R/C)
128
+ // Renames have two paths: old\tnew — use the new path
129
+ const path = parts.length >= 3 ? parts[2] : parts[1];
130
+ const fileStatus = flag === 'A' ? 'new' : flag === 'D' ? 'deleted' : 'modified';
131
+ result.set(path, fileStatus);
132
+ }
133
+ }
134
+ // Uncommitted working tree changes (staged + unstaged + untracked)
135
+ const porcelain = run('git status --porcelain', root);
136
+ for (const line of porcelain.split('\n').filter(Boolean)) {
137
+ const xy = line.substring(0, 2);
138
+ const rawPath = line.substring(3).trim();
139
+ // Renamed files show as "old -> new" in porcelain v1
140
+ const path = rawPath.includes(' -> ') ? rawPath.split(' -> ')[1] : rawPath;
141
+ if (xy[0] === 'D' || xy[1] === 'D') {
142
+ result.set(path, 'deleted');
143
+ }
144
+ else if (xy === '??' || xy[0] === 'A' || xy[1] === 'A') {
145
+ if (!result.has(path))
146
+ result.set(path, 'new');
147
+ }
148
+ else {
149
+ if (!result.has(path))
150
+ result.set(path, 'modified');
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // not a git repo or no commits — return empty
156
+ }
157
+ return Array.from(result.entries()).map(([path, status]) => ({ path, status }));
158
+ }
99
159
  function getChangedFiles(root, fromCommit) {
100
160
  try {
101
161
  if (!fromCommit) {
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git/git.ts"],"names":[],"mappings":"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"}