@calliopelabs/cli 3.5.4 → 3.6.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 (291) hide show
  1. package/README.md +8 -0
  2. package/dist/acp.d.ts +10 -3
  3. package/dist/acp.d.ts.map +1 -1
  4. package/dist/acp.js +27 -7
  5. package/dist/acp.js.map +1 -1
  6. package/dist/bin.d.ts.map +1 -1
  7. package/dist/bin.js +28 -8
  8. package/dist/bin.js.map +1 -1
  9. package/dist/execution/authority.d.ts +4 -1
  10. package/dist/execution/authority.d.ts.map +1 -1
  11. package/dist/execution/authority.js +23 -7
  12. package/dist/execution/authority.js.map +1 -1
  13. package/dist/execution/child-grants.d.ts +2 -0
  14. package/dist/execution/child-grants.d.ts.map +1 -1
  15. package/dist/execution/child-grants.js +19 -4
  16. package/dist/execution/child-grants.js.map +1 -1
  17. package/dist/execution/delegated.d.ts +14 -0
  18. package/dist/execution/delegated.d.ts.map +1 -0
  19. package/dist/execution/delegated.js +66 -0
  20. package/dist/execution/delegated.js.map +1 -0
  21. package/dist/execution/files.js +6 -6
  22. package/dist/execution/files.js.map +1 -1
  23. package/dist/execution/guard.d.ts +5 -0
  24. package/dist/execution/guard.d.ts.map +1 -1
  25. package/dist/execution/guard.js +31 -16
  26. package/dist/execution/guard.js.map +1 -1
  27. package/dist/execution/index.d.ts +4 -0
  28. package/dist/execution/index.d.ts.map +1 -1
  29. package/dist/execution/index.js +4 -0
  30. package/dist/execution/index.js.map +1 -1
  31. package/dist/execution/ledger-cli.d.ts +2 -1
  32. package/dist/execution/ledger-cli.d.ts.map +1 -1
  33. package/dist/execution/ledger-cli.js +51 -14
  34. package/dist/execution/ledger-cli.js.map +1 -1
  35. package/dist/execution/ledger-protocol.d.ts +6 -2
  36. package/dist/execution/ledger-protocol.d.ts.map +1 -1
  37. package/dist/execution/ledger-protocol.js +110 -24
  38. package/dist/execution/ledger-protocol.js.map +1 -1
  39. package/dist/execution/ledger-server.d.ts +13 -0
  40. package/dist/execution/ledger-server.d.ts.map +1 -1
  41. package/dist/execution/ledger-server.js +57 -13
  42. package/dist/execution/ledger-server.js.map +1 -1
  43. package/dist/execution/ledger-tunnel.d.ts +50 -0
  44. package/dist/execution/ledger-tunnel.d.ts.map +1 -0
  45. package/dist/execution/ledger-tunnel.js +307 -0
  46. package/dist/execution/ledger-tunnel.js.map +1 -0
  47. package/dist/execution/ledger.d.ts +4 -0
  48. package/dist/execution/ledger.d.ts.map +1 -1
  49. package/dist/execution/ledger.js +30 -4
  50. package/dist/execution/ledger.js.map +1 -1
  51. package/dist/execution/parent-accounting.d.ts +41 -0
  52. package/dist/execution/parent-accounting.d.ts.map +1 -0
  53. package/dist/execution/parent-accounting.js +52 -0
  54. package/dist/execution/parent-accounting.js.map +1 -0
  55. package/dist/execution/parent-budget.d.ts +25 -0
  56. package/dist/execution/parent-budget.d.ts.map +1 -0
  57. package/dist/execution/parent-budget.js +102 -0
  58. package/dist/execution/parent-budget.js.map +1 -0
  59. package/dist/execution/project-spend.d.ts.map +1 -1
  60. package/dist/execution/project-spend.js +35 -5
  61. package/dist/execution/project-spend.js.map +1 -1
  62. package/dist/execution/remote-checkpoint.d.ts +15 -0
  63. package/dist/execution/remote-checkpoint.d.ts.map +1 -0
  64. package/dist/execution/remote-checkpoint.js +165 -0
  65. package/dist/execution/remote-checkpoint.js.map +1 -0
  66. package/dist/execution/remote-ledger.d.ts +12 -2
  67. package/dist/execution/remote-ledger.d.ts.map +1 -1
  68. package/dist/execution/remote-ledger.js +53 -21
  69. package/dist/execution/remote-ledger.js.map +1 -1
  70. package/dist/execution/types.d.ts +23 -5
  71. package/dist/execution/types.d.ts.map +1 -1
  72. package/dist/execution/types.js.map +1 -1
  73. package/dist/goals/supervised.js +2 -2
  74. package/dist/goals/supervised.js.map +1 -1
  75. package/dist/headless.d.ts +2 -6
  76. package/dist/headless.d.ts.map +1 -1
  77. package/dist/headless.js +17 -21
  78. package/dist/headless.js.map +1 -1
  79. package/dist/improvement/actions.d.ts +3 -4
  80. package/dist/improvement/actions.d.ts.map +1 -1
  81. package/dist/improvement/actions.js +10 -7
  82. package/dist/improvement/actions.js.map +1 -1
  83. package/dist/improvement/capabilities.d.ts +54 -0
  84. package/dist/improvement/capabilities.d.ts.map +1 -0
  85. package/dist/improvement/capabilities.js +44 -0
  86. package/dist/improvement/capabilities.js.map +1 -0
  87. package/dist/improvement/cli.d.ts +1 -1
  88. package/dist/improvement/cli.d.ts.map +1 -1
  89. package/dist/improvement/cli.js +14 -2
  90. package/dist/improvement/cli.js.map +1 -1
  91. package/dist/improvement/index.d.ts +5 -0
  92. package/dist/improvement/index.d.ts.map +1 -1
  93. package/dist/improvement/index.js +5 -0
  94. package/dist/improvement/index.js.map +1 -1
  95. package/dist/improvement/proposal-hash.d.ts +3 -0
  96. package/dist/improvement/proposal-hash.d.ts.map +1 -0
  97. package/dist/improvement/proposal-hash.js +5 -0
  98. package/dist/improvement/proposal-hash.js.map +1 -0
  99. package/dist/improvement/review-contract.d.ts +32 -0
  100. package/dist/improvement/review-contract.d.ts.map +1 -0
  101. package/dist/improvement/review-contract.js +62 -0
  102. package/dist/improvement/review-contract.js.map +1 -0
  103. package/dist/improvement/review-requests.d.ts +72 -0
  104. package/dist/improvement/review-requests.d.ts.map +1 -0
  105. package/dist/improvement/review-requests.js +63 -0
  106. package/dist/improvement/review-requests.js.map +1 -0
  107. package/dist/improvement/source-changes.d.ts +78 -0
  108. package/dist/improvement/source-changes.d.ts.map +1 -0
  109. package/dist/improvement/source-changes.js +91 -0
  110. package/dist/improvement/source-changes.js.map +1 -0
  111. package/dist/improvement/task-outcomes.d.ts +82 -0
  112. package/dist/improvement/task-outcomes.d.ts.map +1 -0
  113. package/dist/improvement/task-outcomes.js +72 -0
  114. package/dist/improvement/task-outcomes.js.map +1 -0
  115. package/dist/index.d.ts +10 -0
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +6 -0
  118. package/dist/index.js.map +1 -1
  119. package/dist/isolation/contracts.d.ts +13 -0
  120. package/dist/isolation/contracts.d.ts.map +1 -1
  121. package/dist/isolation/contracts.js +9 -1
  122. package/dist/isolation/contracts.js.map +1 -1
  123. package/dist/isolation/coordinator.d.ts.map +1 -1
  124. package/dist/isolation/coordinator.js +4 -0
  125. package/dist/isolation/coordinator.js.map +1 -1
  126. package/dist/isolation/process.d.ts.map +1 -1
  127. package/dist/isolation/process.js +3 -1
  128. package/dist/isolation/process.js.map +1 -1
  129. package/dist/isolation/worktree.d.ts +9 -1
  130. package/dist/isolation/worktree.d.ts.map +1 -1
  131. package/dist/isolation/worktree.js +8 -3
  132. package/dist/isolation/worktree.js.map +1 -1
  133. package/dist/memory.d.ts +5 -3
  134. package/dist/memory.d.ts.map +1 -1
  135. package/dist/memory.js +8 -6
  136. package/dist/memory.js.map +1 -1
  137. package/dist/migration/assessment-contract.d.ts +60 -0
  138. package/dist/migration/assessment-contract.d.ts.map +1 -0
  139. package/dist/migration/assessment-contract.js +132 -0
  140. package/dist/migration/assessment-contract.js.map +1 -0
  141. package/dist/migration/assessment-schema.d.ts +19 -0
  142. package/dist/migration/assessment-schema.d.ts.map +1 -0
  143. package/dist/migration/assessment-schema.js +43 -0
  144. package/dist/migration/assessment-schema.js.map +1 -0
  145. package/dist/migration/assessment.d.ts +159 -0
  146. package/dist/migration/assessment.d.ts.map +1 -0
  147. package/dist/migration/assessment.js +219 -0
  148. package/dist/migration/assessment.js.map +1 -0
  149. package/dist/migration/cli.d.ts +6 -0
  150. package/dist/migration/cli.d.ts.map +1 -0
  151. package/dist/migration/cli.js +101 -0
  152. package/dist/migration/cli.js.map +1 -0
  153. package/dist/migration/evidence.d.ts +27 -0
  154. package/dist/migration/evidence.d.ts.map +1 -0
  155. package/dist/migration/evidence.js +124 -0
  156. package/dist/migration/evidence.js.map +1 -0
  157. package/dist/migration/example.d.ts +33 -0
  158. package/dist/migration/example.d.ts.map +1 -0
  159. package/dist/migration/example.js +28 -0
  160. package/dist/migration/example.js.map +1 -0
  161. package/dist/migration/index.d.ts +21 -0
  162. package/dist/migration/index.d.ts.map +1 -0
  163. package/dist/migration/index.js +15 -0
  164. package/dist/migration/index.js.map +1 -0
  165. package/dist/migration/inventory.d.ts +70 -0
  166. package/dist/migration/inventory.d.ts.map +1 -0
  167. package/dist/migration/inventory.js +233 -0
  168. package/dist/migration/inventory.js.map +1 -0
  169. package/dist/migration/schema.d.ts +61 -0
  170. package/dist/migration/schema.d.ts.map +1 -0
  171. package/dist/migration/schema.js +76 -0
  172. package/dist/migration/schema.js.map +1 -0
  173. package/dist/migration/verification.d.ts +146 -0
  174. package/dist/migration/verification.d.ts.map +1 -0
  175. package/dist/migration/verification.js +260 -0
  176. package/dist/migration/verification.js.map +1 -0
  177. package/dist/orchestration/actions.d.ts +2 -0
  178. package/dist/orchestration/actions.d.ts.map +1 -1
  179. package/dist/orchestration/actions.js.map +1 -1
  180. package/dist/orchestration/artifact-host.d.ts +46 -0
  181. package/dist/orchestration/artifact-host.d.ts.map +1 -0
  182. package/dist/orchestration/artifact-host.js +64 -0
  183. package/dist/orchestration/artifact-host.js.map +1 -0
  184. package/dist/orchestration/coordinator-actions.d.ts +1 -1
  185. package/dist/orchestration/coordinator-actions.d.ts.map +1 -1
  186. package/dist/orchestration/coordinator-actions.js +5 -3
  187. package/dist/orchestration/coordinator-actions.js.map +1 -1
  188. package/dist/orchestration/coordinator-types.d.ts +23 -2
  189. package/dist/orchestration/coordinator-types.d.ts.map +1 -1
  190. package/dist/orchestration/coordinator.d.ts +5 -0
  191. package/dist/orchestration/coordinator.d.ts.map +1 -1
  192. package/dist/orchestration/coordinator.js +30 -13
  193. package/dist/orchestration/coordinator.js.map +1 -1
  194. package/dist/orchestration/execution-cli.d.ts +1 -1
  195. package/dist/orchestration/execution-cli.d.ts.map +1 -1
  196. package/dist/orchestration/execution-cli.js +29 -6
  197. package/dist/orchestration/execution-cli.js.map +1 -1
  198. package/dist/orchestration/execution-journal.d.ts.map +1 -1
  199. package/dist/orchestration/execution-journal.js +79 -6
  200. package/dist/orchestration/execution-journal.js.map +1 -1
  201. package/dist/orchestration/execution-store.d.ts +5 -1
  202. package/dist/orchestration/execution-store.d.ts.map +1 -1
  203. package/dist/orchestration/execution-store.js +66 -5
  204. package/dist/orchestration/execution-store.js.map +1 -1
  205. package/dist/orchestration/execution.d.ts.map +1 -1
  206. package/dist/orchestration/execution.js +37 -10
  207. package/dist/orchestration/execution.js.map +1 -1
  208. package/dist/orchestration/index.d.ts +6 -0
  209. package/dist/orchestration/index.d.ts.map +1 -1
  210. package/dist/orchestration/index.js +6 -0
  211. package/dist/orchestration/index.js.map +1 -1
  212. package/dist/orchestration/interruption.d.ts +10 -0
  213. package/dist/orchestration/interruption.d.ts.map +1 -0
  214. package/dist/orchestration/interruption.js +38 -0
  215. package/dist/orchestration/interruption.js.map +1 -0
  216. package/dist/orchestration/question-contract.d.ts +19 -0
  217. package/dist/orchestration/question-contract.d.ts.map +1 -0
  218. package/dist/orchestration/question-contract.js +21 -0
  219. package/dist/orchestration/question-contract.js.map +1 -0
  220. package/dist/orchestration/questions.d.ts +9 -0
  221. package/dist/orchestration/questions.d.ts.map +1 -0
  222. package/dist/orchestration/questions.js +75 -0
  223. package/dist/orchestration/questions.js.map +1 -0
  224. package/dist/orchestration/reviewed-ledger.d.ts +23 -0
  225. package/dist/orchestration/reviewed-ledger.d.ts.map +1 -0
  226. package/dist/orchestration/reviewed-ledger.js +49 -0
  227. package/dist/orchestration/reviewed-ledger.js.map +1 -0
  228. package/dist/orchestration/source-candidates.d.ts +64 -0
  229. package/dist/orchestration/source-candidates.d.ts.map +1 -0
  230. package/dist/orchestration/source-candidates.js +95 -0
  231. package/dist/orchestration/source-candidates.js.map +1 -0
  232. package/dist/orchestration/validation.js +1 -1
  233. package/dist/orchestration/validation.js.map +1 -1
  234. package/dist/runlog.js +2 -2
  235. package/dist/runlog.js.map +1 -1
  236. package/dist/runtime/permissions.d.ts.map +1 -1
  237. package/dist/runtime/permissions.js +3 -2
  238. package/dist/runtime/permissions.js.map +1 -1
  239. package/dist/runtime/turn.d.ts +2 -0
  240. package/dist/runtime/turn.d.ts.map +1 -1
  241. package/dist/runtime/turn.js +21 -7
  242. package/dist/runtime/turn.js.map +1 -1
  243. package/dist/session-management/actions.js +1 -1
  244. package/dist/session-management/actions.js.map +1 -1
  245. package/dist/sessions/execution-binding.d.ts +8 -0
  246. package/dist/sessions/execution-binding.d.ts.map +1 -0
  247. package/dist/sessions/execution-binding.js +9 -0
  248. package/dist/sessions/execution-binding.js.map +1 -0
  249. package/dist/sessions/index.d.ts +1 -0
  250. package/dist/sessions/index.d.ts.map +1 -1
  251. package/dist/sessions/index.js +1 -0
  252. package/dist/sessions/index.js.map +1 -1
  253. package/dist/source-changes/writer.d.ts +77 -0
  254. package/dist/source-changes/writer.d.ts.map +1 -0
  255. package/dist/source-changes/writer.js +189 -0
  256. package/dist/source-changes/writer.js.map +1 -0
  257. package/dist/spawning/actions.d.ts +10 -1
  258. package/dist/spawning/actions.d.ts.map +1 -1
  259. package/dist/spawning/actions.js +26 -7
  260. package/dist/spawning/actions.js.map +1 -1
  261. package/dist/spawning/cli.js +1 -1
  262. package/dist/spawning/cli.js.map +1 -1
  263. package/dist/spawning/execution.d.ts.map +1 -1
  264. package/dist/spawning/execution.js +2 -0
  265. package/dist/spawning/execution.js.map +1 -1
  266. package/dist/spawning/types.d.ts +19 -6
  267. package/dist/spawning/types.d.ts.map +1 -1
  268. package/dist/spawning/validation.d.ts +16 -0
  269. package/dist/spawning/validation.d.ts.map +1 -1
  270. package/dist/spawning/validation.js +44 -8
  271. package/dist/spawning/validation.js.map +1 -1
  272. package/dist/storage.d.ts +3 -0
  273. package/dist/storage.d.ts.map +1 -1
  274. package/dist/storage.js +6 -1
  275. package/dist/storage.js.map +1 -1
  276. package/dist/supervision/contracts.js +4 -1
  277. package/dist/supervision/contracts.js.map +1 -1
  278. package/dist/tools.d.ts +1 -0
  279. package/dist/tools.d.ts.map +1 -1
  280. package/dist/tools.js +5 -0
  281. package/dist/tools.js.map +1 -1
  282. package/docs/README.md +66 -0
  283. package/docs/delegation-ledger.md +329 -0
  284. package/docs/migration-assessment.md +113 -0
  285. package/docs/migration-example-plan.json +88 -0
  286. package/docs/migration-example-report.json +511 -0
  287. package/docs/migration-inventory.md +63 -0
  288. package/docs/migration-playbook.md +152 -0
  289. package/docs/migration-verification.md +177 -0
  290. package/docs/releases/3.6.0.md +43 -0
  291. package/package.json +7 -2
