@farmslot/agent-runtime 0.8.1 → 0.10.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.
Files changed (253) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/README.md +2 -2
  3. package/bin/farmslot-agent.mjs +3 -43
  4. package/dist/execution-template/create.d.ts.map +1 -1
  5. package/dist/execution-template/create.js +4 -9
  6. package/dist/execution-template/create.js.map +1 -1
  7. package/dist/execution-template/execution-template.test.js +85 -34
  8. package/dist/execution-template/execution-template.test.js.map +1 -1
  9. package/dist/execution-template/frontmatter.d.ts +6 -3
  10. package/dist/execution-template/frontmatter.d.ts.map +1 -1
  11. package/dist/execution-template/frontmatter.js +8 -10
  12. package/dist/execution-template/frontmatter.js.map +1 -1
  13. package/dist/execution-template/index.d.ts +2 -2
  14. package/dist/execution-template/index.d.ts.map +1 -1
  15. package/dist/execution-template/index.js +2 -2
  16. package/dist/execution-template/index.js.map +1 -1
  17. package/dist/execution-template/infer.d.ts +2 -3
  18. package/dist/execution-template/infer.d.ts.map +1 -1
  19. package/dist/execution-template/infer.js +2 -19
  20. package/dist/execution-template/infer.js.map +1 -1
  21. package/dist/execution-template/lint.d.ts.map +1 -1
  22. package/dist/execution-template/lint.js +12 -14
  23. package/dist/execution-template/lint.js.map +1 -1
  24. package/dist/execution-template/resolve.d.ts.map +1 -1
  25. package/dist/execution-template/resolve.js +0 -2
  26. package/dist/execution-template/resolve.js.map +1 -1
  27. package/dist/execution-template/select.d.ts.map +1 -1
  28. package/dist/execution-template/select.js +4 -8
  29. package/dist/execution-template/select.js.map +1 -1
  30. package/dist/execution-template/snapshot.d.ts.map +1 -1
  31. package/dist/execution-template/snapshot.js +0 -1
  32. package/dist/execution-template/snapshot.js.map +1 -1
  33. package/dist/execution-template/types.d.ts +10 -5
  34. package/dist/execution-template/types.d.ts.map +1 -1
  35. package/dist/execution-template/types.js.map +1 -1
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/native/account-claude.d.ts +5 -0
  41. package/dist/native/account-claude.d.ts.map +1 -0
  42. package/dist/native/account-claude.js +42 -0
  43. package/dist/native/account-claude.js.map +1 -0
  44. package/dist/native/account-codex.d.ts +4 -0
  45. package/dist/native/account-codex.d.ts.map +1 -0
  46. package/dist/native/account-codex.js +51 -0
  47. package/dist/native/account-codex.js.map +1 -0
  48. package/dist/native/account-common.d.ts +30 -0
  49. package/dist/native/account-common.d.ts.map +1 -0
  50. package/dist/native/account-common.js +155 -0
  51. package/dist/native/account-common.js.map +1 -0
  52. package/dist/native/account-cursor.d.ts +5 -0
  53. package/dist/native/account-cursor.d.ts.map +1 -0
  54. package/dist/native/account-cursor.js +48 -0
  55. package/dist/native/account-cursor.js.map +1 -0
  56. package/dist/native/account-grok.d.ts +4 -0
  57. package/dist/native/account-grok.d.ts.map +1 -0
  58. package/dist/native/account-grok.js +55 -0
  59. package/dist/native/account-grok.js.map +1 -0
  60. package/dist/native/account-observation.test.d.ts +2 -0
  61. package/dist/native/account-observation.test.d.ts.map +1 -0
  62. package/dist/native/account-observation.test.js +256 -0
  63. package/dist/native/account-observation.test.js.map +1 -0
  64. package/dist/native/account-profiles.d.ts +11 -0
  65. package/dist/native/account-profiles.d.ts.map +1 -0
  66. package/dist/native/account-profiles.js +172 -0
  67. package/dist/native/account-profiles.js.map +1 -0
  68. package/dist/native/account-profiles.test.d.ts +2 -0
  69. package/dist/native/account-profiles.test.d.ts.map +1 -0
  70. package/dist/native/account-profiles.test.js +172 -0
  71. package/dist/native/account-profiles.test.js.map +1 -0
  72. package/dist/native/account-types.d.ts +11 -0
  73. package/dist/native/account-types.d.ts.map +1 -0
  74. package/dist/native/account-types.js +2 -0
  75. package/dist/native/account-types.js.map +1 -0
  76. package/dist/native/acp-requests.d.ts +11 -0
  77. package/dist/native/acp-requests.d.ts.map +1 -0
  78. package/dist/native/acp-requests.js +109 -0
  79. package/dist/native/acp-requests.js.map +1 -0
  80. package/dist/native/acp-rpc.d.ts +15 -0
  81. package/dist/native/acp-rpc.d.ts.map +1 -0
  82. package/dist/native/acp-rpc.js +73 -0
  83. package/dist/native/acp-rpc.js.map +1 -0
  84. package/dist/native/acp.d.ts +15 -0
  85. package/dist/native/acp.d.ts.map +1 -0
  86. package/dist/native/acp.js +285 -0
  87. package/dist/native/acp.js.map +1 -0
  88. package/dist/native/acp.test.d.ts +2 -0
  89. package/dist/native/acp.test.d.ts.map +1 -0
  90. package/dist/native/acp.test.js +257 -0
  91. package/dist/native/acp.test.js.map +1 -0
  92. package/dist/native/affinity.test.d.ts +2 -0
  93. package/dist/native/affinity.test.d.ts.map +1 -0
  94. package/dist/native/affinity.test.js +30 -0
  95. package/dist/native/affinity.test.js.map +1 -0
  96. package/dist/native/claude.d.ts +11 -0
  97. package/dist/native/claude.d.ts.map +1 -0
  98. package/dist/native/claude.js +504 -0
  99. package/dist/native/claude.js.map +1 -0
  100. package/dist/native/client.d.ts +34 -0
  101. package/dist/native/client.d.ts.map +1 -0
  102. package/dist/native/client.js +217 -0
  103. package/dist/native/client.js.map +1 -0
  104. package/dist/native/codex.d.ts +3 -0
  105. package/dist/native/codex.d.ts.map +1 -0
  106. package/dist/native/codex.js +324 -0
  107. package/dist/native/codex.js.map +1 -0
  108. package/dist/native/cursor-model.d.ts +6 -0
  109. package/dist/native/cursor-model.d.ts.map +1 -0
  110. package/dist/native/cursor-model.js +74 -0
  111. package/dist/native/cursor-model.js.map +1 -0
  112. package/dist/native/cursor-model.test.d.ts +2 -0
  113. package/dist/native/cursor-model.test.d.ts.map +1 -0
  114. package/dist/native/cursor-model.test.js +40 -0
  115. package/dist/native/cursor-model.test.js.map +1 -0
  116. package/dist/native/cursor.d.ts +2 -0
  117. package/dist/native/cursor.d.ts.map +1 -0
  118. package/dist/native/cursor.js +30 -0
  119. package/dist/native/cursor.js.map +1 -0
  120. package/dist/native/durability.test.d.ts +2 -0
  121. package/dist/native/durability.test.d.ts.map +1 -0
  122. package/dist/native/durability.test.js +976 -0
  123. package/dist/native/durability.test.js.map +1 -0
  124. package/dist/native/filesystem-policy.test.d.ts +2 -0
  125. package/dist/native/filesystem-policy.test.d.ts.map +1 -0
  126. package/dist/native/filesystem-policy.test.js +136 -0
  127. package/dist/native/filesystem-policy.test.js.map +1 -0
  128. package/dist/native/grok.d.ts +2 -0
  129. package/dist/native/grok.d.ts.map +1 -0
  130. package/dist/native/grok.js +17 -0
  131. package/dist/native/grok.js.map +1 -0
  132. package/dist/native/host.d.ts +2 -0
  133. package/dist/native/host.d.ts.map +1 -0
  134. package/dist/native/host.js +129 -0
  135. package/dist/native/host.js.map +1 -0
  136. package/dist/native/index.d.ts +7 -0
  137. package/dist/native/index.d.ts.map +1 -0
  138. package/dist/native/index.js +6 -0
  139. package/dist/native/index.js.map +1 -0
  140. package/dist/native/ipc.d.ts +108 -0
  141. package/dist/native/ipc.d.ts.map +1 -0
  142. package/dist/native/ipc.js +181 -0
  143. package/dist/native/ipc.js.map +1 -0
  144. package/dist/native/manager.d.ts +61 -0
  145. package/dist/native/manager.d.ts.map +1 -0
  146. package/dist/native/manager.js +850 -0
  147. package/dist/native/manager.js.map +1 -0
  148. package/dist/native/process-tree.d.ts +26 -0
  149. package/dist/native/process-tree.d.ts.map +1 -0
  150. package/dist/native/process-tree.js +231 -0
  151. package/dist/native/process-tree.js.map +1 -0
  152. package/dist/native/process-tree.test.d.ts +2 -0
  153. package/dist/native/process-tree.test.d.ts.map +1 -0
  154. package/dist/native/process-tree.test.js +174 -0
  155. package/dist/native/process-tree.test.js.map +1 -0
  156. package/dist/native/process.d.ts +38 -0
  157. package/dist/native/process.d.ts.map +1 -0
  158. package/dist/native/process.js +246 -0
  159. package/dist/native/process.js.map +1 -0
  160. package/dist/native/process.test.d.ts +2 -0
  161. package/dist/native/process.test.d.ts.map +1 -0
  162. package/dist/native/process.test.js +56 -0
  163. package/dist/native/process.test.js.map +1 -0
  164. package/dist/native/profile-service.d.ts +5 -0
  165. package/dist/native/profile-service.d.ts.map +1 -0
  166. package/dist/native/profile-service.js +76 -0
  167. package/dist/native/profile-service.js.map +1 -0
  168. package/dist/native/registry.d.ts +20 -0
  169. package/dist/native/registry.d.ts.map +1 -0
  170. package/dist/native/registry.js +89 -0
  171. package/dist/native/registry.js.map +1 -0
  172. package/dist/native/registry.test.d.ts +2 -0
  173. package/dist/native/registry.test.d.ts.map +1 -0
  174. package/dist/native/registry.test.js +13 -0
  175. package/dist/native/registry.test.js.map +1 -0
  176. package/dist/native/review-sandbox.d.ts +12 -0
  177. package/dist/native/review-sandbox.d.ts.map +1 -0
  178. package/dist/native/review-sandbox.js +6 -0
  179. package/dist/native/review-sandbox.js.map +1 -0
  180. package/dist/native/review-sandbox.test.d.ts +2 -0
  181. package/dist/native/review-sandbox.test.d.ts.map +1 -0
  182. package/dist/native/review-sandbox.test.js +40 -0
  183. package/dist/native/review-sandbox.test.js.map +1 -0
  184. package/dist/native/service.d.ts +7 -0
  185. package/dist/native/service.d.ts.map +1 -0
  186. package/dist/native/service.js +151 -0
  187. package/dist/native/service.js.map +1 -0
  188. package/dist/native/storage.d.ts +11 -0
  189. package/dist/native/storage.d.ts.map +1 -0
  190. package/dist/native/storage.js +102 -0
  191. package/dist/native/storage.js.map +1 -0
  192. package/dist/native/supervisor.d.ts +2 -0
  193. package/dist/native/supervisor.d.ts.map +1 -0
  194. package/dist/native/supervisor.js +215 -0
  195. package/dist/native/supervisor.js.map +1 -0
  196. package/dist/native/types.d.ts +36 -0
  197. package/dist/native/types.d.ts.map +1 -0
  198. package/dist/native/types.js +2 -0
  199. package/dist/native/types.js.map +1 -0
  200. package/dist/native/worker-history.d.ts +16 -0
  201. package/dist/native/worker-history.d.ts.map +1 -0
  202. package/dist/native/worker-history.js +77 -0
  203. package/dist/native/worker-history.js.map +1 -0
  204. package/dist/native/worker-history.test.d.ts +2 -0
  205. package/dist/native/worker-history.test.d.ts.map +1 -0
  206. package/dist/native/worker-history.test.js +195 -0
  207. package/dist/native/worker-history.test.js.map +1 -0
  208. package/dist/native/worker-launch.d.ts +72 -0
  209. package/dist/native/worker-launch.d.ts.map +1 -0
  210. package/dist/native/worker-launch.js +134 -0
  211. package/dist/native/worker-launch.js.map +1 -0
  212. package/dist/native/worker-launch.test.d.ts +2 -0
  213. package/dist/native/worker-launch.test.d.ts.map +1 -0
  214. package/dist/native/worker-launch.test.js +61 -0
  215. package/dist/native/worker-launch.test.js.map +1 -0
  216. package/dist/native/worker-relocation.test.d.ts +2 -0
  217. package/dist/native/worker-relocation.test.d.ts.map +1 -0
  218. package/dist/native/worker-relocation.test.js +110 -0
  219. package/dist/native/worker-relocation.test.js.map +1 -0
  220. package/dist/native/worker-service.d.ts +4 -0
  221. package/dist/native/worker-service.d.ts.map +1 -0
  222. package/dist/native/worker-service.js +85 -0
  223. package/dist/native/worker-service.js.map +1 -0
  224. package/dist/native/workspace-files.d.ts +6 -0
  225. package/dist/native/workspace-files.d.ts.map +1 -0
  226. package/dist/native/workspace-files.js +62 -0
  227. package/dist/native/workspace-files.js.map +1 -0
  228. package/dist/native/workspace.d.ts +5 -0
  229. package/dist/native/workspace.d.ts.map +1 -0
  230. package/dist/native/workspace.js +120 -0
  231. package/dist/native/workspace.js.map +1 -0
  232. package/dist/task-init/index.d.ts +70 -0
  233. package/dist/task-init/index.d.ts.map +1 -0
  234. package/dist/task-init/index.js +124 -0
  235. package/dist/task-init/index.js.map +1 -0
  236. package/dist/task-init/task-document.d.ts +98 -0
  237. package/dist/task-init/task-document.d.ts.map +1 -0
  238. package/dist/task-init/task-document.js +184 -0
  239. package/dist/task-init/task-document.js.map +1 -0
  240. package/dist/task-init/write.d.ts +42 -0
  241. package/dist/task-init/write.d.ts.map +1 -0
  242. package/dist/task-init/write.js +63 -0
  243. package/dist/task-init/write.js.map +1 -0
  244. package/package.json +13 -4
  245. package/scripts/checklist-target.cjs +5 -3
  246. package/scripts/cursor-session-discovery.cjs +48 -0
  247. package/scripts/execution-template-cli.mjs +17 -18
  248. package/scripts/mark-checklist-step.cjs +1 -1
  249. package/scripts/review-filesystem.cjs +39 -0
  250. package/scripts/review-session.cjs +45 -0
  251. package/scripts/review-terminal.cjs +134 -0
  252. package/scripts/task-init-cli.mjs +166 -0
  253. package/scripts/worker-terminal-contract.cjs +15 -3
