@farmslot/agent-runtime 0.9.0 → 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 (216) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/README.md +1 -1
  3. package/bin/farmslot-agent.mjs +1 -1
  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/native/account-claude.d.ts +5 -0
  37. package/dist/native/account-claude.d.ts.map +1 -0
  38. package/dist/native/account-claude.js +42 -0
  39. package/dist/native/account-claude.js.map +1 -0
  40. package/dist/native/account-codex.d.ts +4 -0
  41. package/dist/native/account-codex.d.ts.map +1 -0
  42. package/dist/native/account-codex.js +51 -0
  43. package/dist/native/account-codex.js.map +1 -0
  44. package/dist/native/account-common.d.ts +30 -0
  45. package/dist/native/account-common.d.ts.map +1 -0
  46. package/dist/native/account-common.js +155 -0
  47. package/dist/native/account-common.js.map +1 -0
  48. package/dist/native/account-cursor.d.ts +5 -0
  49. package/dist/native/account-cursor.d.ts.map +1 -0
  50. package/dist/native/account-cursor.js +48 -0
  51. package/dist/native/account-cursor.js.map +1 -0
  52. package/dist/native/account-grok.d.ts +4 -0
  53. package/dist/native/account-grok.d.ts.map +1 -0
  54. package/dist/native/account-grok.js +55 -0
  55. package/dist/native/account-grok.js.map +1 -0
  56. package/dist/native/account-observation.test.d.ts +2 -0
  57. package/dist/native/account-observation.test.d.ts.map +1 -0
  58. package/dist/native/account-observation.test.js +256 -0
  59. package/dist/native/account-observation.test.js.map +1 -0
  60. package/dist/native/account-profiles.d.ts +11 -0
  61. package/dist/native/account-profiles.d.ts.map +1 -0
  62. package/dist/native/account-profiles.js +172 -0
  63. package/dist/native/account-profiles.js.map +1 -0
  64. package/dist/native/account-profiles.test.d.ts +2 -0
  65. package/dist/native/account-profiles.test.d.ts.map +1 -0
  66. package/dist/native/account-profiles.test.js +172 -0
  67. package/dist/native/account-profiles.test.js.map +1 -0
  68. package/dist/native/account-types.d.ts +11 -0
  69. package/dist/native/account-types.d.ts.map +1 -0
  70. package/dist/native/account-types.js +2 -0
  71. package/dist/native/account-types.js.map +1 -0
  72. package/dist/native/acp-requests.d.ts +11 -0
  73. package/dist/native/acp-requests.d.ts.map +1 -0
  74. package/dist/native/acp-requests.js +109 -0
  75. package/dist/native/acp-requests.js.map +1 -0
  76. package/dist/native/acp-rpc.d.ts +15 -0
  77. package/dist/native/acp-rpc.d.ts.map +1 -0
  78. package/dist/native/acp-rpc.js +73 -0
  79. package/dist/native/acp-rpc.js.map +1 -0
  80. package/dist/native/acp.d.ts +15 -0
  81. package/dist/native/acp.d.ts.map +1 -0
  82. package/dist/native/acp.js +285 -0
  83. package/dist/native/acp.js.map +1 -0
  84. package/dist/native/acp.test.d.ts +2 -0
  85. package/dist/native/acp.test.d.ts.map +1 -0
  86. package/dist/native/acp.test.js +257 -0
  87. package/dist/native/acp.test.js.map +1 -0
  88. package/dist/native/claude.d.ts.map +1 -1
  89. package/dist/native/claude.js +14 -0
  90. package/dist/native/claude.js.map +1 -1
  91. package/dist/native/client.d.ts +13 -0
  92. package/dist/native/client.d.ts.map +1 -1
  93. package/dist/native/client.js +112 -1
  94. package/dist/native/client.js.map +1 -1
  95. package/dist/native/codex.d.ts.map +1 -1
  96. package/dist/native/codex.js +61 -3
  97. package/dist/native/codex.js.map +1 -1
  98. package/dist/native/cursor-model.d.ts +6 -0
  99. package/dist/native/cursor-model.d.ts.map +1 -0
  100. package/dist/native/cursor-model.js +74 -0
  101. package/dist/native/cursor-model.js.map +1 -0
  102. package/dist/native/cursor-model.test.d.ts +2 -0
  103. package/dist/native/cursor-model.test.d.ts.map +1 -0
  104. package/dist/native/cursor-model.test.js +40 -0
  105. package/dist/native/cursor-model.test.js.map +1 -0
  106. package/dist/native/cursor.d.ts +2 -0
  107. package/dist/native/cursor.d.ts.map +1 -0
  108. package/dist/native/cursor.js +30 -0
  109. package/dist/native/cursor.js.map +1 -0
  110. package/dist/native/durability.test.js +461 -1
  111. package/dist/native/durability.test.js.map +1 -1
  112. package/dist/native/filesystem-policy.test.d.ts +2 -0
  113. package/dist/native/filesystem-policy.test.d.ts.map +1 -0
  114. package/dist/native/filesystem-policy.test.js +136 -0
  115. package/dist/native/filesystem-policy.test.js.map +1 -0
  116. package/dist/native/grok.d.ts +2 -0
  117. package/dist/native/grok.d.ts.map +1 -0
  118. package/dist/native/grok.js +17 -0
  119. package/dist/native/grok.js.map +1 -0
  120. package/dist/native/host.js +39 -0
  121. package/dist/native/host.js.map +1 -1
  122. package/dist/native/index.d.ts +3 -0
  123. package/dist/native/index.d.ts.map +1 -1
  124. package/dist/native/index.js +3 -0
  125. package/dist/native/index.js.map +1 -1
  126. package/dist/native/ipc.d.ts +59 -0
  127. package/dist/native/ipc.d.ts.map +1 -1
  128. package/dist/native/ipc.js +76 -4
  129. package/dist/native/ipc.js.map +1 -1
  130. package/dist/native/manager.d.ts +22 -4
  131. package/dist/native/manager.d.ts.map +1 -1
  132. package/dist/native/manager.js +386 -46
  133. package/dist/native/manager.js.map +1 -1
  134. package/dist/native/process-tree.d.ts +11 -0
  135. package/dist/native/process-tree.d.ts.map +1 -1
  136. package/dist/native/process-tree.js +123 -20
  137. package/dist/native/process-tree.js.map +1 -1
  138. package/dist/native/process-tree.test.js +126 -1
  139. package/dist/native/process-tree.test.js.map +1 -1
  140. package/dist/native/process.d.ts +5 -1
  141. package/dist/native/process.d.ts.map +1 -1
  142. package/dist/native/process.js +36 -13
  143. package/dist/native/process.js.map +1 -1
  144. package/dist/native/process.test.d.ts +2 -0
  145. package/dist/native/process.test.d.ts.map +1 -0
  146. package/dist/native/process.test.js +56 -0
  147. package/dist/native/process.test.js.map +1 -0
  148. package/dist/native/profile-service.d.ts +5 -0
  149. package/dist/native/profile-service.d.ts.map +1 -0
  150. package/dist/native/profile-service.js +76 -0
  151. package/dist/native/profile-service.js.map +1 -0
  152. package/dist/native/registry.d.ts +20 -0
  153. package/dist/native/registry.d.ts.map +1 -0
  154. package/dist/native/registry.js +89 -0
  155. package/dist/native/registry.js.map +1 -0
  156. package/dist/native/registry.test.d.ts +2 -0
  157. package/dist/native/registry.test.d.ts.map +1 -0
  158. package/dist/native/registry.test.js +13 -0
  159. package/dist/native/registry.test.js.map +1 -0
  160. package/dist/native/review-sandbox.d.ts +12 -0
  161. package/dist/native/review-sandbox.d.ts.map +1 -0
  162. package/dist/native/review-sandbox.js +6 -0
  163. package/dist/native/review-sandbox.js.map +1 -0
  164. package/dist/native/review-sandbox.test.d.ts +2 -0
  165. package/dist/native/review-sandbox.test.d.ts.map +1 -0
  166. package/dist/native/review-sandbox.test.js +40 -0
  167. package/dist/native/review-sandbox.test.js.map +1 -0
  168. package/dist/native/service.d.ts.map +1 -1
  169. package/dist/native/service.js +42 -8
  170. package/dist/native/service.js.map +1 -1
  171. package/dist/native/supervisor.js +121 -33
  172. package/dist/native/supervisor.js.map +1 -1
  173. package/dist/native/types.d.ts +11 -1
  174. package/dist/native/types.d.ts.map +1 -1
  175. package/dist/native/worker-history.d.ts +16 -0
  176. package/dist/native/worker-history.d.ts.map +1 -0
  177. package/dist/native/worker-history.js +77 -0
  178. package/dist/native/worker-history.js.map +1 -0
  179. package/dist/native/worker-history.test.d.ts +2 -0
  180. package/dist/native/worker-history.test.d.ts.map +1 -0
  181. package/dist/native/worker-history.test.js +195 -0
  182. package/dist/native/worker-history.test.js.map +1 -0
  183. package/dist/native/worker-launch.d.ts +72 -0
  184. package/dist/native/worker-launch.d.ts.map +1 -0
  185. package/dist/native/worker-launch.js +134 -0
  186. package/dist/native/worker-launch.js.map +1 -0
  187. package/dist/native/worker-launch.test.d.ts +2 -0
  188. package/dist/native/worker-launch.test.d.ts.map +1 -0
  189. package/dist/native/worker-launch.test.js +61 -0
  190. package/dist/native/worker-launch.test.js.map +1 -0
  191. package/dist/native/worker-relocation.test.d.ts +2 -0
  192. package/dist/native/worker-relocation.test.d.ts.map +1 -0
  193. package/dist/native/worker-relocation.test.js +110 -0
  194. package/dist/native/worker-relocation.test.js.map +1 -0
  195. package/dist/native/worker-service.d.ts +4 -0
  196. package/dist/native/worker-service.d.ts.map +1 -0
  197. package/dist/native/worker-service.js +85 -0
  198. package/dist/native/worker-service.js.map +1 -0
  199. package/dist/task-init/index.d.ts +5 -1
  200. package/dist/task-init/index.d.ts.map +1 -1
  201. package/dist/task-init/index.js +7 -3
  202. package/dist/task-init/index.js.map +1 -1
  203. package/dist/task-init/task-document.d.ts.map +1 -1
  204. package/dist/task-init/task-document.js +2 -2
  205. package/dist/task-init/task-document.js.map +1 -1
  206. package/dist/task-init/write.d.ts +0 -6
  207. package/dist/task-init/write.d.ts.map +1 -1
  208. package/dist/task-init/write.js +1 -8
  209. package/dist/task-init/write.js.map +1 -1
  210. package/package.json +2 -2
  211. package/scripts/cursor-session-discovery.cjs +48 -0
  212. package/scripts/execution-template-cli.mjs +8 -11
  213. package/scripts/review-filesystem.cjs +39 -0
  214. package/scripts/review-session.cjs +45 -0
  215. package/scripts/review-terminal.cjs +134 -0
  216. package/scripts/task-init-cli.mjs +3 -3