@@ -7,25 +7,62 @@
7
7
  * the grant operation. Stops on SIGINT/SIGTERM; reservations stay in the ledger directory. */
8
8
  import * as fs from 'node:fs';
9
9
  import { dirname, join, resolve } from 'node:path';
10
+ import { assertExecutionStoreOutsideProject } from './authority.js';
11
+ import { privateDirectory } from '../orchestration/execution-store.js';
10
12
  import { ReservationLedger } from './ledger.js';
11
13
  import { createLedgerServer } from './ledger-server.js';
12
14
  import { LEDGER_PROTOCOL, LedgerServerState, mintLedgerToken } from './ledger-protocol.js';
13
15
  function option(args, name) { const i = args.indexOf(name); return i >= 0 ? args[i + 1] : undefined; }
14
- export async function runLedgerCommand(args, write = t => process.stdout.write(t)) {
15
- const budget = option(args, '--budget'), project = option(args, '--project'), tokenFile = option(args, '--token-file');
16
- if (args[0] !== 'serve' || !budget || !project || !tokenFile) {
17
- process.stderr.write('usage: calliope ledger serve --budget DIR --project DIR --token-file FILE [--host 127.0.0.1] [--port 0]\n');
16
+ export async function runLedgerCommand(args, write = t => process.stdout.write(t), options = {}) {
17
+ const reviewed = args[0] === 'serve-reviewed', budget = option(args, '--budget'), project = option(args, '--project'), tokenFile = option(args, '--token-file');
18
+ const runId = option(args, '--run'), agentId = option(args, '--agent'), maxOutput = option(args, '--max-output-tokens');
19
+ const flags = new Set(['--run', '--agent', '--max-output-tokens', '--project', '--token-file', '--host', '--port']), seen = new Set();
20
+ let valid = true;
21
+ if (reviewed)
22
+ for (let n = 1; n < args.length; n += 2) {
23
+ const flag = args[n];
24
+ if (!flags.has(flag) || seen.has(flag) || !args[n + 1] || args[n + 1].startsWith('--'))
25
+ valid = false;
26
+ seen.add(flag);
27
+ }
28
+ if (!project || !tokenFile || (reviewed ? (!runId || !agentId || !maxOutput || !valid) : (args[0] !== 'serve' || !budget))) {
29
+ process.stderr.write('usage: calliope ledger serve --budget DIR --project DIR --token-file FILE [--host 127.0.0.1] [--port 0]\n calliope ledger serve-reviewed --run ID --agent ID --max-output-tokens N --project DIR --token-file FILE [--host 127.0.0.1] [--port 0]\n');
18
30
  return 2;
19
31
  }
20
- const ledger = new ReservationLedger(resolve(budget)), cwd = resolve(project), { manifest } = ledger.read(cwd);
21
- const state = new LedgerServerState(join(dirname(ledger.root), `${manifest.runId}.ledger-server`));
22
- fs.writeFileSync(resolve(tokenFile), mintLedgerToken(state.secret(), { v: 1, run: manifest.runId, role: 'parent', exp: manifest.deadline }), { mode: 0o600, flag: 'wx' });
23
- const server = createLedgerServer({ ledger, cwd, state }), host = option(args, '--host') ?? '127.0.0.1';
24
- await new Promise((ok, fail) => { server.once('error', fail); server.listen(Number(option(args, '--port') ?? 0), host, ok); });
25
- const { port } = server.address();
26
- write(JSON.stringify({ protocol: LEDGER_PROTOCOL, url: `http://${host.includes(':') ? `[${host}]` : host}:${port}`, runId: manifest.runId }) + '\n');
27
- await new Promise(done => { for (const signal of ['SIGINT', 'SIGTERM'])
28
- process.once(signal, () => server.close(() => done())); });
29
- return 0;
32
+ const cwd = resolve(project), file = resolve(tokenFile), host = option(args, '--host') ?? '127.0.0.1', port = Number(option(args, '--port') ?? 0);
33
+ let server, token, id, metadata = {};
34
+ if (reviewed) {
35
+ assertExecutionStoreOutsideProject(cwd, file);
36
+ privateDirectory(dirname(file));
37
+ const { prepareReviewedLedger } = await import('../orchestration/reviewed-ledger.js');
38
+ const prepared = await prepareReviewedLedger(cwd, runId, agentId, Number(maxOutput), options);
39
+ server = prepared.server;
40
+ token = prepared.ownerToken;
41
+ id = runId;
42
+ metadata = { ownerAgentId: agentId, deadline: prepared.deadline, reviewed: prepared.capability };
43
+ }
44
+ else {
45
+ const ledger = new ReservationLedger(resolve(budget)), { manifest } = ledger.read(cwd), state = new LedgerServerState(join(dirname(ledger.root), `${manifest.runId}.ledger-server`));
46
+ token = mintLedgerToken(state.secret(), { v: 1, run: manifest.runId, role: 'parent', exp: manifest.deadline });
47
+ server = createLedgerServer({ ledger, cwd, state });
48
+ id = manifest.runId;
49
+ }
50
+ let stop;
51
+ try {
52
+ await new Promise((ok, fail) => { server.once('error', fail); server.listen(port, host, () => { server.off('error', fail); ok(); }); });
53
+ fs.writeFileSync(file, token, { mode: 0o600, flag: 'wx' });
54
+ const { port: boundPort } = server.address();
55
+ write(JSON.stringify({ protocol: LEDGER_PROTOCOL, url: `http://${host.includes(':') ? `[${host}]` : host}:${boundPort}`, runId: id, ...metadata }) + '\n');
56
+ await new Promise(done => { stop = done; for (const signal of ['SIGINT', 'SIGTERM'])
57
+ process.once(signal, stop); });
58
+ return 0;
59
+ }
60
+ finally {
61
+ if (stop)
62
+ for (const signal of ['SIGINT', 'SIGTERM'])
63
+ process.off(signal, stop);
64
+ if (server.listening)
65
+ await new Promise(done => server.close(() => done()));
66
+ }
30
67
  }
31
68
  //# sourceMappingURL=ledger-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-cli.js","sourceRoot":"","sources":["../../src/execution/ledger-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-cli.js","sourceRoot":"","sources":["../../src/execution/ledger-cli.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,16 @@
1
1
  export declare const LEDGER_PROTOCOL = "delegation-ledger/v1";
2
- export declare const LEDGER_OPERATIONS: readonly ['hello', 'journal', 'reserve', 'settle', 'grant', 'revoke'];
2
+ export declare const LEDGER_OPERATIONS: readonly ['hello', 'journal', 'execution', 'reserve', 'settle', 'grant', 'revoke'];
3
3
  export type LedgerOperation = typeof LEDGER_OPERATIONS[number];
4
4
  export declare const MAX_LEDGER_REQUEST_BYTES: number;
5
5
  export interface LedgerTokenClaims {
6
- v: 1;
6
+ v: 1 | 2;
7
7
  run: string;
8
8
  role: 'parent' | 'child';
9
9
  exp: number;
10
+ /** v2 parent tokens: immutable subtree scope. v1 servers reject this version. */
11
+ owner?: string;
12
+ /** Reviewed-host audience. Raw ledger endpoints cannot accept these credentials. */
13
+ authority?: string;
10
14
  /** Child tokens only: the grant they came from, its fencing epoch and the accounts they may charge. */
11
15
  grant?: string;
12
16
  epoch?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-protocol.d.ts","sourceRoot":"","sources":["../../src/execution/ledger-protocol.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe,yBAAuB,CAAC;AACpD,eAAO,MAAM,iBAAiB,YAAE,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAU,CAAC;AAChG,MAAM,MAAM,eAAe,GAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC7D,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAC,CAAC,CAAC;IAAC,GAAG,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,QAAQ,GAAC,OAAO,CAAC;IAAC,GAAG,EAAC,MAAM,CAAC;IACnD,uGAAuG;IACvG,KAAK,CAAC,EAAC,MAAM,CAAC;IAAC,KAAK,CAAC,EAAC,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,CAAC;CAClD;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,iBAAiB,GAAE,MAAM,CAE7E;AACD,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,SAAW,GAAE,iBAAiB,CAa3G;AAED,kGAAkG;AAClG,qBAAa,iBAAiB;IAChB,QAAQ,CAAC,GAAG,EAAC,MAAM;IAA/B,YAAqB,GAAG,EAAC,MAAM,EAAG;IAClC,OAAO,CAAC,MAAM;IAId,MAAM,IAAG,MAAM,CAId;IACD,MAAM,IAAG,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAE7B;IACD,KAAK,CAAC,KAAK,EAAC,MAAM,GAAE,MAAM,CAAkC;IAC5D,wEAAwE;IACxE,SAAS,CAAC,KAAK,EAAC,MAAM,GAAE,OAAO,CAAsC;IACrE,oFAAoF;IACpF,MAAM,CAAC,KAAK,EAAC,MAAM,GAAE,MAAM,CAG1B;CACF"}
1
+ {"version":3,"file":"ledger-protocol.d.ts","sourceRoot":"","sources":["../../src/execution/ledger-protocol.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe,yBAAuB,CAAC;AACpD,eAAO,MAAM,iBAAiB,YAAE,OAAO,EAAC,SAAS,EAAC,WAAW,EAAC,SAAS,EAAC,QAAQ,EAAC,OAAO,EAAC,QAAQ,CAAU,CAAC;AAC5G,MAAM,MAAM,eAAe,GAAC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC7D,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAC,CAAC,GAAC,CAAC,CAAC;IAAC,GAAG,EAAC,MAAM,CAAC;IAAC,IAAI,EAAC,QAAQ,GAAC,OAAO,CAAC;IAAC,GAAG,EAAC,MAAM,CAAC;IACrD,iFAAiF;IACjF,KAAK,CAAC,EAAC,MAAM,CAAC;IACd,oFAAoF;IACpF,SAAS,CAAC,EAAC,MAAM,CAAC;IAClB,uGAAuG;IACvG,KAAK,CAAC,EAAC,MAAM,CAAC;IAAC,KAAK,CAAC,EAAC,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAC,MAAM,EAAE,CAAC;CAClD;AAKD,wBAAgB,eAAe,CAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,iBAAiB,GAAE,MAAM,CAE7E;AACD,iGAAiG;AACjG,wBAAgB,iBAAiB,CAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,SAAW,GAAE,iBAAiB,CAkB3G;AAED,kGAAkG;AAClG,qBAAa,iBAAiB;IAChB,QAAQ,CAAC,GAAG,EAAC,MAAM;IAA/B,YAAqB,GAAG,EAAC,MAAM,EAAG;IAClC,OAAO,CAAC,MAAM;IAId,MAAM,IAAG,MAAM,CAQd;IACD,MAAM,IAAG,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAO7B;IACD,KAAK,CAAC,KAAK,EAAC,MAAM,GAAE,MAAM,CAAkC;IAC5D,wEAAwE;IACxE,SAAS,CAAC,KAAK,EAAC,MAAM,GAAE,OAAO,CAAsC;IACrE,oFAAoF;IACpF,MAAM,CAAC,KAAK,EAAC,MAAM,GAAE,MAAM,CAqB1B;CACF"}
@@ -1,13 +1,15 @@
1
1
  /** delegation-ledger/v1: one parent reservation ledger shared with children on other hosts (#415).
2
2
  * The parent (or an Astrolift-managed service) serves the existing ReservationLedger; children
3
3
  * reserve and settle against it with scoped, fenced bearer tokens. Nothing here widens authority. */
4
- import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
4
+ import { createHmac, randomBytes, randomUUID, timingSafeEqual } from 'node:crypto';
5
5
  import * as fs from 'node:fs';
6
6
  import { join } from 'node:path';
7
7
  import { ExecutionLimitError } from './types.js';
8
- import { uuid, identifier } from './authority.js';
8
+ import { uuid, identifier, hex } from './authority.js';
9
+ import { privateDirectory, readArtifactBytes } from '../orchestration/execution-store.js';
10
+ import { recoverDeadWriterLock } from './writer-recovery.js';
9
11
  export const LEDGER_PROTOCOL = 'delegation-ledger/v1';
10
- export const LEDGER_OPERATIONS = ['hello', 'journal', 'reserve', 'settle', 'grant', 'revoke'];
12
+ export const LEDGER_OPERATIONS = ['hello', 'journal', 'execution', 'reserve', 'settle', 'grant', 'revoke'];
11
13
  export const MAX_LEDGER_REQUEST_BYTES = 256 * 1024;
12
14
  const b64 = (value) => Buffer.from(value).toString('base64url');
13
15
  const sign = (secret, body) => createHmac('sha256', secret).update(body).digest();
@@ -34,15 +36,31 @@ export function verifyLedgerToken(secret, token, runId, now = Date.now()) {
34
36
  catch {
35
37
  throw denied('Ledger token is malformed.');
36
38
  }
37
- if (claims?.v !== 1 || claims.run !== runId || !Number.isSafeInteger(claims.exp) || claims.exp <= now)
39
+ if (!claims || ![1, 2].includes(claims.v) || claims.run !== runId || !Number.isSafeInteger(claims.exp) || claims.exp <= now)
38
40
  throw denied('Ledger token expired or belongs to another run.');
41
+ if (claims.authority !== undefined && (!hex(claims.authority) || claims.v !== 2))
42
+ throw denied('Ledger token authority binding is malformed.');
39
43
  if (claims.role === 'child') {
40
- if (!uuid(claims.grant) || !Number.isSafeInteger(claims.epoch) || !Array.isArray(claims.accounts) || !claims.accounts.length)
44
+ if (claims.v === 2 && !claims.authority || claims.owner !== undefined || !uuid(claims.grant) || !Number.isSafeInteger(claims.epoch) || Number(claims.epoch) < 1 || !Array.isArray(claims.accounts) || !claims.accounts.length)
41
45
  throw denied('Child ledger token is malformed.');
42
46
  for (const account of claims.accounts)
43
47
  identifier(account);
44
48
  }
45
- else if (claims.role !== 'parent')
49
+ else if (claims.role === 'parent') {
50
+ if (claims.v === 2) {
51
+ try {
52
+ identifier(claims.owner);
53
+ }
54
+ catch {
55
+ throw denied('Parent ledger token has no valid owner scope.');
56
+ }
57
+ }
58
+ else if (claims.owner !== undefined)
59
+ throw denied('Scoped parent tokens require version 2.');
60
+ if (claims.grant !== undefined || claims.epoch !== undefined || claims.accounts !== undefined)
61
+ throw denied('Parent ledger token is malformed.');
62
+ }
63
+ else
46
64
  throw denied('Ledger token role is not recognised.');
47
65
  return claims;
48
66
  }
@@ -60,47 +78,115 @@ export class LedgerServerState {
60
78
  if (error.code !== 'EEXIST')
61
79
  throw error;
62
80
  }
63
- const stat = fs.lstatSync(this.dir);
64
- if (!stat.isDirectory() || stat.isSymbolicLink() || stat.mode & 0o077)
81
+ try {
82
+ privateDirectory(this.dir);
83
+ }
84
+ catch {
65
85
  throw new ExecutionLimitError('unavailable', 'Ledger server state directory is not private.');
86
+ }
66
87
  }
67
88
  secret() {
68
89
  this.ensure();
69
90
  const file = join(this.dir, 'server.key');
91
+ let created = false;
92
+ if (!fs.existsSync(file) && fs.existsSync(join(this.dir, 'epochs.json')))
93
+ throw new ExecutionLimitError('unavailable', 'Ledger server key is missing; restore the verified server state.');
70
94
  try {
71
95
  fs.writeFileSync(file, randomBytes(32), { mode: 0o600, flag: 'wx' });
96
+ created = true;
72
97
  }
73
98
  catch (error) {
74
99
  if (error.code !== 'EEXIST')
75
100
  throw error;
76
101
  }
77
- const key = fs.readFileSync(file);
78
- if (key.length !== 32 || fs.statSync(file).mode & 0o077)
79
- throw new ExecutionLimitError('unavailable', 'Ledger server key is damaged or not private.');
80
- return key;
102
+ if (created)
103
+ try {
104
+ fs.writeFileSync(join(this.dir, 'epochs.json'), '{}', { mode: 0o600, flag: 'wx' });
105
+ }
106
+ catch (error) {
107
+ if (error.code !== 'EEXIST')
108
+ throw error;
109
+ }
110
+ this.epochs();
111
+ try {
112
+ const key = readArtifactBytes(file, 32, true);
113
+ if (key.length === 32)
114
+ return key;
115
+ }
116
+ catch { /* Preserve invalid state. */ }
117
+ throw new ExecutionLimitError('unavailable', 'Ledger server key is damaged or not private.');
81
118
  }
82
119
  epochs() {
83
120
  this.ensure();
121
+ const file = join(this.dir, 'epochs.json');
84
122
  try {
85
- return JSON.parse(fs.readFileSync(join(this.dir, 'epochs.json'), 'utf8'));
86
- }
87
- catch (error) {
88
- if (error.code === 'ENOENT')
89
- return {};
90
- throw new ExecutionLimitError('unavailable', 'Ledger grant epochs are damaged.');
123
+ const value = JSON.parse(readArtifactBytes(file, 1024 * 1024, true).toString());
124
+ if (value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length <= 10000 && Object.entries(value).every(([id, epoch]) => uuid(id) && Number.isSafeInteger(epoch) && Number(epoch) >= 1))
125
+ return value;
91
126
  }
127
+ catch { /* Preserve invalid state. */ }
128
+ throw new ExecutionLimitError('unavailable', 'Ledger grant epochs are damaged.');
92
129
  }
93
130
  epoch(grant) { return this.epochs()[grant] ?? 1; }
94
131
  /** Revocation is permanent in v1: a revoked grant is never reissued. */
95
132
  isRevoked(grant) { return (this.epochs()[grant] ?? 1) > 1; }
96
133
  /** Fencing: every token minted for an earlier epoch of this grant stops working. */
97
134
  revoke(grant) {
98
- const epochs = this.epochs(), next = (epochs[grant] ?? 1) + 1;
99
- epochs[grant] = next;
100
- const temp = join(this.dir, `epochs.${process.pid}.tmp`);
101
- fs.writeFileSync(temp, JSON.stringify(epochs), { mode: 0o600 });
102
- fs.renameSync(temp, join(this.dir, 'epochs.json'));
103
- return next;
135
+ if (!uuid(grant))
136
+ throw denied('Invalid child grant.');
137
+ this.ensure();
138
+ const lock = join(this.dir, 'writer.lock');
139
+ let fd;
140
+ try {
141
+ fd = fs.openSync(lock, 'wx', 0o600);
142
+ }
143
+ catch (error) {
144
+ if (error.code !== 'EEXIST')
145
+ throw error;
146
+ if (!recoverDeadWriterLock(lock))
147
+ throw new ExecutionLimitError('locked', 'Ledger grant state has another writer.');
148
+ try {
149
+ fd = fs.openSync(lock, 'wx', 0o600);
150
+ }
151
+ catch {
152
+ throw new ExecutionLimitError('locked', 'Ledger grant state has another writer.');
153
+ }
154
+ }
155
+ const identity = fs.fstatSync(fd), temp = join(this.dir, `epochs.${randomUUID()}.tmp`);
156
+ try {
157
+ fs.writeFileSync(fd, String(process.pid));
158
+ const epochs = this.epochs(), next = (epochs[grant] ?? 1) + 1;
159
+ if (!Number.isSafeInteger(next) || !Object.hasOwn(epochs, grant) && Object.keys(epochs).length >= 10000)
160
+ throw new ExecutionLimitError('limit', 'Ledger revocation retention reached.');
161
+ epochs[grant] = next;
162
+ const output = fs.openSync(temp, 'wx', 0o600);
163
+ try {
164
+ fs.writeFileSync(output, JSON.stringify(epochs));
165
+ fs.fsyncSync(output);
166
+ }
167
+ finally {
168
+ fs.closeSync(output);
169
+ }
170
+ fs.renameSync(temp, join(this.dir, 'epochs.json'));
171
+ if (process.platform !== 'win32') {
172
+ const directory = fs.openSync(this.dir, 'r');
173
+ try {
174
+ fs.fsyncSync(directory);
175
+ }
176
+ finally {
177
+ fs.closeSync(directory);
178
+ }
179
+ }
180
+ return next;
181
+ }
182
+ finally {
183
+ fs.closeSync(fd);
184
+ const current = fs.lstatSync(lock);
185
+ if (current.dev === identity.dev && current.ino === identity.ino) {
186
+ fs.rmSync(temp, { force: true });
187
+ fs.unlinkSync(lock);
188
+ }
189
+ }
104
190
  }
105
191
  }
106
192
  //# sourceMappingURL=ledger-protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-protocol.js","sourceRoot":"","sources":["../../src/execution/ledger-protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-protocol.js","sourceRoot":"","sources":["../../src/execution/ledger-protocol.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * authority: this adds authentication, per-account ownership, idempotent replay and grant fencing. */
3
3
  import * as http from 'node:http';
4
4
  import { ReservationLedger } from './ledger.js';
5
+ import { type ChildGrant, type RequestReservation } from './types.js';
5
6
  import { LedgerServerState } from './ledger-protocol.js';
6
7
  export interface LedgerServerOptions {
7
8
  ledger: ReservationLedger;
@@ -9,6 +10,18 @@ export interface LedgerServerOptions {
9
10
  cwd: string;
10
11
  state: LedgerServerState;
11
12
  now?: () => number;
13
+ /** Restrict this endpoint to one owner subtree, even for otherwise valid tokens. */
14
+ ownerAgentId?: string;
15
+ /** Exact reviewed-host audience; authenticated tokens cannot downgrade to raw serving. */
16
+ authority?: string;
17
+ /** Trusted reviewed host: target-account lifecycle and existing native grant checks. */
18
+ assertAccountAuthority?: (agentId: string) => void;
19
+ assertReservationAuthority?: (reservation: RequestReservation) => void;
20
+ assertGrantAuthority?: (grant: ChildGrant) => void;
21
+ /** Trusted owner lifecycle check, e.g. prepareAgentExecution().assertAuthority.
22
+ * Fences new reservations/grants under the writer lock; reads, replay and
23
+ * settlement remain available to reconcile already admitted requests. */
24
+ assertAuthority?: () => void;
12
25
  }
13
26
  export declare function createLedgerServer(options: LedgerServerOptions): http.Server;
14
27
  //# sourceMappingURL=ledger-server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-server.d.ts","sourceRoot":"","sources":["../../src/execution/ledger-server.ts"],"names":[],"mappings":"AAAA;sGACsG;AACtG,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAI9C,OAAO,EAA4D,iBAAiB,EAA0D,MAAM,sBAAsB,CAAC;AAE3K,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAC,iBAAiB,CAAC;IACzB,oFAAoF;IACpF,GAAG,EAAC,MAAM,CAAC;IACX,KAAK,EAAC,iBAAiB,CAAC;IACxB,GAAG,CAAC,EAAC,MAAI,MAAM,CAAC;CACjB;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAC,mBAAmB,GAAE,IAAI,CAAC,MAAM,CAwF1E"}
1
+ {"version":3,"file":"ledger-server.d.ts","sourceRoot":"","sources":["../../src/execution/ledger-server.ts"],"names":[],"mappings":"AAAA;sGACsG;AACtG,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAqB,KAAK,UAAU,EAAC,KAAK,kBAAkB,EAAwB,MAAM,YAAY,CAAC;AAG9G,OAAO,EAA4D,iBAAiB,EAA0D,MAAM,sBAAsB,CAAC;AAE3K,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAC,iBAAiB,CAAC;IACzB,oFAAoF;IACpF,GAAG,EAAC,MAAM,CAAC;IACX,KAAK,EAAC,iBAAiB,CAAC;IACxB,GAAG,CAAC,EAAC,MAAI,MAAM,CAAC;IAChB,oFAAoF;IACpF,YAAY,CAAC,EAAC,MAAM,CAAC;IACrB,0FAA0F;IAC1F,SAAS,CAAC,EAAC,MAAM,CAAC;IAClB,wFAAwF;IACxF,sBAAsB,CAAC,EAAC,CAAC,OAAO,EAAC,MAAM,KAAG,IAAI,CAAC;IAC/C,0BAA0B,CAAC,EAAC,CAAC,WAAW,EAAC,kBAAkB,KAAG,IAAI,CAAC;IACnE,oBAAoB,CAAC,EAAC,CAAC,KAAK,EAAC,UAAU,KAAG,IAAI,CAAC;IAC/C;;6EAEyE;IACzE,eAAe,CAAC,EAAC,MAAI,IAAI,CAAC;CAC3B;AAID,wBAAgB,kBAAkB,CAAC,OAAO,EAAC,mBAAmB,GAAE,IAAI,CAAC,MAAM,CAkH1E"}
@@ -3,13 +3,20 @@
3
3
  import * as http from 'node:http';
4
4
  import { canonicalJson } from '../approvals/index.js';
5
5
  import { ExecutionLimitError } from './types.js';
6
- import { accountLineage } from './authority.js';
7
- import { effectiveExecutionManifest } from './child-grants.js';
6
+ import { accountLineage, identifier, hex, validateExecutionProject } from './authority.js';
7
+ import { effectiveExecutionManifest, executionProjectForAccount } from './child-grants.js';
8
8
  import { LEDGER_PROTOCOL, LEDGER_OPERATIONS, MAX_LEDGER_REQUEST_BYTES, mintLedgerToken, verifyLedgerToken } from './ledger-protocol.js';
9
9
  const STATUS = { invalid: 400, authority: 403, budget: 409, deadline: 409, conflict: 409, limit: 409, locked: 503, unavailable: 503 };
10
10
  export function createLedgerServer(options) {
11
11
  const { ledger, cwd, state } = options, now = options.now ?? Date.now, secret = state.secret();
12
+ if (options.authority !== undefined && !hex(options.authority))
13
+ throw new ExecutionLimitError('invalid', 'Invalid ledger authority binding.');
12
14
  const current = () => ledger.read(cwd);
15
+ if (options.ownerAgentId !== undefined) {
16
+ identifier(options.ownerAgentId);
17
+ const saved = current();
18
+ accountLineage(effectiveExecutionManifest(saved.manifest, saved.projection), options.ownerAgentId);
19
+ }
13
20
  const journal = () => { const { manifest, events } = current(); return { manifest, events }; };
14
21
  const assertActive = (token) => {
15
22
  if (token.exp <= now())
@@ -21,7 +28,14 @@ export function createLedgerServer(options) {
21
28
  const header = req.headers.authorization ?? '';
22
29
  const run = current().manifest.runId;
23
30
  const token = verifyLedgerToken(secret, header.startsWith('Bearer ') ? header.slice(7) : undefined, run, now());
31
+ if (token.authority !== options.authority)
32
+ throw new ExecutionLimitError('authority', 'Ledger token belongs to another authority binding.');
24
33
  assertActive(token);
34
+ if (options.ownerAgentId !== undefined) {
35
+ const roots = token.role === 'child' ? token.accounts : token.v === 2 ? [token.owner] : [];
36
+ if (!roots.length || roots.some(id => !within(id, options.ownerAgentId)))
37
+ throw new ExecutionLimitError('authority', 'Ledger token belongs to another owner scope.');
38
+ }
25
39
  return token;
26
40
  };
27
41
  /** Revoking a grant fences every descendant account, whichever token it was minted under. */
@@ -29,17 +43,35 @@ export function createLedgerServer(options) {
29
43
  const saved = current(), effective = effectiveExecutionManifest(saved.manifest, saved.projection), records = saved.projection.childGrants ?? [];
30
44
  return accounts.some(id => accountLineage(effective, id).some(a => records.some(r => state.isRevoked(r.grant.id) && r.grant.accounts.some(g => g.id === a.id))));
31
45
  };
32
- /** A child may act only for its own accounts and their descendants (grandchildren it granted). */
46
+ const within = (agentId, owner) => {
47
+ const saved = current();
48
+ return accountLineage(effectiveExecutionManifest(saved.manifest, saved.projection), agentId).some(a => a.id === owner);
49
+ };
50
+ /** Token scope survives reuse at another endpoint serving the same run. */
33
51
  const owns = (token, agentId) => {
34
- if (token.role === 'parent')
35
- return;
36
- const saved = current(), effective = effectiveExecutionManifest(saved.manifest, saved.projection);
37
- if (!accountLineage(effective, agentId).some(a => token.accounts.includes(a.id)))
52
+ identifier(agentId);
53
+ if (options.ownerAgentId !== undefined && !within(agentId, options.ownerAgentId))
54
+ throw new ExecutionLimitError('authority', 'This endpoint cannot act for that account.');
55
+ if (token.role === 'parent') {
56
+ if (token.v === 2 && !within(agentId, token.owner))
57
+ throw new ExecutionLimitError('authority', 'This parent token cannot act for that account.');
58
+ }
59
+ else if (!token.accounts.some(owner => within(agentId, owner)))
38
60
  throw new ExecutionLimitError('authority', 'This token cannot act for that account.');
39
61
  };
40
62
  const handlers = {
41
63
  hello: async () => { const { manifest } = current(); return { protocol: LEDGER_PROTOCOL, operations: LEDGER_OPERATIONS, runId: manifest.runId }; },
42
64
  journal: async () => journal(),
65
+ execution: async (token, body) => {
66
+ identifier(body.agentId);
67
+ owns(token, body.agentId);
68
+ const project = validateExecutionProject(body.project), saved = current();
69
+ if (canonicalJson(project) !== canonicalJson(executionProjectForAccount(saved.manifest, saved.projection, body.agentId)))
70
+ throw new ExecutionLimitError('authority', 'Workspace does not match the owner-declared child project.');
71
+ options.assertAuthority?.();
72
+ options.assertAccountAuthority?.(body.agentId);
73
+ return { ...journal(), binding: { version: 1, agentId: body.agentId, project } };
74
+ },
43
75
  reserve: async (token, body, outcome) => {
44
76
  const reservation = body.reservation, hash = String(body.manifestHash);
45
77
  owns(token, reservation?.agentId);
@@ -50,8 +82,10 @@ export function createLedgerServer(options) {
50
82
  throw new ExecutionLimitError('conflict', 'Reservation id already admitted a different request.');
51
83
  return { ...journal(), replayed: true };
52
84
  }
85
+ const assertAdmission = () => { assertActive(token); owns(token, reservation.agentId); options.assertAuthority?.(); options.assertAccountAuthority?.(reservation.agentId); options.assertReservationAuthority?.(reservation); };
53
86
  try {
54
- await ledger.reserve(cwd, hash, reservation, undefined, () => assertActive(token));
87
+ assertAdmission();
88
+ await ledger.reserve(cwd, hash, reservation, undefined, assertAdmission);
55
89
  }
56
90
  catch (error) {
57
91
  // The local operation has finished. Prove non-admission from the same
@@ -74,8 +108,11 @@ export function createLedgerServer(options) {
74
108
  owns(token, entry.reservation.agentId);
75
109
  if (entry.state !== 'pending') {
76
110
  const settled = saved.events.find(e => e.change.type === 'settle' && e.change.settlement.requestId === settlement.requestId);
77
- if (settled && settled.change.type === 'settle' && canonicalJson(settled.change.settlement) === canonicalJson(settlement))
111
+ if (settled && settled.change.type === 'settle' && canonicalJson(settled.change.settlement) === canonicalJson(settlement)) {
112
+ if (saved.manifest.parent)
113
+ await ledger.settle(cwd, hash, settlement);
78
114
  return { ...journal(), replayed: true };
115
+ }
79
116
  throw new ExecutionLimitError('conflict', 'Request was already settled differently.');
80
117
  }
81
118
  await ledger.settle(cwd, hash, settlement);
@@ -84,24 +121,31 @@ export function createLedgerServer(options) {
84
121
  grant: async (token, body) => {
85
122
  const grant = body.grant, hash = String(body.manifestHash);
86
123
  owns(token, grant?.parentId);
124
+ if (grant?.version === 2 && token.role !== 'parent')
125
+ throw new ExecutionLimitError('authority', 'Only the ledger owner can bind a child to another workspace.');
87
126
  const assertGrant = () => {
88
127
  assertActive(token);
128
+ owns(token, grant?.parentId);
129
+ options.assertAuthority?.();
130
+ options.assertAccountAuthority?.(grant?.parentId);
131
+ options.assertGrantAuthority?.(grant);
89
132
  if (grant?.id && state.isRevoked(grant.id))
90
133
  throw new ExecutionLimitError('authority', 'This child grant was revoked and cannot be reissued.');
91
134
  };
92
135
  assertGrant();
93
136
  await ledger.grantChildren(cwd, hash, grant, undefined, assertGrant);
94
137
  assertGrant();
95
- const deadline = Math.min(...grant.accounts.map(a => a.deadline));
96
- const child = mintLedgerToken(secret, { v: 1, run: current().manifest.runId, role: 'child', grant: grant.id, epoch: state.epoch(grant.id), accounts: grant.accounts.map(a => a.id), exp: deadline });
138
+ const deadline = Math.min(token.exp, ...grant.accounts.map(a => a.deadline));
139
+ const child = mintLedgerToken(secret, { v: token.authority ? 2 : 1, ...(token.authority ? { authority: token.authority } : {}), run: current().manifest.runId, role: 'child', grant: grant.id, epoch: state.epoch(grant.id), accounts: grant.accounts.map(a => a.id), exp: deadline });
97
140
  return { ...journal(), token: child };
98
141
  },
99
142
  revoke: async (token, body) => {
100
143
  if (token.role !== 'parent')
101
144
  throw new ExecutionLimitError('authority', 'Only the parent can revoke a child grant.');
102
- const grant = String(body.grant);
103
- if (!current().projection.childGrants?.some(r => r.grant.id === grant))
145
+ const grant = String(body.grant), record = current().projection.childGrants?.find(r => r.grant.id === grant);
146
+ if (!record)
104
147
  throw new ExecutionLimitError('conflict', 'No such child grant.');
148
+ owns(token, record.grant.parentId);
105
149
  return { grant, epoch: state.revoke(grant) };
106
150
  },
107
151
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-server.js","sourceRoot":"","sources":["../../src/execution/ledger-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-server.js","sourceRoot":"","sources":["../../src/execution/ledger-server.ts"],"names":[],"mappings":"AAAA;sGACsG;AACtG,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAC,aAAa,EAAC,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAC,mBAAmB,EAAgE,MAAM,YAAY,CAAC;AAC9G,OAAO,EAAC,cAAc,EAAC,UAAU,EAAC,GAAG,EAAC,wBAAwB,EAAC,MAAM,gBAAgB,CAAC;AACtF,OAAO,EAAC,0BAA0B,EAAC,0BAA0B,EAAC,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAC,eAAe,EAAC,iBAAiB,EAAC,wBAAwB,EAAmB,eAAe,EAAC,iBAAiB,EAAwB,MAAM,sBAAsB,CAAC;AAqB3K,MAAM,MAAM,GAA4C,EAAC,OAAO,EAAC,GAAG,EAAC,SAAS,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,QAAQ,EAAC,GAAG,EAAC,KAAK,EAAC,GAAG,EAAC,MAAM,EAAC,GAAG,EAAC,WAAW,EAAC,GAAG,EAAC,CAAC;AAG9J,MAAM,UAAU,kBAAkB,CAAC,OAA2B;IAC5D,MAAM,EAAC,MAAM,EAAC,GAAG,EAAC,KAAK,EAAC,GAAC,OAAO,EAAC,GAAG,GAAC,OAAO,CAAC,GAAG,IAAE,IAAI,CAAC,GAAG,EAAC,MAAM,GAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACjF,IAAG,OAAO,CAAC,SAAS,KAAG,SAAS,IAAE,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC;QAAC,MAAM,IAAI,mBAAmB,CAAC,SAAS,EAAC,mCAAmC,CAAC,CAAC;IACvI,MAAM,OAAO,GAAC,GAAE,EAAE,CAAA,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,IAAG,OAAO,CAAC,YAAY,KAAG,SAAS,EAAC,CAAC;QAAA,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAAA,MAAM,KAAK,GAAC,OAAO,EAAE,CAAC;QAAA,cAAc,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,UAAU,CAAC,EAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAAA,CAAC;IAC9L,MAAM,OAAO,GAAC,GAAE,EAAE,GAAC,MAAM,EAAC,QAAQ,EAAC,MAAM,EAAC,GAAC,OAAO,EAAE,CAAC,CAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,CAAC,CAAA,CAAC,CAAC;IAChF,MAAM,YAAY,GAAC,CAAC,KAAuB,EAAC,EAAE;QAC5C,IAAG,KAAK,CAAC,GAAG,IAAE,GAAG,EAAE;YAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,2DAA2D,CAAC,CAAC;QAC3H,IAAG,KAAK,CAAC,IAAI,KAAG,OAAO,IAAE,CAAC,KAAK,CAAC,KAAK,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAM,CAAC,IAAE,cAAc,CAAC,KAAK,CAAC,QAAS,CAAC,CAAC;YAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,2FAA2F,CAAC,CAAC;IAC7O,CAAC,CAAC;IACF,MAAM,MAAM,GAAC,CAAC,GAAwB,EAAmB,EAAE;QACzD,MAAM,MAAM,GAAC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAE,EAAE,CAAC;QAAA,MAAM,GAAG,GAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9E,MAAM,KAAK,GAAC,iBAAiB,CAAC,MAAM,EAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAAC,CAAA,SAAS,EAAC,GAAG,EAAC,GAAG,EAAE,CAAC,CAAC;QACvG,IAAG,KAAK,CAAC,SAAS,KAAG,OAAO,CAAC,SAAS;YAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,oDAAoD,CAAC,CAAC;QACvI,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAG,OAAO,CAAC,YAAY,KAAG,SAAS,EAAC,CAAC;YACnC,MAAM,KAAK,GAAC,KAAK,CAAC,IAAI,KAAG,OAAO,CAAA,CAAC,CAAA,KAAK,CAAC,QAAS,CAAA,CAAC,CAAA,KAAK,CAAC,CAAC,KAAG,CAAC,CAAA,CAAC,CAAA,CAAC,KAAK,CAAC,KAAM,CAAC,CAAA,CAAC,CAAA,EAAE,CAAC;YAC/E,IAAG,CAAC,KAAK,CAAC,MAAM,IAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAA,EAAE,CAAA,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,CAAC,YAAa,CAAC,CAAC;gBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,8CAA8C,CAAC,CAAC;QAChK,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,6FAA6F;IAC7F,MAAM,cAAc,GAAC,CAAC,QAAiB,EAAS,EAAE;QAChD,MAAM,KAAK,GAAC,OAAO,EAAE,EAAC,SAAS,GAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,UAAU,CAAC,EAAC,OAAO,GAAC,KAAK,CAAC,UAAU,CAAC,WAAW,IAAE,EAAE,CAAC;QACrI,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAA,EAAE,CAAA,cAAc,CAAC,SAAS,EAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtJ,CAAC,CAAC;IACF,MAAM,MAAM,GAAC,CAAC,OAAc,EAAC,KAAY,EAAS,EAAE;QAClD,MAAM,KAAK,GAAC,OAAO,EAAE,CAAC;QAAA,OAAO,cAAc,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,UAAU,CAAC,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,KAAG,KAAK,CAAC,CAAC;IACzI,CAAC,CAAC;IACF,2EAA2E;IAC3E,MAAM,IAAI,GAAC,CAAC,KAAuB,EAAC,OAAc,EAAC,EAAE;QACnD,UAAU,CAAC,OAAO,CAAC,CAAC;QACpB,IAAG,OAAO,CAAC,YAAY,KAAG,SAAS,IAAE,CAAC,MAAM,CAAC,OAAO,EAAC,OAAO,CAAC,YAAY,CAAC;YAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,4CAA4C,CAAC,CAAC;QACnK,IAAG,KAAK,CAAC,IAAI,KAAG,QAAQ,EAAC,CAAC;YACxB,IAAG,KAAK,CAAC,CAAC,KAAG,CAAC,IAAE,CAAC,MAAM,CAAC,OAAO,EAAC,KAAK,CAAC,KAAM,CAAC;gBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,gDAAgD,CAAC,CAAC;QAC5I,CAAC;aAAK,IAAG,CAAC,KAAK,CAAC,QAAS,CAAC,IAAI,CAAC,KAAK,CAAA,EAAE,CAAA,MAAM,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC;YAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,yCAAyC,CAAC,CAAC;IACpJ,CAAC,CAAC;IACF,MAAM,QAAQ,GAAiH;QAC7H,KAAK,EAAC,KAAK,IAAE,EAAE,GAAC,MAAM,EAAC,QAAQ,EAAC,GAAC,OAAO,EAAE,CAAC,CAAA,OAAO,EAAC,QAAQ,EAAC,eAAe,EAAC,UAAU,EAAC,iBAAiB,EAAC,KAAK,EAAC,QAAQ,CAAC,KAAK,EAAC,CAAC,CAAA,CAAC;QAChI,OAAO,EAAC,KAAK,IAAE,EAAE,CAAA,OAAO,EAAE;QAC1B,SAAS,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YAC3B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAAA,IAAI,CAAC,KAAK,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,OAAO,GAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAC,KAAK,GAAC,OAAO,EAAE,CAAC;YACrE,IAAG,aAAa,CAAC,OAAO,CAAC,KAAG,aAAa,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAC,KAAK,CAAC,UAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,4DAA4D,CAAC,CAAC;YAC5N,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;YAAA,OAAO,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3E,OAAO,EAAC,GAAG,OAAO,EAAE,EAAC,OAAO,EAAC,EAAC,OAAO,EAAC,CAAC,EAAC,OAAO,EAAC,IAAI,CAAC,OAAO,EAAC,OAAO,EAAC,EAAC,CAAC;QACzE,CAAC;QACD,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,OAAO,EAAC,EAAE;YACjC,MAAM,WAAW,GAAC,IAAI,CAAC,WAAiC,EAAC,IAAI,GAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAA,IAAI,CAAC,KAAK,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACzH,MAAM,KAAK,GAAC,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC3D,0FAA0F;YAC1F,IAAG,KAAK,EAAC,CAAC;gBAAA,IAAG,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,KAAG,aAAa,CAAC,WAAW,CAAC;oBAAC,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAC,sDAAsD,CAAC,CAAC;gBAAA,OAAO,EAAC,GAAG,OAAO,EAAE,EAAC,QAAQ,EAAC,IAAI,EAAC,CAAC;YAAA,CAAC;YACjN,MAAM,eAAe,GAAC,GAAE,EAAE,GAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA,IAAI,CAAC,KAAK,EAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAA,OAAO,CAAC,sBAAsB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA,OAAO,CAAC,0BAA0B,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA,CAAC,CAAC;YACrN,IAAG,CAAC;gBAAA,eAAe,EAAE,CAAC;gBAAA,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAC,IAAI,EAAC,WAAW,EAAC,SAAS,EAAC,eAAe,CAAC,CAAC;YAAA,CAAC;YAC5F,OAAM,KAAK,EAAC,CAAC;gBACX,sEAAsE;gBACtE,sEAAsE;gBACtE,IAAG,CAAC;oBAAA,MAAM,KAAK,GAAC,OAAO,EAAE,CAAC;oBAAA,IAAG,KAAK,CAAC,UAAU,CAAC,YAAY,KAAG,IAAI,IAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;wBAAC,OAAO,CAAC,SAAS,GAAC,SAAS,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC,CAAA,2BAA2B,CAAA,CAAC;gBAC7K,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACxB,MAAM,UAAU,GAAC,IAAI,CAAC,UAA+B,EAAC,IAAI,GAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACrF,MAAM,KAAK,GAAC,OAAO,EAAE,EAAC,KAAK,GAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YAC7E,IAAG,CAAC,KAAK;gBAAC,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAC,6BAA6B,CAAC,CAAC;YAAA,IAAI,CAAC,KAAK,EAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACxH,IAAG,KAAK,CAAC,KAAK,KAAG,SAAS,EAAC,CAAC;gBAC1B,MAAM,OAAO,GAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,MAAM,CAAC,IAAI,KAAG,QAAQ,IAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,KAAG,UAAU,CAAC,SAAS,CAAC,CAAC;gBACnH,IAAG,OAAO,IAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAG,QAAQ,IAAE,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAG,aAAa,CAAC,UAAU,CAAC,EAAC,CAAC;oBAChH,IAAG,KAAK,CAAC,QAAQ,CAAC,MAAM;wBAAC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAC,IAAI,EAAC,UAAU,CAAC,CAAC;oBAClE,OAAO,EAAC,GAAG,OAAO,EAAE,EAAC,QAAQ,EAAC,IAAI,EAAC,CAAC;gBACtC,CAAC;gBACD,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAC,0CAA0C,CAAC,CAAC;YACvF,CAAC;YACD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAC,IAAI,EAAC,UAAU,CAAC,CAAC;YAAA,OAAO,OAAO,EAAE,CAAC;QAC5D,CAAC;QACD,KAAK,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACvB,MAAM,KAAK,GAAC,IAAI,CAAC,KAAmB,EAAC,IAAI,GAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAA,IAAI,CAAC,KAAK,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChG,IAAG,KAAK,EAAE,OAAO,KAAG,CAAC,IAAE,KAAK,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,8DAA8D,CAAC,CAAC;YACvJ,MAAM,WAAW,GAAC,GAAE,EAAE;gBACpB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,KAAK,EAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAAA,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;gBAAA,OAAO,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAAA,OAAO,CAAC,oBAAoB,EAAE,CAAC,KAAK,CAAC,CAAC;gBAChJ,IAAG,KAAK,EAAE,EAAE,IAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;oBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,sDAAsD,CAAC,CAAC;YAC5I,CAAC,CAAC;YACF,WAAW,EAAE,CAAC;YAAA,MAAM,MAAM,CAAC,aAAa,CAAC,GAAG,EAAC,IAAI,EAAC,KAAK,EAAC,SAAS,EAAC,WAAW,CAAC,CAAC;YAAA,WAAW,EAAE,CAAC;YAC7F,MAAM,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAC,eAAe,CAAC,MAAM,EAAC,EAAC,CAAC,EAAC,KAAK,CAAC,SAAS,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,CAAA,CAAC,EAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAA,CAAC,CAAA,EAAC,SAAS,EAAC,KAAK,CAAC,SAAS,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,GAAG,EAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,EAAE,EAAC,KAAK,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,EAAE,CAAC,EAAC,GAAG,EAAC,QAAQ,EAAC,CAAC,CAAC;YACvP,OAAO,EAAC,GAAG,OAAO,EAAE,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC;QACpC,CAAC;QACD,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAC,EAAE;YACxB,IAAG,KAAK,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,IAAI,mBAAmB,CAAC,WAAW,EAAC,2CAA2C,CAAC,CAAC;YAChH,MAAM,KAAK,GAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAC,MAAM,GAAC,OAAO,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,KAAK,CAAC,EAAE,KAAG,KAAK,CAAC,CAAC;YAAA,IAAG,CAAC,MAAM;gBAAC,MAAM,IAAI,mBAAmB,CAAC,UAAU,EAAC,sBAAsB,CAAC,CAAC;YAChL,IAAI,CAAC,KAAK,EAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAAA,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC;QAC7E,CAAC;KACF,CAAC;IACF,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAC,GAAG,EAAC,EAAE;QAClC,MAAM,KAAK,GAAC,CAAC,MAAa,EAAC,KAAa,EAAC,EAAE,GAAC,MAAM,GAAG,GAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA,GAAG,CAAC,SAAS,CAAC,MAAM,EAAC,EAAC,cAAc,EAAC,kBAAkB,EAAC,eAAe,EAAC,UAAU,EAAC,CAAC,CAAC,CAAA,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA,CAAC,CAAC;QAChL,MAAM,EAAE,GAAC,CAAC,GAAG,CAAC,GAAG,IAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAC,EAAE,CAAC,CAAC;QAC7C,IAAG,GAAG,CAAC,MAAM,KAAG,MAAM,IAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAC,EAAE,CAAC,EAAC,CAAC;YAAA,KAAK,CAAC,GAAG,EAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,SAAS,EAAC,OAAO,EAAC,2BAA2B,EAAC,CAAC,CAAC;YAAA,OAAO;QAAA,CAAC;QACtI,MAAM,MAAM,GAAU,EAAE,CAAC;QAAA,IAAI,IAAI,GAAC,CAAC,CAAC;QACpC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAC,CAAC,KAAY,EAAC,EAAE,GAAC,IAAI,IAAE,KAAK,CAAC,MAAM,CAAC,CAAA,IAAG,IAAI,GAAC,wBAAwB,EAAC,CAAC;YAAA,KAAK,CAAC,GAAG,EAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,8BAA8B,EAAC,CAAC,CAAC;YAAA,GAAG,CAAC,OAAO,EAAE,CAAC;QAAA,CAAC;;YAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;QACxM,GAAG,CAAC,EAAE,CAAC,KAAK,EAAC,GAAE,EAAE;YAAC,KAAK,CAAC,KAAK,IAAE,EAAE;gBAC/B,MAAM,OAAO,GAAkB,EAAC,SAAS,EAAC,SAAS,EAAC,CAAC;gBACrD,IAAG,CAAC;oBACF,MAAM,KAAK,GAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAAA,IAAI,IAAY,CAAC;oBAAA,IAAG,CAAC;wBAAA,IAAI,GAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAE,IAAI,CAAC,CAAC;oBAAA,CAAC;oBAAA,MAAK,CAAC;wBAAA,MAAM,IAAI,mBAAmB,CAAC,SAAS,EAAC,6BAA6B,CAAC,CAAC;oBAAA,CAAC;oBAC1L,IAAG,CAAC,IAAI,IAAE,OAAO,IAAI,KAAG,QAAQ,IAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;wBAAC,MAAM,IAAI,mBAAmB,CAAC,SAAS,EAAC,mCAAmC,CAAC,CAAC;oBACnI,KAAK,CAAC,GAAG,EAAC,EAAC,EAAE,EAAC,IAAI,EAAC,GAAG,CAAC,MAAM,QAAQ,CAAC,EAAE,CAAE,CAAC,KAAK,EAAC,IAA8B,EAAC,OAAO,CAAC,CAAW,EAAC,CAAC,CAAC;gBACxG,CAAC;gBAAA,OAAM,KAAK,EAAC,CAAC;oBACZ,wFAAwF;oBACxF,IAAG,KAAK,YAAY,mBAAmB;wBAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,GAAG,CAAC,EAAE,KAAG,SAAS,CAAA,CAAC,CAAA,OAAO,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,CAAC;;wBAC7I,KAAK,CAAC,GAAG,EAAC,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,aAAa,EAAC,OAAO,EAAC,mDAAmD,EAAC,CAAC,CAAC;gBAC5G,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QAAA,CAAC,CAAC,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC"}