@@ -0,0 +1,110 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { randomUUID } from 'node:crypto';
4
+ import { chmodSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import test from 'node:test';
8
+ import { NativeSessionClient } from './client.js';
9
+ import { decodeRequest } from './ipc.js';
10
+ import { NativeSessionManager } from './manager.js';
11
+ import { NATIVE_WORKER_RESUME } from './worker-launch.js';
12
+ const executable = `#!/usr/bin/env node
13
+ if(process.argv.includes('--version')) { console.log('fixture 1'); process.exit(0); }
14
+ const send=m=>process.stdout.write(JSON.stringify(m)+'\\n');
15
+ require('node:readline').createInterface({input:process.stdin}).on('line',line=>{
16
+ const m=JSON.parse(line);
17
+ if(m.method==='initialize')send({id:m.id,result:{}});
18
+ if(m.method==='thread/start'||m.method==='thread/resume')send({id:m.id,result:{thread:{id:m.params.threadId||'saved-conversation'}}});
19
+ });
20
+ `;
21
+ test('worker relocation preserves lease/account and requires an explicit sibling-worktree move', async () => {
22
+ const root = mkdtempSync(join(tmpdir(), 'native-relocation-'));
23
+ const source = join(root, 'source');
24
+ const target = join(root, 'target');
25
+ const unrelated = join(root, 'unrelated');
26
+ const binary = join(root, 'codex');
27
+ writeFileSync(binary, executable);
28
+ chmodSync(binary, 0o700);
29
+ const git = (args, cwd = root) => execFileSync('git', args, { cwd, stdio: 'pipe' });
30
+ git(['init', source]);
31
+ git([
32
+ '-c',
33
+ 'user.name=Fixture',
34
+ '-c',
35
+ 'user.email=fixture@example.invalid',
36
+ 'commit',
37
+ '--allow-empty',
38
+ '-m',
39
+ 'test: initialize fixture',
40
+ ], source);
41
+ git(['worktree', 'add', '-b', 'target', target], source);
42
+ git(['init', unrelated]);
43
+ const manager = new NativeSessionManager(join(root, 'state'));
44
+ const launch = {
45
+ leaseId: randomUUID(),
46
+ executable: binary,
47
+ accountLabel: 'original',
48
+ safetyTier: 'full-auto',
49
+ environment: { set: { CODEX_HOME: join(root, 'account') }, unset: [] },
50
+ };
51
+ let sessionId;
52
+ try {
53
+ const before = await manager.ensure('owner', { sessionId: randomUUID(), runner: 'codex', cwd: source }, launch);
54
+ sessionId = before.id;
55
+ const params = {
56
+ sessionId: before.id,
57
+ resumeSessionId: before.nativeSessionId,
58
+ runner: 'codex',
59
+ cwd: target,
60
+ generation: before.generation,
61
+ commandId: randomUUID(),
62
+ };
63
+ await assert.rejects(manager.resumeWorker('owner', { ...params, relocation: { fromCwd: source } }, launch), /Close the current/);
64
+ await manager.closeWorker('owner', before.id, before.generation, launch.leaseId);
65
+ await assert.rejects(manager.resumeWorker('owner', params, launch), /working directory/);
66
+ await assert.rejects(manager.resumeWorker('owner', { ...params, relocation: { fromCwd: unrelated } }, launch), /exact previous workspace/);
67
+ await assert.rejects(manager.resumeWorker('owner', { ...params, cwd: unrelated, relocation: { fromCwd: source } }, launch), /sibling worktrees/);
68
+ await assert.rejects(manager.resumeWorker('owner', { ...params, relocation: { fromCwd: source } }, { ...launch, accountLabel: 'other' }), /account execution context/);
69
+ const cancelledCommand = randomUUID();
70
+ await manager.cancelWorker('owner', before.id, launch.leaseId, before.generation, undefined, cancelledCommand);
71
+ await assert.rejects(manager.resumeWorker('owner', { ...params, commandId: cancelledCommand, relocation: { fromCwd: source } }, launch), /cancelled before launch/);
72
+ const next = await manager.resumeWorker('owner', { ...params, relocation: { fromCwd: source } }, launch);
73
+ assert.equal(next.id, before.id);
74
+ assert.equal(next.nativeSessionId, before.nativeSessionId);
75
+ assert.equal(next.workerLeaseId, launch.leaseId);
76
+ assert.equal(next.cwd, target);
77
+ assert.notEqual(next.generation, before.generation);
78
+ await assert.rejects(manager.resumeWorker('owner', { ...params, relocation: { fromCwd: source } }, launch), /generation|lease/i);
79
+ }
80
+ finally {
81
+ if (sessionId)
82
+ await manager.close('owner', sessionId);
83
+ rmSync(root, { recursive: true, force: true });
84
+ }
85
+ });
86
+ test('private state routing separates owners and IPC preserves explicit relocation', () => {
87
+ const client = new NativeSessionClient('/private/native-state');
88
+ const sessionId = randomUUID();
89
+ assert.notEqual(client.workerStateDirectory('one', sessionId), client.workerStateDirectory('two', sessionId));
90
+ assert.ok(client.workerStateDirectory('one', sessionId).startsWith('/private/native-state/workers/'));
91
+ const request = decodeRequest({
92
+ method: NATIVE_WORKER_RESUME,
93
+ owner: 'owner',
94
+ params: {
95
+ sessionId,
96
+ runner: 'codex',
97
+ cwd: '/target',
98
+ generation: 'generation',
99
+ commandId: 'command',
100
+ resumeSessionId: 'saved',
101
+ relocation: { fromCwd: '/source' },
102
+ },
103
+ launch: { leaseId: randomUUID(), safetyTier: 'full-auto', environment: { set: {}, unset: [] } },
104
+ });
105
+ assert.equal(request.method, NATIVE_WORKER_RESUME);
106
+ if (request.method !== NATIVE_WORKER_RESUME)
107
+ throw new Error('Wrong request');
108
+ assert.deepEqual(request.params.relocation, { fromCwd: '/source' });
109
+ });
110
+ //# sourceMappingURL=worker-relocation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-relocation.test.js","sourceRoot":"","sources":["../../src/native/worker-relocation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { NativeSessionClient } from './client.js';
2
+ /** Private execution-node operation. The gateway derives launch settings from its run/slot config. */
3
+ export declare function routeNativeWorkerSession(client: NativeSessionClient, owner: string, method: string, value: unknown): Promise<unknown>;
4
+ //# sourceMappingURL=worker-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-service.d.ts","sourceRoot":"","sources":["../../src/native/worker-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAgBvD,sGAAsG;AACtG,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC,CA8FlB"}
@@ -0,0 +1,85 @@
1
+ import { decodeRequest } from './ipc.js';
2
+ import { NativeSessionMethodError } from './service.js';
3
+ import { NATIVE_WORKER_CANCEL, NATIVE_WORKER_CLOSE, NATIVE_WORKER_ENSURE, NATIVE_WORKER_INTERRUPT, NATIVE_WORKER_READ, NATIVE_WORKER_RESPOND, NATIVE_WORKER_RESUME, NATIVE_WORKER_SEND, NATIVE_WORKER_STATE, NATIVE_WORKER_TRANSFER, } from './worker-launch.js';
4
+ /** Private execution-node operation. The gateway derives launch settings from its run/slot config. */
5
+ export async function routeNativeWorkerSession(client, owner, method, value) {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value))
7
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Expected native worker parameters');
8
+ const params = value;
9
+ if (params.executionNodeId !== undefined && params.executionNodeId !== client.executionNodeId)
10
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Native worker targets another execution node');
11
+ if (method === NATIVE_WORKER_STATE) {
12
+ if (typeof params.sessionId !== 'string' ||
13
+ !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(params.sessionId))
14
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Expected a reserved worker session ID');
15
+ return { stateDirectory: client.prepareWorkerState(owner, params.sessionId) };
16
+ }
17
+ let request;
18
+ try {
19
+ request = decodeRequest({
20
+ method,
21
+ owner,
22
+ params,
23
+ launch: params.launch,
24
+ id: params.sessionId,
25
+ generation: params.generation,
26
+ leaseId: params.leaseId,
27
+ sourceLeaseId: params.sourceLeaseId,
28
+ resumeCommandId: params.resumeCommandId,
29
+ commandId: params.commandId,
30
+ text: params.text,
31
+ requestId: params.requestId,
32
+ response: params.response,
33
+ after: params.after,
34
+ limit: params.limit,
35
+ });
36
+ }
37
+ catch (error) {
38
+ throw new NativeSessionMethodError('INVALID_PARAMS', error.message);
39
+ }
40
+ try {
41
+ if (request.method === NATIVE_WORKER_READ)
42
+ return await client.readWorker(owner, request.id, request.leaseId, request.after, request.limit);
43
+ if (request.method === NATIVE_WORKER_RESPOND) {
44
+ await client.respondWorker(owner, { sessionId: request.id, generation: request.generation, leaseId: request.leaseId }, request.requestId, request.response);
45
+ return { responded: true };
46
+ }
47
+ if (request.method === NATIVE_WORKER_CANCEL)
48
+ return await client.cancelWorker(owner, {
49
+ sessionId: request.id,
50
+ generation: request.generation,
51
+ leaseId: request.leaseId,
52
+ sourceLeaseId: request.sourceLeaseId,
53
+ resumeCommandId: request.resumeCommandId,
54
+ });
55
+ if (request.method === NATIVE_WORKER_ENSURE)
56
+ return { session: await client.ensureWorker(owner, request.params, request.launch) };
57
+ if (request.method === NATIVE_WORKER_RESUME)
58
+ return { session: await client.resumeWorker(owner, request.params, request.launch) };
59
+ if (request.method === NATIVE_WORKER_SEND ||
60
+ request.method === NATIVE_WORKER_CLOSE ||
61
+ request.method === NATIVE_WORKER_INTERRUPT ||
62
+ request.method === NATIVE_WORKER_TRANSFER) {
63
+ const target = {
64
+ sessionId: request.id,
65
+ generation: request.generation,
66
+ leaseId: request.leaseId,
67
+ };
68
+ if (request.method === NATIVE_WORKER_SEND)
69
+ return await client.sendWorker(owner, target, request.commandId, request.text);
70
+ if (request.method === NATIVE_WORKER_CLOSE)
71
+ return { closed: true, session: await client.closeWorker(owner, target) };
72
+ if (request.method === NATIVE_WORKER_TRANSFER)
73
+ return { session: await client.transferWorker(owner, target, request.launch) };
74
+ await client.interruptWorker(owner, target);
75
+ return { interrupted: true };
76
+ }
77
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Unknown native worker operation');
78
+ }
79
+ catch (error) {
80
+ if (error instanceof NativeSessionMethodError)
81
+ throw error;
82
+ throw new NativeSessionMethodError('NATIVE_SESSION_ERROR', error.message);
83
+ }
84
+ }
85
+ //# sourceMappingURL=worker-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-service.js","sourceRoot":"","sources":["../../src/native/worker-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const WORKSPACE_TEXT_LIMIT: number;
2
+ /** Native workspace readers share lexical and symlink checks. Node lacks openat2;
3
+ * whole-path races against an agent with equivalent local OS access remain possible. */
4
+ export declare function workspacePath(root: string, relative: string, missing?: boolean): Promise<string>;
5
+ export declare function readWorkspaceText(root: string, relative: string): Promise<string>;
6
+ //# sourceMappingURL=workspace-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/native/workspace-files.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAEhD;wFACwF;AACxF,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,UAAQ,GACd,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBvF"}
@@ -0,0 +1,62 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, open, realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ export const WORKSPACE_TEXT_LIMIT = 1024 * 1024;
5
+ /** Native workspace readers share lexical and symlink checks. Node lacks openat2;
6
+ * whole-path races against an agent with equivalent local OS access remain possible. */
7
+ export async function workspacePath(root, relative, missing = false) {
8
+ // Reject even legal POSIX backslash filenames to avoid separator ambiguity across clients.
9
+ if (path.isAbsolute(relative) || relative.includes('\\') || relative.includes('\0'))
10
+ throw new Error('Use a relative workspace path');
11
+ const parts = relative.split('/').filter((part) => part && part !== '.');
12
+ if (parts.some((part) => part === '..' || part.toLowerCase() === '.git'))
13
+ throw new Error('Path outside workspace is not allowed');
14
+ const base = await realpath(root);
15
+ const target = path.resolve(base, ...parts);
16
+ const within = path.relative(base, target);
17
+ if (within === '..' || within.startsWith(`..${path.sep}`) || path.isAbsolute(within))
18
+ throw new Error('Path outside workspace is not allowed');
19
+ let current = base;
20
+ for (const part of parts) {
21
+ current = path.join(current, part);
22
+ try {
23
+ if ((await lstat(current)).isSymbolicLink())
24
+ throw new Error('Workspace symlinks are not readable');
25
+ }
26
+ catch (error) {
27
+ if (missing && error.code === 'ENOENT')
28
+ break;
29
+ throw error;
30
+ }
31
+ }
32
+ return target;
33
+ }
34
+ export async function readWorkspaceText(root, relative) {
35
+ const target = await workspacePath(root, relative);
36
+ const handle = await open(target, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
37
+ try {
38
+ const info = await handle.stat();
39
+ if (!info.isFile())
40
+ throw new Error('Select a regular file');
41
+ if (info.size > WORKSPACE_TEXT_LIMIT)
42
+ throw new Error('File exceeds the 1 MiB viewer limit');
43
+ const buffer = Buffer.alloc(WORKSPACE_TEXT_LIMIT + 1);
44
+ let length = 0;
45
+ while (length < buffer.length) {
46
+ const { bytesRead } = await handle.read(buffer, length, buffer.length - length, length);
47
+ if (!bytesRead)
48
+ break;
49
+ length += bytesRead;
50
+ }
51
+ if (length > WORKSPACE_TEXT_LIMIT)
52
+ throw new Error('File exceeds the 1 MiB viewer limit');
53
+ const bytes = buffer.subarray(0, length);
54
+ if (bytes.includes(0))
55
+ throw new Error('Binary files cannot be displayed');
56
+ return new TextDecoder('utf-8', { fatal: true }).decode(bytes);
57
+ }
58
+ finally {
59
+ await handle.close();
60
+ }
61
+ }
62
+ //# sourceMappingURL=workspace-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-files.js","sourceRoot":"","sources":["../../src/native/workspace-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { NativeWorkspaceChangesResult, NativeWorkspaceListResult } from '@farmslot/protocol';
2
+ export declare function nativeWorkspaceList(cwd: string, relative: string): Promise<NativeWorkspaceListResult>;
3
+ export declare function nativeWorkspaceChanges(cwd: string, relative?: string): Promise<NativeWorkspaceChangesResult>;
4
+ export declare function nativeWorkspaceDiff(cwd: string, relative: string): Promise<string>;
5
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/native/workspace.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AA6ClG,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,CAAC,CAkBpC;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,SAAM,GACb,OAAO,CAAC,4BAA4B,CAAC,CA0BvC;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiCxF"}
@@ -0,0 +1,120 @@
1
+ import { execFile as execFileCallback } from 'node:child_process';
2
+ import { opendir, realpath } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { readWorkspaceText, WORKSPACE_TEXT_LIMIT, workspacePath } from './workspace-files.js';
6
+ const execFile = promisify(execFileCallback);
7
+ const STATUS_OUTPUT_LIMIT = 8 * WORKSPACE_TEXT_LIMIT;
8
+ const DIFF_TOO_LARGE = 'Diff exceeds the 1 MiB viewer limit.';
9
+ async function git(cwd, args, maxBuffer = WORKSPACE_TEXT_LIMIT) {
10
+ try {
11
+ const { stdout } = await execFile('git', [
12
+ '--literal-pathspecs',
13
+ '--no-optional-locks',
14
+ '-c',
15
+ 'core.quotePath=false',
16
+ '-c',
17
+ 'core.fsmonitor=false',
18
+ ...args,
19
+ ], {
20
+ cwd,
21
+ maxBuffer,
22
+ timeout: 15_000,
23
+ // Explicit directory arguments cannot be redirected by inherited Git plumbing variables.
24
+ env: Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith('GIT_'))),
25
+ });
26
+ return stdout;
27
+ }
28
+ catch (error) {
29
+ // Output limits are expected for large workspaces; preserve other Git errors.
30
+ if (error.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER')
31
+ throw new Error(args[0] === 'status'
32
+ ? 'Changes list exceeds the 8 MiB limit. Use Files to inspect individual paths.'
33
+ : DIFF_TOO_LARGE, { cause: error });
34
+ throw error;
35
+ }
36
+ }
37
+ export async function nativeWorkspaceList(cwd, relative) {
38
+ const directory = await opendir(await workspacePath(cwd, relative));
39
+ const entries = [];
40
+ let truncated = false;
41
+ for await (const entry of directory) {
42
+ if (entry.name.toLowerCase() === '.git' || (!entry.isFile() && !entry.isDirectory()))
43
+ continue;
44
+ if (entries.length === 500) {
45
+ truncated = true;
46
+ break;
47
+ }
48
+ entries.push({
49
+ path: [relative === '.' ? '' : relative, entry.name].filter(Boolean).join('/'),
50
+ name: entry.name,
51
+ directory: entry.isDirectory(),
52
+ });
53
+ }
54
+ entries.sort((a, b) => Number(b.directory) - Number(a.directory) || a.name.localeCompare(b.name));
55
+ return { entries, truncated };
56
+ }
57
+ export async function nativeWorkspaceChanges(cwd, relative = '.') {
58
+ cwd = await realpath(cwd);
59
+ if (relative !== '.')
60
+ await workspacePath(cwd, relative, true);
61
+ const raw = await git(cwd, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--', relative], STATUS_OUTPUT_LIMIT);
62
+ const repository = (await git(cwd, ['rev-parse', '--show-toplevel'])).replace(/\n$/, '');
63
+ const records = raw.split('\0');
64
+ const files = [];
65
+ let truncated = false;
66
+ for (let i = 0; i < records.length; i++) {
67
+ if (!records[i])
68
+ continue;
69
+ if (files.length === 500) {
70
+ truncated = true;
71
+ break;
72
+ }
73
+ const status = records[i].slice(0, 2);
74
+ const file = path.relative(cwd, path.join(repository, records[i].slice(3)));
75
+ if (file === '..' || file.startsWith('../') || path.isAbsolute(file))
76
+ throw new Error('Git returned a path outside the session workspace');
77
+ if (status.includes('R') || status.includes('C'))
78
+ i++;
79
+ files.push({ path: file, status });
80
+ }
81
+ return { files, truncated };
82
+ }
83
+ export async function nativeWorkspaceDiff(cwd, relative) {
84
+ await workspacePath(cwd, relative, true);
85
+ const changes = await nativeWorkspaceChanges(cwd, relative);
86
+ const file = changes.files.find((candidate) => candidate.path === relative);
87
+ if (!file)
88
+ return '';
89
+ if (file.status === '??') {
90
+ const text = await readWorkspaceText(cwd, relative);
91
+ if (!text)
92
+ return '';
93
+ const lines = text.split('\n');
94
+ if (lines.at(-1) === '')
95
+ lines.pop();
96
+ const name = JSON.stringify(`b/${relative}`);
97
+ const diff = `diff --git ${JSON.stringify(`a/${relative}`)} ${name}\nnew file mode 100644\n--- /dev/null\n+++ ${name}\n@@ -0,0 +1,${lines.length} @@\n${lines.map((line) => `+${line}\n`).join('')}${text.endsWith('\n') ? '' : '\\n'}`;
98
+ if (Buffer.byteLength(diff) > WORKSPACE_TEXT_LIMIT)
99
+ throw new Error(DIFF_TOO_LARGE);
100
+ return diff;
101
+ }
102
+ // HEAD shows both staged and unstaged workspace changes. On an unborn branch,
103
+ // staged additions have no HEAD, so use the empty tree produced by Git itself.
104
+ const head = await git(cwd, ['rev-parse', '--verify', '--quiet', 'HEAD']).catch(async (error) => {
105
+ if (error.code !== 1)
106
+ throw error;
107
+ return git(cwd, ['hash-object', '-t', 'tree', '/dev/null']);
108
+ });
109
+ return git(cwd, [
110
+ 'diff',
111
+ '--no-ext-diff',
112
+ '--no-textconv',
113
+ '--no-renames',
114
+ '--relative',
115
+ head.trim(),
116
+ '--',
117
+ relative,
118
+ ]);
119
+ }
120
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/native/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { type ExecutionTemplateReference, type ExecutionTemplateRunMode, type TemplateProvenance, type WorkerTerminalContractDocument } from '@farmslot/protocol';
2
+ import type { ExecutionTemplateSource } from '../execution-template/types.js';
3
+ import { type HandoffExecutionTemplate, type HandoffMetadata, type HandoffSourceKind } from './task-document.js';
4
+ import { type WrittenTaskDir } from './write.js';
5
+ export * from './task-document.js';
6
+ export * from './write.js';
7
+ export { renderTemplatePlaceholders } from '@farmslot/protocol';
8
+ /** Built-in terminal contract for a flow, as the gateway resolves it without project overrides. */
9
+ export declare function builtinTerminalContract(flow: string, options?: {
10
+ mode?: string;
11
+ now?: string;
12
+ }): WorkerTerminalContractDocument;
13
+ export interface TaskInitTemplateSelection {
14
+ sources: ExecutionTemplateSource[];
15
+ explicitId?: string;
16
+ }
17
+ export interface TaskInitSpec {
18
+ /** Task directory, absolute or relative to cwd; created when missing. */
19
+ taskDir: string;
20
+ /** How the worker should refer to the task dir (`TASK_DIR` placeholder); defaults to `taskDir` as given. */
21
+ taskDirLabel?: string;
22
+ flow: string;
23
+ /**
24
+ * Run mode of this run. Templates carry none; it selects project default
25
+ * rules (`when.runMode`), fills `{{MODE}}`, and picks the terminal contract.
26
+ */
27
+ runMode?: ExecutionTemplateRunMode;
28
+ platform: string;
29
+ domain?: string;
30
+ template: TaskInitTemplateSelection;
31
+ task: {
32
+ title: string;
33
+ description?: string;
34
+ acceptanceCriteria?: ReadonlyArray<string>;
35
+ sourceKind: HandoffSourceKind;
36
+ ticket?: string;
37
+ sourceRef?: string;
38
+ };
39
+ handoff: {
40
+ surface: string;
41
+ project: string;
42
+ attemptId?: string;
43
+ repo?: string;
44
+ startedAt?: string;
45
+ };
46
+ /** Extra `{{PLACEHOLDER}}` values for the checklist and task block. */
47
+ vars?: Record<string, string>;
48
+ modePreamble?: string;
49
+ /** Addendum template inserted before the checklist pointer; rendered with the same vars as the checklist. */
50
+ addendum?: string | null;
51
+ markCommand?: string;
52
+ terminalContract?: WorkerTerminalContractDocument;
53
+ bugInput?: unknown;
54
+ }
55
+ export interface TaskInitResult extends WrittenTaskDir {
56
+ executionTemplate: HandoffExecutionTemplate;
57
+ handoffMetadata: HandoffMetadata;
58
+ }
59
+ export declare function taskInit(spec: TaskInitSpec): Promise<TaskInitResult>;
60
+ export interface TaskProvenance {
61
+ executionTemplate?: HandoffExecutionTemplate | ExecutionTemplateReference;
62
+ templateProvenance?: Omit<TemplateProvenance, 'executionTemplate'>;
63
+ }
64
+ /**
65
+ * Selected-template provenance for a task dir. Reads `inputs/handoff.json`;
66
+ * falls back to the pre-0.9 `inputs/template-provenance.json` for task dirs
67
+ * written before the merge. Drop the fallback next release.
68
+ */
69
+ export declare function readTaskProvenance(taskDir: string): TaskProvenance | null;
70
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/task-init/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACpC,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAIL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAUhE,mGAAmG;AACnG,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5C,8BAA8B,CAMhC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,UAAU,EAAE,iBAAiB,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6GAA6G;IAC7G,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAmF1E;AAED,MAAM,WAAW,cAAc;IAC7B,iBAAiB,CAAC,EAAE,wBAAwB,GAAG,0BAA0B,CAAC;IAC1E,kBAAkB,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;CACpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAgBzE"}