@@ -0,0 +1,172 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, realpathSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { basename, dirname, isAbsolute, join, resolve } from 'node:path';
5
+ import { farmslotHome } from '@farmslot/protocol/node/farmslot-home';
6
+ import { nativeRunnerDefinitions } from './registry.js';
7
+ import { durableWrite } from './storage.js';
8
+ function profileId(id) {
9
+ if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(id) || id === 'ambient')
10
+ throw new Error('Profile label must use lowercase letters, digits, dashes or underscores');
11
+ }
12
+ function object(value) {
13
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
14
+ }
15
+ function canonicalDirectory(directory) {
16
+ const suffix = [];
17
+ let existing = directory;
18
+ while (!existsSync(existing)) {
19
+ suffix.unshift(basename(existing));
20
+ existing = dirname(existing);
21
+ }
22
+ return join(realpathSync(existing), ...suffix);
23
+ }
24
+ export function providerAccountsConfigPath(home = farmslotHome()) {
25
+ return join(home, 'provider-accounts.json');
26
+ }
27
+ function readConfig(home) {
28
+ const file = providerAccountsConfigPath(home);
29
+ if (!existsSync(file))
30
+ return { version: 1, accounts: {} };
31
+ const value = JSON.parse(readFileSync(file, 'utf8'));
32
+ if (!object(value) ||
33
+ value.version !== 1 ||
34
+ !object(value.accounts) ||
35
+ (value.nativeProfiles !== undefined && !object(value.nativeProfiles)))
36
+ throw new Error('Invalid provider account configuration');
37
+ for (const [id, entry] of Object.entries(value.nativeProfiles ?? {})) {
38
+ profileId(id);
39
+ if (!object(entry) ||
40
+ entry.id !== id ||
41
+ typeof entry.runner !== 'string' ||
42
+ typeof entry.directory !== 'string' ||
43
+ !isAbsolute(entry.directory) ||
44
+ typeof entry.accountContextId !== 'string' ||
45
+ !/^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/.test(entry.accountContextId) ||
46
+ Object.keys(entry).some((key) => !['id', 'runner', 'directory', 'accountContextId', 'state'].includes(key)) ||
47
+ !['active', 'retiring'].includes(String(entry.state)))
48
+ throw new Error('Invalid native profile configuration');
49
+ }
50
+ return value;
51
+ }
52
+ function writeConfig(home, config) {
53
+ mkdirSync(home, { recursive: true, mode: 0o700 });
54
+ durableWrite(providerAccountsConfigPath(home), config);
55
+ }
56
+ export function listNativeProfiles(home = farmslotHome()) {
57
+ return Object.values(readConfig(home).nativeProfiles ?? {});
58
+ }
59
+ export function findNativeProfile(id, home = farmslotHome()) {
60
+ profileId(id);
61
+ return listNativeProfiles(home).find((profile) => profile.id === id);
62
+ }
63
+ export function requireNativeProfile(id, runner, home = farmslotHome()) {
64
+ const profile = findNativeProfile(id, home);
65
+ if (!profile || profile.state !== 'active')
66
+ throw new Error('Native account profile is unavailable');
67
+ if (runner !== undefined && profile.runner !== runner)
68
+ throw new Error('Native profile belongs to another runner');
69
+ if (!Object.hasOwn(nativeRunnerDefinitions, profile.runner))
70
+ throw new Error('Native profile runner is unavailable');
71
+ return profile;
72
+ }
73
+ export function assertNativeProfileCurrent(profile, home = farmslotHome()) {
74
+ const current = requireNativeProfile(profile.id, profile.runner, home);
75
+ if (current.accountContextId !== profile.accountContextId ||
76
+ current.directory !== profile.directory)
77
+ throw new Error('Native account profile changed; start a new conversation');
78
+ }
79
+ export function nativeProfileEnvironment(profile, base = process.env) {
80
+ const definition = nativeRunnerDefinitions[profile.runner];
81
+ if (!definition?.account)
82
+ throw new Error('Native profile runner is unavailable');
83
+ const env = { ...base };
84
+ for (const key of definition.account.unset)
85
+ delete env[key];
86
+ return {
87
+ ...env,
88
+ FARMSLOT_HOME: base.FARMSLOT_HOME ?? farmslotHome(),
89
+ ...definition.account.environment(profile.directory, base),
90
+ };
91
+ }
92
+ // Node-local profile mutations share one queue. Retirement holds it through
93
+ // process cleanup; ordinary profile reads still observe the persisted retiring state.
94
+ const mutations = new Map();
95
+ async function mutate(home, operation) {
96
+ const previous = mutations.get(home);
97
+ let release;
98
+ const current = new Promise((resolve) => {
99
+ release = resolve;
100
+ });
101
+ mutations.set(home, current);
102
+ await previous;
103
+ try {
104
+ return await operation();
105
+ }
106
+ finally {
107
+ release();
108
+ if (mutations.get(home) === current)
109
+ mutations.delete(home);
110
+ }
111
+ }
112
+ export function inspectNativeProfile(id, inspect, home = farmslotHome()) {
113
+ return mutate(home, () => inspect(requireNativeProfile(id, undefined, home)));
114
+ }
115
+ export function addNativeProfile(params, home = farmslotHome()) {
116
+ profileId(params.profileId);
117
+ if (!Object.hasOwn(nativeRunnerDefinitions, params.runner))
118
+ throw new Error('Runner has no native profile support');
119
+ return mutate(home, () => {
120
+ const config = readConfig(home);
121
+ const profiles = config.nativeProfiles ?? {};
122
+ const existing = Object.hasOwn(profiles, params.profileId)
123
+ ? profiles[params.profileId]
124
+ : undefined;
125
+ const requested = params.directory ?? join(home, 'runner-profiles', params.runner, params.profileId);
126
+ if (!isAbsolute(requested) && !requested.startsWith('~/'))
127
+ throw new Error('Native profile directory must be absolute or start with ~/');
128
+ const directory = resolve(requested.startsWith('~/') ? join(homedir(), requested.slice(2)) : requested);
129
+ const canonical = canonicalDirectory(directory);
130
+ if (existing) {
131
+ if (existing.runner === params.runner &&
132
+ existing.directory === canonical &&
133
+ existing.state === 'active')
134
+ return existing;
135
+ throw new Error('Retire the existing profile before changing its account location');
136
+ }
137
+ if (Object.values(profiles).some((profile) => profile.runner === params.runner && profile.directory === canonical))
138
+ throw new Error('This native account directory already has a profile');
139
+ mkdirSync(canonical, { recursive: true, mode: 0o700 });
140
+ const profile = {
141
+ id: params.profileId,
142
+ runner: params.runner,
143
+ directory: canonical,
144
+ accountContextId: randomUUID(),
145
+ state: 'active',
146
+ };
147
+ writeConfig(home, { ...config, nativeProfiles: { ...profiles, [profile.id]: profile } });
148
+ return profile;
149
+ });
150
+ }
151
+ export function removeNativeProfile(id, accountContextId, stopSessions, home = farmslotHome()) {
152
+ profileId(id);
153
+ return mutate(home, async () => {
154
+ const config = readConfig(home);
155
+ const profile = Object.hasOwn(config.nativeProfiles ?? {}, id)
156
+ ? config.nativeProfiles[id]
157
+ : undefined;
158
+ if (!profile)
159
+ return;
160
+ if (profile.accountContextId !== accountContextId)
161
+ throw new Error('Native profile changed; refresh before removing it');
162
+ profile.state = 'retiring';
163
+ writeConfig(home, config);
164
+ await stopSessions(profile);
165
+ const latest = readConfig(home);
166
+ if (latest.nativeProfiles?.[id]?.accountContextId !== accountContextId)
167
+ throw new Error('Native profile changed during retirement');
168
+ delete latest.nativeProfiles[id];
169
+ writeConfig(home, latest);
170
+ });
171
+ }
172
+ //# sourceMappingURL=account-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-profiles.js","sourceRoot":"","sources":["../../src/native/account-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAS5C,SAAS,SAAS,CAAC,EAAU;IAC3B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,SAAS;QAC5D,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;AAC/F,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AACD,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACjD,CAAC;AACD,MAAM,UAAU,0BAA0B,CAAC,IAAI,GAAG,YAAY,EAAE;IAC9D,OAAO,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;AAC9C,CAAC;AACD,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,IACE,CAAC,MAAM,CAAC,KAAK,CAAC;QACd,KAAK,CAAC,OAAO,KAAK,CAAC;QACnB,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QACvB,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAErE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,IACE,CAAC,MAAM,CAAC,KAAK,CAAC;YACd,KAAK,CAAC,EAAE,KAAK,EAAE;YACf,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;YACnC,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5B,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ;YAC1C,CAAC,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CACrB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACnF;YACD,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAErD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,KAAsB,CAAC;AAChC,CAAC;AACD,SAAS,WAAW,CAAC,IAAY,EAAE,MAAqB;IACtD,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,YAAY,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAI,GAAG,YAAY,EAAE;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AACD,MAAM,UAAU,iBAAiB,CAC/B,EAAU,EACV,IAAI,GAAG,YAAY,EAAE;IAErB,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC;AACD,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,MAAe,EACf,IAAI,GAAG,YAAY,EAAE;IAErB,MAAM,OAAO,GAAG,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ;QACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;QACnD,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,MAAM,UAAU,0BAA0B,CACxC,OAA0B,EAC1B,IAAI,GAAG,YAAY,EAAE;IAErB,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvE,IACE,OAAO,CAAC,gBAAgB,KAAK,OAAO,CAAC,gBAAgB;QACrD,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;QAEvC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAChF,CAAC;AACD,MAAM,UAAU,wBAAwB,CACtC,OAA0B,EAC1B,OAA0B,OAAO,CAAC,GAAG;IAErC,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,GAAG;QACN,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,YAAY,EAAE;QACnD,GAAG,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,sFAAsF;AACtF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;AACnD,KAAK,UAAU,MAAM,CAAI,IAAY,EAAE,SAA+B;IACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAoB,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,OAAO,GAAG,OAAO,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,QAAQ,CAAC;IACf,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;QACV,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO;YAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,EAAU,EACV,OAAmD,EACnD,IAAI,GAAG,YAAY,EAAE;IAErB,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAA8B,EAC9B,IAAI,GAAG,YAAY,EAAE;IAErB,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACvB,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC;YACxD,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;YAC5B,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,OAAO,CACvB,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC7E,CAAC;QACF,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,IACE,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;gBACjC,QAAQ,CAAC,SAAS,KAAK,SAAS;gBAChC,QAAQ,CAAC,KAAK,KAAK,QAAQ;gBAE3B,OAAO,QAAQ,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;QACtF,CAAC;QACD,IACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CACjF;YAED,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,MAAM,OAAO,GAAsB;YACjC,EAAE,EAAE,MAAM,CAAC,SAAS;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,SAAS;YACpB,gBAAgB,EAAE,UAAU,EAAE;YAC9B,KAAK,EAAE,QAAQ;SAChB,CAAC;QACF,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,cAAc,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACzF,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,EAAU,EACV,gBAAwB,EACxB,YAA2D,EAC3D,IAAI,GAAG,YAAY,EAAE;IAErB,SAAS,CAAC,EAAE,CAAC,CAAC;IACd,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,EAAE,CAAC;YAC5D,CAAC,CAAC,MAAM,CAAC,cAAe,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,OAAO,CAAC,gBAAgB,KAAK,gBAAgB;YAC/C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;QAC3B,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,KAAK,gBAAgB;YACpE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QACjC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account-profiles.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-profiles.test.d.ts","sourceRoot":"","sources":["../../src/native/account-profiles.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,172 @@
1
+ import assert from 'node:assert/strict';
2
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, symlinkSync, writeFileSync, } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test from 'node:test';
6
+ import { addNativeProfile, assertNativeProfileCurrent, listNativeProfiles, nativeProfileEnvironment, providerAccountsConfigPath, removeNativeProfile, requireNativeProfile, } from './account-profiles.js';
7
+ import { decodeRequest } from './ipc.js';
8
+ test('the default Claude directory retains its native credential store while custom profiles stay explicit', async () => {
9
+ const home = mkdtempSync(join(tmpdir(), 'native-claude-default-'));
10
+ try {
11
+ const directory = join(home, 'native-config');
12
+ mkdirSync(directory);
13
+ symlinkSync(directory, join(home, '.claude'));
14
+ const profile = await addNativeProfile({ profileId: 'default', runner: 'claude', directory: join(home, '.claude') }, home);
15
+ const base = {
16
+ HOME: home,
17
+ CLAUDE_CONFIG_DIR: '/other/config',
18
+ CLAUDE_SECURESTORAGE_CONFIG_DIR: '/other/storage',
19
+ CLAUDE_CODE_OAUTH_TOKEN: 'override',
20
+ };
21
+ const env = nativeProfileEnvironment(profile, base);
22
+ assert.equal(env.HOME, home);
23
+ assert.equal(env.CLAUDE_CONFIG_DIR, undefined);
24
+ assert.equal(env.CLAUDE_SECURESTORAGE_CONFIG_DIR, undefined);
25
+ assert.equal(env.CLAUDE_CODE_OAUTH_TOKEN, undefined);
26
+ const custom = await addNativeProfile({ profileId: 'custom', runner: 'claude' }, home);
27
+ const customEnv = nativeProfileEnvironment(custom, base);
28
+ assert.equal(customEnv.CLAUDE_CONFIG_DIR, custom.directory);
29
+ assert.equal(customEnv.CLAUDE_SECURESTORAGE_CONFIG_DIR, custom.directory);
30
+ const otherHome = nativeProfileEnvironment(profile, {
31
+ ...base,
32
+ HOME: join(home, 'other-home'),
33
+ });
34
+ assert.equal(otherHome.CLAUDE_CONFIG_DIR, profile.directory, 'A different HOME must not redirect the chosen directory');
35
+ }
36
+ finally {
37
+ rmSync(home, { recursive: true, force: true });
38
+ }
39
+ });
40
+ test('named profiles preserve existing account settings and bind distinct native directories', async () => {
41
+ const home = mkdtempSync(join(tmpdir(), 'native-profiles-'));
42
+ try {
43
+ const existing = {
44
+ version: 1,
45
+ accounts: { old: { provider: 'codex', authPath: '/old/auth.json' } },
46
+ slotBindings: { slot: 'old' },
47
+ };
48
+ writeFileSync(providerAccountsConfigPath(home), JSON.stringify(existing));
49
+ const a = await addNativeProfile({ profileId: 'a', runner: 'claude' }, home);
50
+ const b = await addNativeProfile({ profileId: 'b', runner: 'claude' }, home);
51
+ assert.notEqual(a.directory, b.directory);
52
+ assert.notEqual(a.accountContextId, b.accountContextId);
53
+ assert.deepEqual(await addNativeProfile({ profileId: 'a', runner: 'claude' }, home), a);
54
+ const persisted = JSON.parse(readFileSync(providerAccountsConfigPath(home), 'utf8'));
55
+ assert.deepEqual(persisted.accounts, existing.accounts);
56
+ assert.deepEqual(persisted.slotBindings, existing.slotBindings);
57
+ const env = nativeProfileEnvironment(a, {
58
+ PATH: '/bin',
59
+ ANTHROPIC_API_KEY: 'sentinel',
60
+ SERVICE_PORT: '1234',
61
+ });
62
+ assert.equal(env.CLAUDE_CONFIG_DIR, a.directory);
63
+ assert.equal(env.CLAUDE_SECURESTORAGE_CONFIG_DIR, a.directory);
64
+ assert.equal(env.ANTHROPIC_API_KEY, undefined);
65
+ assert.equal(env.SERVICE_PORT, '1234');
66
+ const rejected = join(home, 'rejected');
67
+ await assert.rejects(addNativeProfile({ profileId: 'a', runner: 'claude', directory: rejected }, home));
68
+ assert.equal(existsSync(rejected), false);
69
+ await assert.rejects(addNativeProfile({ profileId: 'alias', runner: 'claude', directory: a.directory }, home));
70
+ }
71
+ finally {
72
+ rmSync(home, { recursive: true, force: true });
73
+ }
74
+ });
75
+ test('retirement blocks reuse until cleanup succeeds and a reused label gets a new account binding', async () => {
76
+ const home = mkdtempSync(join(tmpdir(), 'native-profile-retirement-'));
77
+ try {
78
+ const a = await addNativeProfile({ profileId: 'a', runner: 'codex' }, home);
79
+ await assert.rejects(removeNativeProfile(a.id, a.accountContextId, async () => {
80
+ assert.throws(() => requireNativeProfile(a.id, 'codex', home), /unavailable/);
81
+ throw new Error('cleanup-unconfirmed');
82
+ }, home), /cleanup-unconfirmed/);
83
+ assert.equal(listNativeProfiles(home)[0].state, 'retiring');
84
+ await assert.rejects(addNativeProfile({ profileId: 'a', runner: 'codex' }, home));
85
+ await removeNativeProfile(a.id, a.accountContextId, async () => { }, home);
86
+ assert.equal(existsSync(a.directory), true, 'Native-owned credentials/data are not deleted');
87
+ const b = await addNativeProfile({ profileId: 'a', runner: 'codex' }, home);
88
+ assert.notEqual(b.accountContextId, a.accountContextId);
89
+ assert.throws(() => assertNativeProfileCurrent(a, home), /changed/);
90
+ await assert.rejects(removeNativeProfile(a.id, a.accountContextId, async () => { }, home), /changed/);
91
+ }
92
+ finally {
93
+ rmSync(home, { recursive: true, force: true });
94
+ }
95
+ });
96
+ test('reserved native creation keeps profile selection through IPC', () => {
97
+ const request = decodeRequest({
98
+ method: 'ensure',
99
+ owner: 'owner',
100
+ params: {
101
+ runner: 'codex',
102
+ cwd: '/workspace',
103
+ sessionId: 'fbb8f455-33ba-4e7f-9600-4eea85b9fda6',
104
+ profileId: 'work',
105
+ },
106
+ });
107
+ assert.equal(request.method, 'ensure');
108
+ assert.equal('params' in request && request.params.profileId, 'work');
109
+ });
110
+ test('Codex profiles retain keys required by explicitly configured native providers', async () => {
111
+ const home = mkdtempSync(join(tmpdir(), 'native-codex-provider-'));
112
+ try {
113
+ const profile = await addNativeProfile({ profileId: 'codex', runner: 'codex' }, home);
114
+ const env = nativeProfileEnvironment(profile, {
115
+ OPENAI_API_KEY: 'implicit-override',
116
+ CODEX_API_KEY: 'implicit-override',
117
+ CODEX_LB_API_KEY: 'configured-provider-key',
118
+ });
119
+ assert.equal(env.CODEX_HOME, profile.directory);
120
+ assert.equal(env.OPENAI_API_KEY, undefined);
121
+ assert.equal(env.CODEX_API_KEY, undefined);
122
+ assert.equal(env.CODEX_LB_API_KEY, 'configured-provider-key');
123
+ }
124
+ finally {
125
+ rmSync(home, { recursive: true, force: true });
126
+ }
127
+ });
128
+ test('additional runner profiles clear native auth overrides and select their native directories', async () => {
129
+ const home = mkdtempSync(join(tmpdir(), 'native-additional-profiles-'));
130
+ try {
131
+ const cursor = await addNativeProfile({ profileId: 'cursor', runner: 'cursor' }, home);
132
+ const defaultCursor = await addNativeProfile({ profileId: 'cursor-default', runner: 'cursor', directory: home }, home);
133
+ const grok = await addNativeProfile({ profileId: 'grok', runner: 'grok' }, home);
134
+ const base = {
135
+ HOME: home,
136
+ CURSOR_API_KEY: 'api-override',
137
+ CURSOR_AUTH_TOKEN: 'login-override',
138
+ CURSOR_CONFIG_DIR: '/other/config',
139
+ CURSOR_DATA_DIR: '/other/data',
140
+ XDG_CONFIG_HOME: '/other/xdg',
141
+ XAI_API_KEY: 'xai-override',
142
+ GROK_API_KEY: 'grok-override',
143
+ GROK_HOME: '/other/grok',
144
+ SERVICE_PORT: '1234',
145
+ };
146
+ const defaultCursorEnv = nativeProfileEnvironment(defaultCursor, base);
147
+ assert.equal(defaultCursorEnv.HOME, home);
148
+ assert.equal(defaultCursorEnv.AGENT_CLI_CREDENTIAL_STORE, undefined, 'The native default backend must remain available');
149
+ assert.equal(defaultCursorEnv.CURSOR_AUTH_TOKEN, undefined);
150
+ const cursorEnv = nativeProfileEnvironment(cursor, base);
151
+ assert.equal(cursorEnv.HOME, cursor.directory);
152
+ assert.equal(cursorEnv.AGENT_CLI_CREDENTIAL_STORE, 'file');
153
+ for (const key of [
154
+ 'CURSOR_API_KEY',
155
+ 'CURSOR_AUTH_TOKEN',
156
+ 'CURSOR_CONFIG_DIR',
157
+ 'CURSOR_DATA_DIR',
158
+ 'XDG_CONFIG_HOME',
159
+ ])
160
+ assert.equal(cursorEnv[key], undefined, `${key} must not override the selected Cursor profile`);
161
+ const grokEnv = nativeProfileEnvironment(grok, base);
162
+ assert.equal(grokEnv.GROK_HOME, grok.directory);
163
+ assert.equal(grokEnv.XAI_API_KEY, undefined);
164
+ assert.equal(grokEnv.GROK_API_KEY, undefined);
165
+ assert.equal(cursorEnv.SERVICE_PORT, '1234');
166
+ assert.equal(grokEnv.SERVICE_PORT, '1234');
167
+ }
168
+ finally {
169
+ rmSync(home, { recursive: true, force: true });
170
+ }
171
+ });
172
+ //# sourceMappingURL=account-profiles.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-profiles.test.js","sourceRoot":"","sources":["../../src/native/account-profiles.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { NativeAccountObservation } from '@farmslot/protocol';
2
+ export type { NativeAccountObservation } from '@farmslot/protocol';
3
+ export interface NativeAccountProbeOptions {
4
+ /** Probe the actual runner execution context, including its native profile variables. */
5
+ cwd: string;
6
+ executable?: string;
7
+ /** Complete effective profile environment. Defaults to the current process environment. */
8
+ env?: NodeJS.ProcessEnv;
9
+ }
10
+ export type NativeAccountState = Pick<NativeAccountObservation, 'login' | 'mode' | 'identity' | 'identityQuality' | 'reason'>;
11
+ //# sourceMappingURL=account-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-types.d.ts","sourceRoot":"","sources":["../../src/native/account-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,YAAY,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,WAAW,yBAAyB;IACxC,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CACnC,wBAAwB,EACxB,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,iBAAiB,GAAG,QAAQ,CAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-types.js","sourceRoot":"","sources":["../../src/native/account-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import type { NativeSessionResponse } from '@farmslot/protocol';
2
+ import { type AcpObject } from './acp-rpc.js';
3
+ import type { NativeEventInput } from './types.js';
4
+ export interface AcpPendingRequest {
5
+ event: NativeEventInput;
6
+ response(value: NativeSessionResponse): AcpObject;
7
+ }
8
+ export declare function acpPermission(params: AcpObject, previous?: NativeEventInput['tool']): AcpPendingRequest;
9
+ /** Documented Cursor ACP extensions; no credential or agent-loop implementation. */
10
+ export declare function cursorRequest(method: string, params: AcpObject): AcpPendingRequest | undefined;
11
+ //# sourceMappingURL=acp-requests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-requests.d.ts","sourceRoot":"","sources":["../../src/native/acp-requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,cAAc,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,SAAS,CAAC;CACnD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,QAAQ,CAAC,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAClC,iBAAiB,CA+BnB;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAmE9F"}
@@ -0,0 +1,109 @@
1
+ import { acpObject, acpString } from './acp-rpc.js';
2
+ export function acpPermission(params, previous) {
3
+ const tool = acpObject(params.toolCall);
4
+ if (!Array.isArray(params.options))
5
+ throw new Error('ACP permission options are missing');
6
+ const options = params.options.map(acpObject);
7
+ const title = typeof tool.title === 'string' ? tool.title : (previous?.name ?? 'Allow runner action?');
8
+ const input = tool.rawInput ?? previous?.input;
9
+ return {
10
+ event: {
11
+ type: 'approval.requested',
12
+ request: {
13
+ id: '',
14
+ title,
15
+ detail: JSON.stringify(input ?? tool.content ?? []),
16
+ tool: { name: title, input },
17
+ },
18
+ data: { toolCall: tool, options },
19
+ },
20
+ response(value) {
21
+ if (!value.decision)
22
+ throw new Error('Approval response requires a decision');
23
+ // Always grant only this operation. Session-wide grants exceed this response's scope.
24
+ const option = options.find((option) => option.kind === (value.decision === 'approve' ? 'allow_once' : 'reject_once'));
25
+ if (!option) {
26
+ if (value.decision === 'deny')
27
+ return { outcome: { outcome: 'cancelled' } };
28
+ throw new Error('Runner did not offer a one-time permission grant');
29
+ }
30
+ return { outcome: { outcome: 'selected', optionId: acpString(option.optionId) } };
31
+ },
32
+ };
33
+ }
34
+ /** Documented Cursor ACP extensions; no credential or agent-loop implementation. */
35
+ export function cursorRequest(method, params) {
36
+ if (method === 'cursor/create_plan')
37
+ return {
38
+ event: {
39
+ type: 'approval.requested',
40
+ request: {
41
+ id: '',
42
+ title: typeof params.name === 'string' ? params.name : 'Approve plan',
43
+ detail: acpString(params.plan),
44
+ },
45
+ data: params,
46
+ },
47
+ response(value) {
48
+ if (!value.decision)
49
+ throw new Error('Plan approval requires a decision');
50
+ return { outcome: { outcome: value.decision === 'approve' ? 'accepted' : 'rejected' } };
51
+ },
52
+ };
53
+ if (method !== 'cursor/ask_question')
54
+ return;
55
+ if (!Array.isArray(params.questions))
56
+ throw new Error('Cursor questions are missing');
57
+ const questions = params.questions.map((raw) => {
58
+ const q = acpObject(raw);
59
+ if (!Array.isArray(q.options))
60
+ throw new Error('Cursor question options are missing');
61
+ const options = q.options.map((raw) => {
62
+ const option = acpObject(raw);
63
+ return { id: acpString(option.id), label: acpString(option.label) };
64
+ });
65
+ if (new Set(options.map((option) => option.label)).size !== options.length)
66
+ throw new Error('Cursor question option labels are ambiguous');
67
+ return {
68
+ id: acpString(q.id),
69
+ prompt: acpString(q.prompt),
70
+ multiSelect: q.allowMultiple === true,
71
+ options,
72
+ };
73
+ });
74
+ return {
75
+ event: {
76
+ type: 'question.requested',
77
+ request: {
78
+ id: '',
79
+ title: typeof params.title === 'string' ? params.title : 'Answer runner questions',
80
+ questions,
81
+ },
82
+ data: params,
83
+ },
84
+ response(value) {
85
+ if (!value.answers)
86
+ throw new Error('Question response requires answers');
87
+ return {
88
+ outcome: {
89
+ outcome: 'answered',
90
+ answers: questions.map((q) => {
91
+ const selected = value.answers[q.id];
92
+ if (!selected?.length || (!q.multiSelect && selected.length !== 1))
93
+ throw new Error('Each question requires a valid selection');
94
+ return {
95
+ questionId: q.id,
96
+ selectedOptionIds: selected.map((label) => {
97
+ const option = q.options.find((option) => option.label === label);
98
+ if (!option)
99
+ throw new Error('Unknown question option');
100
+ return option.id;
101
+ }),
102
+ };
103
+ }),
104
+ },
105
+ };
106
+ },
107
+ };
108
+ }
109
+ //# sourceMappingURL=acp-requests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-requests.js","sourceRoot":"","sources":["../../src/native/acp-requests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { NativeAdapterOptions } from './types.js';
2
+ export type AcpObject = Record<string, unknown>;
3
+ export declare function acpObject(value: unknown): AcpObject;
4
+ export declare function acpString(value: unknown): string;
5
+ /** ACP uses JSON-RPC 2.0; a prompt response may take the entire agent turn. */
6
+ export declare class AcpRpc {
7
+ private process;
8
+ private nextId;
9
+ private pending;
10
+ constructor(options: NativeAdapterOptions, args: string[], onMessage: (message: AcpObject) => void, onExit: (error: Error | undefined, stopped: boolean) => void);
11
+ request(method: string, params: unknown, timeoutMs?: number | null): Promise<unknown>;
12
+ write(message: AcpObject): void;
13
+ close(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=acp-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acp-rpc.d.ts","sourceRoot":"","sources":["../../src/native/acp-rpc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAChD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAInD;AACD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAGhD;AAED,+EAA+E;AAC/E,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAOX;gBAGF,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,IAAI,EACvC,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI;IAoC9D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAE,MAAM,GAAG,IAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAoB7F,KAAK,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI;IAG/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvB"}
@@ -0,0 +1,73 @@
1
+ import { JsonLineProcess } from './process.js';
2
+ export function acpObject(value) {
3
+ if (!value || typeof value !== 'object' || Array.isArray(value))
4
+ throw new Error('Expected an ACP object');
5
+ return value;
6
+ }
7
+ export function acpString(value) {
8
+ if (typeof value !== 'string')
9
+ throw new Error('Expected an ACP string');
10
+ return value;
11
+ }
12
+ /** ACP uses JSON-RPC 2.0; a prompt response may take the entire agent turn. */
13
+ export class AcpRpc {
14
+ constructor(options, args, onMessage, onExit) {
15
+ this.nextId = 0;
16
+ this.pending = new Map();
17
+ this.process = new JsonLineProcess(options.executable, args, options, (message) => {
18
+ if (message.jsonrpc !== '2.0')
19
+ throw new Error('Expected ACP JSON-RPC 2.0');
20
+ const pending = typeof message.id === 'string' && !message.method
21
+ ? this.pending.get(message.id)
22
+ : undefined;
23
+ if (!pending) {
24
+ onMessage(message);
25
+ return;
26
+ }
27
+ const error = message.error === undefined ? undefined : acpObject(message.error);
28
+ const failure = error
29
+ ? new Error(`ACP request failed (${String(error.code)}): ${acpString(error.message)}`)
30
+ : undefined;
31
+ this.pending.delete(message.id);
32
+ clearTimeout(pending.timer);
33
+ if (failure)
34
+ pending.reject(failure);
35
+ else
36
+ pending.resolve(message.result);
37
+ }, (error, stopped) => {
38
+ for (const pending of this.pending.values()) {
39
+ clearTimeout(pending.timer);
40
+ pending.reject(error ?? new Error('ACP process closed'));
41
+ }
42
+ this.pending.clear();
43
+ onExit(error, stopped);
44
+ });
45
+ }
46
+ request(method, params, timeoutMs = 30_000) {
47
+ const id = `farmslot-acp-${++this.nextId}`;
48
+ return new Promise((resolve, reject) => {
49
+ const timer = timeoutMs === null
50
+ ? undefined
51
+ : setTimeout(() => {
52
+ this.pending.delete(id);
53
+ reject(new Error(`ACP request timed out: ${method}; acceptance is unknown`));
54
+ }, timeoutMs);
55
+ this.pending.set(id, { resolve, reject, timer });
56
+ try {
57
+ this.write({ id, method, params });
58
+ }
59
+ catch (error) {
60
+ clearTimeout(timer);
61
+ this.pending.delete(id);
62
+ reject(error);
63
+ }
64
+ });
65
+ }
66
+ write(message) {
67
+ this.process.write({ jsonrpc: '2.0', ...message });
68
+ }
69
+ close() {
70
+ return this.process.close();
71
+ }
72
+ }
73
+ //# sourceMappingURL=acp-rpc.js.map