@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,40 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFile } from 'node:child_process';
3
+ import { mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import { promisify } from 'node:util';
8
+ import { hostReviewSandboxAvailable, reviewProcessSandbox } from './review-sandbox.js';
9
+ const exec = promisify(execFile);
10
+ test('host review sandbox protects source, shared git metadata and unrelated files while reports stay writable', { skip: !hostReviewSandboxAvailable() }, async () => {
11
+ const root = await realpath(await mkdtemp(join(tmpdir(), 'review-permissions-')));
12
+ const source = join(root, 'source'), output = join(root, 'reports'), metadata = join(root, 'git'), other = join(root, 'other');
13
+ try {
14
+ for (const dir of [source, output, metadata, other])
15
+ await mkdir(dir);
16
+ for (const dir of [source, metadata, other])
17
+ await writeFile(join(dir, 'file'), 'original');
18
+ const { sandbox } = await reviewProcessSandbox({ readOnlyRoots: [source, metadata], writableRoots: [output] }, []);
19
+ const program = `const fs=require('node:fs');const roots=JSON.parse(process.argv[1]);const results={};for(const [name,root]of Object.entries(roots)){try{fs.writeFileSync(root+'/file','changed');results[name]=true;}catch(e){if(!['EPERM','EACCES'].includes(e.code))throw e;results[name]=false;}}console.log(JSON.stringify(results));`;
20
+ const result = await exec(sandbox.executable, [
21
+ ...sandbox.args,
22
+ process.execPath,
23
+ '-e',
24
+ program,
25
+ JSON.stringify({ source, metadata, other, output }),
26
+ ]);
27
+ assert.deepEqual(JSON.parse(result.stdout), {
28
+ source: false,
29
+ metadata: false,
30
+ other: false,
31
+ output: true,
32
+ });
33
+ assert.equal(await readFile(join(source, 'file'), 'utf8'), 'original');
34
+ assert.equal(await readFile(join(output, 'file'), 'utf8'), 'changed');
35
+ }
36
+ finally {
37
+ await rm(root, { recursive: true, force: true });
38
+ }
39
+ });
40
+ //# sourceMappingURL=review-sandbox.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-sandbox.test.js","sourceRoot":"","sources":["../../src/native/review-sandbox.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEvF,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAI,CACF,0GAA0G,EAC1G,EAAE,IAAI,EAAE,CAAC,0BAA0B,EAAE,EAAE,EACvC,KAAK,IAAI,EAAE;IACT,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EACjC,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAC9B,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAC5B,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;QAC5F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,oBAAoB,CAC5C,EAAE,aAAa,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,EAC9D,EAAE,CACH,CAAC;QACF,MAAM,OAAO,GAAG,2TAA2T,CAAC;QAC5U,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC5C,GAAG,OAAO,CAAC,IAAI;YACf,OAAO,CAAC,QAAQ;YAChB,IAAI;YACJ,OAAO;YACP,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC1C,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,KAAK;YACf,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { NativeSessionClient } from './client.js';
2
+ export declare class NativeSessionMethodError extends Error {
3
+ readonly code: 'INVALID_PARAMS' | 'NATIVE_SESSION_ERROR';
4
+ constructor(code: 'INVALID_PARAMS' | 'NATIVE_SESSION_ERROR', message: string);
5
+ }
6
+ export declare function routeNativeSession(client: NativeSessionClient, principal: string, method: string, value: unknown): Promise<unknown>;
7
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/native/service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAKvD,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,sBAAsB;gBAA/C,IAAI,EAAE,gBAAgB,GAAG,sBAAsB,EACxD,OAAO,EAAE,MAAM;CAKlB;AASD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,OAAO,CAAC,CAyJlB"}
@@ -0,0 +1,151 @@
1
+ import { Methods, } from '@farmslot/protocol';
2
+ import { NATIVE_PROFILE_METHODS, routeNativeProfile } from './profile-service.js';
3
+ import { nativeWorkspaceChanges, nativeWorkspaceDiff, nativeWorkspaceList } from './workspace.js';
4
+ import { readWorkspaceText } from './workspace-files.js';
5
+ export class NativeSessionMethodError extends Error {
6
+ constructor(code, message) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'NativeSessionMethodError';
10
+ }
11
+ }
12
+ function string(params, key) {
13
+ const value = params[key];
14
+ if (typeof value !== 'string' || !value.trim())
15
+ throw new NativeSessionMethodError('INVALID_PARAMS', `${key} must be a nonempty string`);
16
+ return value;
17
+ }
18
+ export async function routeNativeSession(client, principal, method, value) {
19
+ if (!value || typeof value !== 'object' || Array.isArray(value))
20
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Expected native session parameters');
21
+ const p = value;
22
+ if ('launch' in p)
23
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Worker launch settings are supplied by run dispatch');
24
+ if (p.executionNodeId !== undefined && p.executionNodeId !== client.executionNodeId)
25
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Native session targets another execution node');
26
+ try {
27
+ if (NATIVE_PROFILE_METHODS.includes(method))
28
+ return await routeNativeProfile(client, principal, method, p);
29
+ switch (method) {
30
+ case Methods.NATIVE_SESSION_WORKSPACE_LIST:
31
+ case Methods.NATIVE_SESSION_WORKSPACE_READ:
32
+ case Methods.NATIVE_SESSION_WORKSPACE_CHANGES:
33
+ case Methods.NATIVE_SESSION_WORKSPACE_DIFF: {
34
+ const sessionId = string(p, 'sessionId');
35
+ const inspect = async () => {
36
+ const { session } = await client.read(principal, sessionId, undefined, 1);
37
+ if (session.workerManaged) {
38
+ const worker = p.worker;
39
+ if (!worker || typeof worker !== 'object' || Array.isArray(worker))
40
+ throw new Error('Worker workspace requires its pinned run context');
41
+ const target = worker;
42
+ if (session.workerLeaseId !== target.leaseId ||
43
+ session.generation !== target.generation ||
44
+ ['closed', 'failed', 'closing'].includes(session.state))
45
+ throw new Error('Current workspace is unavailable for a closed or transferred worker');
46
+ }
47
+ else if (p.worker !== undefined)
48
+ throw new Error('Worker workspace target is not a worker');
49
+ return session;
50
+ };
51
+ const session = await inspect();
52
+ let result;
53
+ if (method === Methods.NATIVE_SESSION_WORKSPACE_CHANGES)
54
+ result = await nativeWorkspaceChanges(session.cwd);
55
+ else {
56
+ const path = string(p, 'path');
57
+ if (method === Methods.NATIVE_SESSION_WORKSPACE_LIST)
58
+ result = await nativeWorkspaceList(session.cwd, path);
59
+ else if (method === Methods.NATIVE_SESSION_WORKSPACE_DIFF)
60
+ result = { path, diff: await nativeWorkspaceDiff(session.cwd, path) };
61
+ else
62
+ result = { path, content: await readWorkspaceText(session.cwd, path) };
63
+ }
64
+ // File reads await the OS. Refuse their result if a handoff won during that await.
65
+ if (session.workerManaged)
66
+ await inspect();
67
+ return result;
68
+ }
69
+ case Methods.NATIVE_SESSION_CREATE:
70
+ case Methods.NATIVE_SESSION_ENSURE: {
71
+ const params = {
72
+ runner: string(p, 'runner'),
73
+ cwd: string(p, 'cwd'),
74
+ };
75
+ if (p.model !== undefined)
76
+ params.model = string(p, 'model');
77
+ if (p.profileId !== undefined)
78
+ params.profileId = string(p, 'profileId');
79
+ if (p.accountContextId !== undefined)
80
+ params.accountContextId = string(p, 'accountContextId');
81
+ if (p.mode !== undefined) {
82
+ if (p.mode !== 'default' && p.mode !== 'plan')
83
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Unknown native interaction mode');
84
+ params.mode = p.mode;
85
+ }
86
+ if (method === Methods.NATIVE_SESSION_ENSURE) {
87
+ if (p.resumeSessionId !== undefined)
88
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Reserved sessionId is not for resume');
89
+ return {
90
+ session: await client.ensure(principal, {
91
+ ...params,
92
+ sessionId: string(p, 'sessionId'),
93
+ }),
94
+ };
95
+ }
96
+ if (p.resumeSessionId !== undefined)
97
+ params.resumeSessionId = string(p, 'resumeSessionId');
98
+ return { session: await client.create(principal, params) };
99
+ }
100
+ case Methods.NATIVE_SESSION_LIST:
101
+ return { sessions: await client.list(principal) };
102
+ case Methods.NATIVE_SESSION_READ:
103
+ if (p.limit !== undefined && typeof p.limit !== 'number')
104
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'limit must be an integer');
105
+ if (p.after !== undefined && typeof p.after !== 'number')
106
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'after must be an integer');
107
+ return await client.read(principal, string(p, 'sessionId'), p.after, p.limit);
108
+ case Methods.NATIVE_SESSION_SEND: {
109
+ const commandId = string(p, 'commandId');
110
+ return await client.send(principal, string(p, 'sessionId'), commandId, string(p, 'text'));
111
+ }
112
+ case Methods.NATIVE_SESSION_RESPOND: {
113
+ const response = {};
114
+ if (p.decision !== undefined) {
115
+ if (p.decision !== 'approve' && p.decision !== 'deny')
116
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Unknown approval decision');
117
+ response.decision = p.decision;
118
+ }
119
+ if (p.answers !== undefined) {
120
+ if (!p.answers ||
121
+ typeof p.answers !== 'object' ||
122
+ Array.isArray(p.answers) ||
123
+ !Object.values(p.answers).every((answers) => Array.isArray(answers) && answers.every((answer) => typeof answer === 'string')))
124
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'answers must map question IDs to string arrays');
125
+ response.answers = p.answers;
126
+ }
127
+ if (Boolean(response.decision) === Boolean(response.answers))
128
+ throw new NativeSessionMethodError('INVALID_PARAMS', 'Supply either a decision or answers');
129
+ await client.respond(principal, string(p, 'sessionId'), string(p, 'requestId'), response);
130
+ return { responded: true };
131
+ }
132
+ case Methods.NATIVE_SESSION_INTERRUPT:
133
+ await client.interrupt(principal, string(p, 'sessionId'));
134
+ return { interrupted: true };
135
+ case Methods.NATIVE_SESSION_CLOSE:
136
+ await client.close(principal, string(p, 'sessionId'));
137
+ return {
138
+ closed: true,
139
+ session: (await client.read(principal, string(p, 'sessionId'))).session,
140
+ };
141
+ default:
142
+ throw new Error('Unknown native session method');
143
+ }
144
+ }
145
+ catch (error) {
146
+ if (error instanceof NativeSessionMethodError)
147
+ throw error;
148
+ throw new NativeSessionMethodError('NATIVE_SESSION_ERROR', error.message);
149
+ }
150
+ }
151
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/native/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Drop only an incomplete final write before any recovery reader or writer proceeds. */
2
+ export declare function readJournal(path: string): string[];
3
+ export declare function privateDirectory(path: string): void;
4
+ export declare function durableWrite(path: string, value: unknown): void;
5
+ export declare function readJson<T>(path: string): T;
6
+ export declare function alive(pid: number): boolean;
7
+ export declare function signalGroup(pid: number, signal: NodeJS.Signals): void;
8
+ /** Structured process argv evidence, never runner stdout or a terminal rendering. */
9
+ export declare function matchesProcess(pid: number, identity: string): boolean;
10
+ export declare function appendDurable(path: string, value: unknown): void;
11
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/native/storage.ts"],"names":[],"mappings":"AAcA,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAalD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKnD;AACD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAgB/D;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAM3C;AACD,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ1C;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAOrE;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAcrE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAQhE"}
@@ -0,0 +1,102 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { closeSync, fsyncSync, ftruncateSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync, } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ /** Drop only an incomplete final write before any recovery reader or writer proceeds. */
5
+ export function readJournal(path) {
6
+ const fd = openSync(path, 'r+');
7
+ try {
8
+ const bytes = readFileSync(fd);
9
+ const end = bytes.lastIndexOf(10) + 1;
10
+ if (end < bytes.length) {
11
+ ftruncateSync(fd, end);
12
+ fsyncSync(fd);
13
+ }
14
+ return bytes.subarray(0, end).toString().split('\n').filter(Boolean);
15
+ }
16
+ finally {
17
+ closeSync(fd);
18
+ }
19
+ }
20
+ export function privateDirectory(path) {
21
+ mkdirSync(path, { recursive: true, mode: 0o700 });
22
+ const stat = lstatSync(path);
23
+ if (!stat.isDirectory() || stat.uid !== process.getuid?.() || (stat.mode & 0o077) !== 0)
24
+ throw new Error(`Native state directory must be owned by this OS user with mode 0700: ${path}`);
25
+ }
26
+ export function durableWrite(path, value) {
27
+ const temp = `${path}.${process.pid}.tmp`;
28
+ const fd = openSync(temp, 'w', 0o600);
29
+ try {
30
+ writeFileSync(fd, JSON.stringify(value));
31
+ fsyncSync(fd);
32
+ }
33
+ finally {
34
+ closeSync(fd);
35
+ }
36
+ renameSync(temp, path);
37
+ const directory = openSync(dirname(path), 'r');
38
+ try {
39
+ fsyncSync(directory);
40
+ }
41
+ finally {
42
+ closeSync(directory);
43
+ }
44
+ }
45
+ export function readJson(path) {
46
+ const stat = lstatSync(path);
47
+ if (!stat.isFile() || stat.uid !== process.getuid?.() || (stat.mode & 0o077) !== 0)
48
+ throw new Error('Native state file must be private and owned by this OS user');
49
+ // Only trusted, private runtime files use this decoder. IPC validates its input separately.
50
+ return JSON.parse(readFileSync(path, 'utf8'));
51
+ }
52
+ export function alive(pid) {
53
+ try {
54
+ process.kill(pid, 0);
55
+ return true;
56
+ }
57
+ catch (error) {
58
+ if (error.code === 'ESRCH')
59
+ return false;
60
+ throw error;
61
+ }
62
+ }
63
+ export function signalGroup(pid, signal) {
64
+ try {
65
+ process.kill(-pid, signal);
66
+ }
67
+ catch (error) {
68
+ // A group that already exited is the requested stopped outcome.
69
+ if (error.code !== 'ESRCH')
70
+ throw error;
71
+ }
72
+ }
73
+ /** Structured process argv evidence, never runner stdout or a terminal rendering. */
74
+ export function matchesProcess(pid, identity) {
75
+ if (!alive(pid))
76
+ return false;
77
+ try {
78
+ const argv = execFileSync('ps', ['-p', String(pid), '-o', 'command='], {
79
+ encoding: 'utf8',
80
+ stdio: ['ignore', 'pipe', 'pipe'],
81
+ timeout: 1_000,
82
+ });
83
+ return argv.split(/\s+/).includes(identity);
84
+ }
85
+ catch (error) {
86
+ // The process may exit between the liveness and argv reads. No signal is needed then.
87
+ if (!alive(pid))
88
+ return false;
89
+ throw error;
90
+ }
91
+ }
92
+ export function appendDurable(path, value) {
93
+ const fd = openSync(path, 'a', 0o600);
94
+ try {
95
+ writeFileSync(fd, `${JSON.stringify(value)}\n`);
96
+ fsyncSync(fd);
97
+ }
98
+ finally {
99
+ closeSync(fd);
100
+ }
101
+ }
102
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/native/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/native/supervisor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,215 @@
1
+ import { fork } from 'node:child_process';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { existsSync, mkdirSync, readdirSync, rmSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { socketDirectory } from './ipc.js';
7
+ import { NativeProcessTree } from './process-tree.js';
8
+ import { alive, appendDurable, durableWrite, matchesProcess, privateDirectory, readJournal, readJson, signalGroup, } from './storage.js';
9
+ const root = process.argv[2];
10
+ process.umask(0o077);
11
+ privateDirectory(root);
12
+ const lock = join(root, 'lock');
13
+ // Serializes stale-lock reclamation as well as first start. A torn claim fails closed.
14
+ const claim = join(root, 'claim');
15
+ try {
16
+ mkdirSync(claim, { mode: 0o700 });
17
+ }
18
+ catch (error) {
19
+ if (error.code === 'EEXIST')
20
+ process.exit(0);
21
+ throw error;
22
+ }
23
+ let acquired = false;
24
+ try {
25
+ let occupied = false;
26
+ if (existsSync(lock)) {
27
+ const previous = readJson(join(lock, 'owner.json'));
28
+ occupied = alive(previous.pid);
29
+ if (!occupied) {
30
+ const previousHost = existsSync(join(root, 'worker.json'))
31
+ ? readJson(join(root, 'worker.json'))
32
+ : undefined;
33
+ if (previousHost && alive(previousHost.pid))
34
+ throw new Error('Native host survived its supervisor; refusing competing ownership');
35
+ const cleanupPath = join(root, 'cleanup.json');
36
+ if (existsSync(cleanupPath) && readJson(cleanupPath).state !== 'complete')
37
+ throw new Error('Previous native cleanup is unresolved; verify owned processes before recovery');
38
+ rmSync(lock, { recursive: true });
39
+ }
40
+ }
41
+ if (!occupied) {
42
+ mkdirSync(lock, { mode: 0o700 });
43
+ durableWrite(join(lock, 'owner.json'), { pid: process.pid });
44
+ acquired = true;
45
+ }
46
+ }
47
+ finally {
48
+ rmSync(claim, { recursive: true });
49
+ }
50
+ if (!acquired)
51
+ process.exit(0);
52
+ rmSync(join(root, 'ready.json'), { force: true });
53
+ const socket = join(socketDirectory(root), 's');
54
+ privateDirectory(socketDirectory(root));
55
+ durableWrite(join(root, 'host.json'), {
56
+ supportsEnsure: true,
57
+ supportsWorkers: true,
58
+ supportsWorkerResumeFence: true,
59
+ supportsWorkerRelocation: true,
60
+ supportsProfiles: true,
61
+ executionNodeId: process.env.FARMSLOT_NATIVE_EXECUTION_NODE_ID ?? 'local',
62
+ pid: process.pid,
63
+ token: randomBytes(32).toString('hex'),
64
+ socket,
65
+ });
66
+ const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';
67
+ const child = fork(fileURLToPath(new URL(`./host.${extension}`, import.meta.url)), [root], {
68
+ stdio: ['ignore', 'inherit', 'inherit', 'ipc'],
69
+ });
70
+ let tree;
71
+ let stopObservingTree;
72
+ let hostReleased = false;
73
+ let stopping = false;
74
+ let settled = false;
75
+ let failure;
76
+ function stopHost(error) {
77
+ if (error !== undefined) {
78
+ failure = error instanceof Error ? error.message : String(error);
79
+ process.stderr.write(`Native supervisor stopping host: ${failure}\n`);
80
+ }
81
+ if (stopping)
82
+ return;
83
+ stopping = true;
84
+ stopObservingTree?.();
85
+ try {
86
+ rmSync(join(root, 'ready.json'), { force: true });
87
+ }
88
+ catch (error) {
89
+ // Stopping the child still takes precedence; cleanup retries the readiness removal.
90
+ failure = `${failure ?? 'Native stop'}; readiness removal: ${error.message}`;
91
+ }
92
+ if (child.pid)
93
+ child.kill(error === undefined ? 'SIGTERM' : 'SIGKILL');
94
+ }
95
+ // Register failure handlers before any post-fork filesystem or process probes.
96
+ child.on('message', (message) => {
97
+ if (message !== 'ready' || stopping)
98
+ return;
99
+ try {
100
+ durableWrite(join(root, 'ready.json'), { pid: child.pid });
101
+ }
102
+ catch (error) {
103
+ stopHost(error);
104
+ }
105
+ });
106
+ child.on('error', (error) => {
107
+ if (stopping) {
108
+ // A failed stop keeps the owner alive and readiness withdrawn. Never release its lock.
109
+ durableWrite(join(root, 'cleanup.json'), {
110
+ hostPid: child.pid,
111
+ state: 'unknown',
112
+ error: error.message,
113
+ });
114
+ process.stderr.write(`Native host stop failed: ${error.message}\n`);
115
+ }
116
+ else
117
+ stopHost(error);
118
+ });
119
+ function settle() {
120
+ if (settled)
121
+ return;
122
+ settled = true;
123
+ void cleanup().then(() => process.exit(1), (error) => {
124
+ durableWrite(join(root, 'cleanup.json'), {
125
+ hostPid: child.pid,
126
+ state: 'unknown',
127
+ error: error.message,
128
+ observedProcesses: tree?.snapshot(),
129
+ });
130
+ process.stderr.write(`Native cleanup failed: ${error.message}\n`);
131
+ process.exit(1);
132
+ });
133
+ }
134
+ child.once('exit', settle);
135
+ // Spawn failure may emit close without exit; no PID means no host was released.
136
+ child.once('close', () => {
137
+ if (!child.pid)
138
+ settle();
139
+ });
140
+ for (const signal of ['SIGTERM', 'SIGINT'])
141
+ process.on(signal, () => stopHost());
142
+ try {
143
+ durableWrite(join(root, 'worker.json'), { pid: child.pid });
144
+ durableWrite(join(root, 'cleanup.json'), { hostPid: child.pid, state: 'pending' });
145
+ if (!child.pid)
146
+ throw new Error('Native host did not obtain a process identity');
147
+ tree = new NativeProcessTree(child.pid);
148
+ stopObservingTree = tree.observe(stopHost);
149
+ child.send('start', (error) => {
150
+ if (error)
151
+ stopHost(error);
152
+ });
153
+ hostReleased = true;
154
+ }
155
+ catch (error) {
156
+ stopHost(error);
157
+ }
158
+ async function cleanup() {
159
+ stopObservingTree?.();
160
+ const errors = [];
161
+ const attempt = (operation) => {
162
+ try {
163
+ operation();
164
+ }
165
+ catch (error) {
166
+ errors.push(error);
167
+ }
168
+ };
169
+ attempt(() => rmSync(join(root, 'ready.json'), { force: true }));
170
+ if (tree)
171
+ attempt(() => tree.stop());
172
+ else if (hostReleased)
173
+ errors.push(new Error('Released native host has no process census'));
174
+ const sessions = join(root, 'sessions');
175
+ const records = [];
176
+ // A census failure must not skip the independently recorded runner groups.
177
+ if (existsSync(sessions))
178
+ for (const name of readdirSync(sessions).filter((name) => name.endsWith('.journal'))) {
179
+ attempt(() => {
180
+ const path = join(sessions, name);
181
+ for (const line of readJournal(path).reverse()) {
182
+ const entry = JSON.parse(line);
183
+ if (!entry.info)
184
+ continue;
185
+ const info = entry.info;
186
+ if (info.hostPid === child.pid && info.processPid && !info.processStopped) {
187
+ records.push({ path, info });
188
+ if (info.processIdentity && matchesProcess(info.processPid, info.processIdentity))
189
+ signalGroup(info.processPid, 'SIGKILL');
190
+ }
191
+ break;
192
+ }
193
+ });
194
+ }
195
+ const stopped = () => (!tree || tree.empty()) && records.every(({ info }) => !alive(-info.processPid));
196
+ const deadline = Date.now() + 5_000;
197
+ let confirmedStopped = stopped();
198
+ while (!confirmedStopped && Date.now() < deadline) {
199
+ await new Promise((resolve) => setTimeout(resolve, 25));
200
+ confirmedStopped = stopped();
201
+ }
202
+ if (!confirmedStopped)
203
+ errors.push(new Error('Native descendants remain alive; replacement owner is blocked'));
204
+ if (errors.length)
205
+ throw new AggregateError(errors, `Native cleanup is unconfirmed: ${errors.map((error) => (error instanceof Error ? error.message : String(error))).join('; ')}`);
206
+ for (const { path, info } of records)
207
+ appendDurable(path, { info: { ...info, processStopped: true } });
208
+ durableWrite(join(root, 'cleanup.json'), {
209
+ hostPid: child.pid,
210
+ state: 'complete',
211
+ ...(failure ? { error: failure } : {}),
212
+ });
213
+ rmSync(lock, { recursive: true });
214
+ }
215
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/native/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { NativeSessionCapabilities, NativeSessionEvent, NativeSessionResponse, SafetyTier } from '@farmslot/protocol';
2
+ import type { NativeProcessSandbox } from './review-sandbox.js';
3
+ import type { NativeWorkerFilesystemPolicy } from './worker-launch.js';
4
+ export type NativeEventInput = Omit<NativeSessionEvent, 'sequence' | 'at' | 'sessionId' | 'generation'>;
5
+ export interface NativeAdapterOptions {
6
+ cwd: string;
7
+ onSpawn?: (pid: number, identity: string) => void;
8
+ signal?: AbortSignal;
9
+ executable: string;
10
+ model?: string;
11
+ mode?: 'default' | 'plan';
12
+ resumeSessionId?: string;
13
+ env?: NodeJS.ProcessEnv;
14
+ effort?: string;
15
+ safetyTier?: SafetyTier;
16
+ filesystemPolicy?: NativeWorkerFilesystemPolicy;
17
+ processSandbox?: NativeProcessSandbox;
18
+ }
19
+ export interface NativeAdapterSession {
20
+ nativeSessionId: string;
21
+ capabilities?: NativeSessionCapabilities;
22
+ send(text: string, commandId: string): Promise<void>;
23
+ respond(requestId: string, response: NativeSessionResponse): Promise<void>;
24
+ interrupt(): Promise<void>;
25
+ close(): Promise<void>;
26
+ }
27
+ export interface NativeAdapter {
28
+ capabilities: NativeSessionCapabilities;
29
+ /** A missing capability is unsupported, never a request for advisory prompt restrictions. */
30
+ filesystemPolicyUnavailableReason?: (version: string) => string | undefined;
31
+ /** Compatibility policy based on the native executable's version metadata. */
32
+ workspaceResumeUnavailableReason?: (version: string) => string | undefined;
33
+ resumeUnavailableReason?: (version: string) => string | undefined;
34
+ start(options: NativeAdapterOptions, emit: (event: NativeEventInput) => void): Promise<NativeAdapterSession>;
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,kBAAkB,EAClB,UAAU,GAAG,IAAI,GAAG,WAAW,GAAG,YAAY,CAC/C,CAAC;AACF,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,gBAAgB,CAAC,EAAE,4BAA4B,CAAC;IAChD,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AACD,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,yBAAyB,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AACD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,yBAAyB,CAAC;IACxC,6FAA6F;IAC7F,iCAAiC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC5E,8EAA8E;IAC9E,gCAAgC,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC3E,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAClE,KAAK,CACH,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GACtC,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/native/types.ts"],"names":[],"mappings":""}