firedrill-run 2.2.5 → 3.0.1

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 (392) hide show
  1. package/README.md +176 -22
  2. package/bin/firedrill.mjs +29 -5
  3. package/dist/assembly.json +13 -0
  4. package/dist/cli/runtime/candidate_copy.py +395 -0
  5. package/dist/cli/runtime/source_snapshot.py +391 -0
  6. package/dist/cli/src/administration.js +295 -0
  7. package/dist/cli/src/agent-changes.js +496 -0
  8. package/dist/cli/src/assessment-requests.js +67 -0
  9. package/dist/cli/src/auth.js +506 -0
  10. package/dist/cli/src/billing-commerce-contracts.js +1 -0
  11. package/dist/cli/src/billing-usage.js +227 -0
  12. package/dist/cli/src/billing-wallet-contracts.js +1 -0
  13. package/dist/cli/src/billing.js +170 -0
  14. package/dist/cli/src/bootstrap-process-lock.js +136 -0
  15. package/dist/cli/src/browser-links.js +14 -0
  16. package/dist/cli/src/campaign-controls.js +122 -0
  17. package/dist/cli/src/campaign-diagnoses.js +118 -0
  18. package/dist/cli/src/campaign-reports.js +1215 -0
  19. package/dist/cli/src/campaign-world.js +156 -0
  20. package/dist/cli/src/candidate-copy.js +376 -0
  21. package/dist/cli/src/catalog-contracts.js +1 -0
  22. package/dist/cli/src/ci-access-contracts.js +1 -0
  23. package/dist/cli/src/ci-configuration-contracts.js +1 -0
  24. package/dist/cli/src/ci-coverage.js +64 -0
  25. package/dist/cli/src/ci-delivery-contracts.js +1 -0
  26. package/dist/cli/src/ci-result-contracts.js +1 -0
  27. package/dist/cli/src/ci-run-contracts.js +1 -0
  28. package/dist/cli/src/ci-setup-proposals.js +52 -0
  29. package/dist/cli/src/company-policies.js +229 -0
  30. package/dist/cli/src/completion.js +79 -0
  31. package/dist/cli/src/configuration-intents.js +277 -0
  32. package/dist/cli/src/configuration.js +369 -0
  33. package/dist/cli/src/continuous-simulation.js +277 -0
  34. package/dist/cli/src/coordinated-checkpoints.js +133 -0
  35. package/dist/cli/src/credential-mode.js +139 -0
  36. package/dist/cli/src/credentials.js +331 -0
  37. package/dist/cli/src/credit-format.js +8 -0
  38. package/dist/cli/src/dataset-contracts.js +1 -0
  39. package/dist/cli/src/dataset-export.js +154 -0
  40. package/dist/cli/src/dataset-reads.js +37 -0
  41. package/dist/cli/src/dependency-preparation.js +239 -0
  42. package/dist/cli/src/director-tool-setup.js +104 -0
  43. package/dist/cli/src/driver-review.js +225 -0
  44. package/dist/cli/src/evaluation-authoring.js +315 -0
  45. package/dist/cli/src/evidence-bundles.js +367 -0
  46. package/dist/cli/src/execution-proposals.js +36 -0
  47. package/dist/cli/src/http.js +302 -0
  48. package/dist/cli/src/local-container-boundary.js +38 -0
  49. package/dist/cli/src/local-container-policy.js +201 -0
  50. package/dist/cli/src/local-execution-setup.js +81 -0
  51. package/dist/cli/src/local-source-basis.js +73 -0
  52. package/dist/cli/src/local-source.js +66 -0
  53. package/dist/cli/src/local-value-store.js +91 -0
  54. package/dist/cli/src/local-values.js +163 -0
  55. package/dist/cli/src/login-organizations.js +70 -0
  56. package/dist/cli/src/main.js +1627 -0
  57. package/dist/cli/src/mcp-connection.js +109 -0
  58. package/dist/cli/src/native/bindings.js +137 -0
  59. package/dist/cli/src/native/canonical.js +370 -0
  60. package/dist/cli/src/native/cloud-resources.js +942 -0
  61. package/dist/cli/src/native/companion-channel.js +421 -0
  62. package/dist/cli/src/native/companion-ipc.js +473 -0
  63. package/dist/cli/src/native/contracts.js +218 -0
  64. package/dist/cli/src/native/control-plane.js +1354 -0
  65. package/dist/cli/src/native/credit-approval.js +15 -0
  66. package/dist/cli/src/native/dependency-proxy.js +1006 -0
  67. package/dist/cli/src/native/drill-cleanup.js +115 -0
  68. package/dist/cli/src/native/drill-runner.js +1562 -0
  69. package/dist/cli/src/native/drivers/action-trace.js +210 -0
  70. package/dist/cli/src/native/drivers/function-wrapper.js +152 -0
  71. package/dist/cli/src/native/drivers/http.js +442 -0
  72. package/dist/cli/src/native/drivers/index.js +47 -0
  73. package/dist/cli/src/native/drivers/jsonl-process.js +538 -0
  74. package/dist/cli/src/native/drivers/playwright.js +600 -0
  75. package/dist/cli/src/native/drivers/signed-event.js +244 -0
  76. package/dist/cli/src/native/drivers/types.js +578 -0
  77. package/dist/cli/src/native/evidence-filter.js +255 -0
  78. package/dist/cli/src/native/isolated-access.js +241 -0
  79. package/dist/cli/src/native/library-sharing.js +220 -0
  80. package/dist/cli/src/native/local-run.js +667 -0
  81. package/dist/cli/src/native/local-secrets.js +19 -0
  82. package/dist/cli/src/native/mcp-config.js +123 -0
  83. package/dist/cli/src/native/metadata-requests.js +120 -0
  84. package/dist/cli/src/native/observations.js +1159 -0
  85. package/dist/cli/src/native/owned-groups.js +46 -0
  86. package/dist/cli/src/native/plan.js +594 -0
  87. package/dist/cli/src/native/png.js +159 -0
  88. package/dist/cli/src/native/ports.js +43 -0
  89. package/dist/cli/src/native/readiness.js +139 -0
  90. package/dist/cli/src/native/reassessments.js +206 -0
  91. package/dist/cli/src/native/redaction.js +235 -0
  92. package/dist/cli/src/native/registration.js +155 -0
  93. package/dist/cli/src/native/roots.js +110 -0
  94. package/dist/cli/src/native/run-cleanup.js +199 -0
  95. package/dist/cli/src/native/scratch.js +117 -0
  96. package/dist/cli/src/native/screenshots.js +60 -0
  97. package/dist/cli/src/native/session.js +556 -0
  98. package/dist/cli/src/native/standalone-proxy.js +580 -0
  99. package/dist/cli/src/native/standalone-renewals.js +183 -0
  100. package/dist/cli/src/native/standalone-state.js +193 -0
  101. package/dist/cli/src/native/standalone-tools.js +187 -0
  102. package/dist/cli/src/native/supervisor.js +831 -0
  103. package/dist/cli/src/native/target-auth.js +161 -0
  104. package/dist/cli/src/native/target-state.js +330 -0
  105. package/dist/cli/src/native/tool-reuse.js +364 -0
  106. package/dist/cli/src/native/tool-setups.js +336 -0
  107. package/dist/cli/src/native/world-reuse.js +288 -0
  108. package/dist/cli/src/onboarding.js +23 -0
  109. package/dist/cli/src/priority-requests.js +70 -0
  110. package/dist/cli/src/priority.js +223 -0
  111. package/dist/cli/src/prompts.js +184 -0
  112. package/dist/cli/src/real-operations.js +221 -0
  113. package/dist/cli/src/recipe-intents.js +58 -0
  114. package/dist/cli/src/recorded-context-intents.js +59 -0
  115. package/dist/cli/src/recorded-context.js +248 -0
  116. package/dist/cli/src/recordings.js +69 -0
  117. package/dist/cli/src/registration-guide.js +39 -0
  118. package/dist/cli/src/report-exports.js +213 -0
  119. package/dist/cli/src/request-input.js +47 -0
  120. package/dist/cli/src/resource-lifecycle.js +141 -0
  121. package/dist/cli/src/revision-requests.js +55 -0
  122. package/dist/cli/src/runner-abandon.js +53 -0
  123. package/dist/cli/src/runner-campaign-controls.js +262 -0
  124. package/dist/cli/src/runner-claim-reads.js +36 -0
  125. package/dist/cli/src/runner-completion.js +65 -0
  126. package/dist/cli/src/runner-configuration.js +546 -0
  127. package/dist/cli/src/runner-container.js +794 -0
  128. package/dist/cli/src/runner-evidence-erasure.js +351 -0
  129. package/dist/cli/src/runner-evidence-privacy.js +37 -0
  130. package/dist/cli/src/runner-evidence-retention.js +161 -0
  131. package/dist/cli/src/runner-evidence.js +326 -0
  132. package/dist/cli/src/runner-execute.js +92 -0
  133. package/dist/cli/src/runner-execution-deadline.js +25 -0
  134. package/dist/cli/src/runner-grants.js +307 -0
  135. package/dist/cli/src/runner-identity.js +615 -0
  136. package/dist/cli/src/runner-inputs.js +308 -0
  137. package/dist/cli/src/runner-jobs.js +49 -0
  138. package/dist/cli/src/runner-model-transport.js +392 -0
  139. package/dist/cli/src/runner-ownership.js +332 -0
  140. package/dist/cli/src/runner-process-lock.js +175 -0
  141. package/dist/cli/src/runner-runtime.js +396 -0
  142. package/dist/cli/src/runner-session-channel.js +377 -0
  143. package/dist/cli/src/runner-trial-completion.js +34 -0
  144. package/dist/cli/src/runner-trial-journal.js +358 -0
  145. package/dist/cli/src/runner-trial-live.js +393 -0
  146. package/dist/cli/src/runner-trial-protocol.js +289 -0
  147. package/dist/cli/src/runner-trial-sync.js +110 -0
  148. package/dist/cli/src/runner-trial-transfer.js +107 -0
  149. package/dist/cli/src/runner-voice.js +40 -0
  150. package/dist/cli/src/runner-world-claim.js +21 -0
  151. package/dist/cli/src/runner-world-collector.js +159 -0
  152. package/dist/cli/src/runner-world-command-evidence.js +487 -0
  153. package/dist/cli/src/runner-world-commands.js +268 -0
  154. package/dist/cli/src/runner-world-completion.js +76 -0
  155. package/dist/cli/src/runner-world-erasure.js +95 -0
  156. package/dist/cli/src/runner-world-evidence-sync.js +91 -0
  157. package/dist/cli/src/runner-world-journal.js +510 -0
  158. package/dist/cli/src/runner-world-native-filters.js +134 -0
  159. package/dist/cli/src/runner-world-observations.js +50 -0
  160. package/dist/cli/src/runner-world-session-protocol.js +134 -0
  161. package/dist/cli/src/saved-records.js +40 -0
  162. package/dist/cli/src/scenario-authoring.js +212 -0
  163. package/dist/cli/src/scenario-discovery.js +216 -0
  164. package/dist/cli/src/scenario-paths.js +68 -0
  165. package/dist/cli/src/scenario-requests.js +4 -0
  166. package/dist/cli/src/service-receipts.js +105 -0
  167. package/dist/cli/src/simple/authoring.js +270 -0
  168. package/dist/cli/src/simple/credit-approval.js +16 -0
  169. package/dist/cli/src/simple/help.js +98 -0
  170. package/dist/cli/src/simple/init.js +96 -0
  171. package/dist/cli/src/simple/library-sharing.js +414 -0
  172. package/dist/cli/src/simple/metadata-requests.js +46 -0
  173. package/dist/cli/src/simple/native-report.js +841 -0
  174. package/dist/cli/src/simple/native-tools.js +780 -0
  175. package/dist/cli/src/simple/plan-apply.js +506 -0
  176. package/dist/cli/src/simple/reassessment.js +323 -0
  177. package/dist/cli/src/simple/register.js +123 -0
  178. package/dist/cli/src/simple/run.js +122 -0
  179. package/dist/cli/src/simple/status.js +49 -0
  180. package/dist/cli/src/simple/tool-renewal.js +308 -0
  181. package/dist/cli/src/simple/tool-reuse.js +526 -0
  182. package/dist/cli/src/simple/tool-start-catalog.js +100 -0
  183. package/dist/cli/src/simple/tool-state.js +426 -0
  184. package/dist/cli/src/simple/tools-author.js +222 -0
  185. package/dist/cli/src/simple/watch.js +28 -0
  186. package/dist/cli/src/simple/world-reuse.js +586 -0
  187. package/dist/cli/src/simulation-intents.js +406 -0
  188. package/dist/cli/src/simulation-run.js +1058 -0
  189. package/dist/cli/src/source-batch.js +322 -0
  190. package/dist/cli/src/source-connection.js +451 -0
  191. package/dist/cli/src/source-runtime.js +346 -0
  192. package/dist/cli/src/source-selection-intents.js +75 -0
  193. package/dist/cli/src/source-sets.js +214 -0
  194. package/dist/cli/src/target-models.js +109 -0
  195. package/dist/cli/src/tool-catalog.js +224 -0
  196. package/dist/cli/src/tool-command-contracts.js +1 -0
  197. package/dist/cli/src/tool-command-export.js +245 -0
  198. package/dist/cli/src/tool-connection-contracts.js +1 -0
  199. package/dist/cli/src/tool-connection-reads.js +23 -0
  200. package/dist/cli/src/tool-contributions.js +58 -0
  201. package/dist/cli/src/tool-data.js +116 -0
  202. package/dist/cli/src/tool-datasets.js +176 -0
  203. package/dist/cli/src/tool-group-contracts.js +1 -0
  204. package/dist/cli/src/tool-group-reads.js +26 -0
  205. package/dist/cli/src/tool-group-state.js +147 -0
  206. package/dist/cli/src/tool-groups.js +311 -0
  207. package/dist/cli/src/tool-instances.js +186 -0
  208. package/dist/cli/src/tool-lifecycle-contracts.js +1 -0
  209. package/dist/cli/src/tool-lifecycle-reads.js +30 -0
  210. package/dist/cli/src/tool-lifecycle.js +323 -0
  211. package/dist/cli/src/tool-package-contracts.js +1 -0
  212. package/dist/cli/src/tool-package-reads.js +41 -0
  213. package/dist/cli/src/tool-records.js +53 -0
  214. package/dist/cli/src/tool-runtime.js +96 -0
  215. package/dist/cli/src/tool-state-contracts.js +1 -0
  216. package/dist/cli/src/tool-state-reads.js +31 -0
  217. package/dist/cli/src/tools.js +306 -0
  218. package/dist/cli/src/trial-actions.js +93 -0
  219. package/dist/cli/src/trial-checkpoints.js +133 -0
  220. package/dist/cli/src/trial-checks.js +70 -0
  221. package/dist/cli/src/trial-state.js +197 -0
  222. package/dist/cli/src/vault.js +266 -0
  223. package/dist/cli/src/workspace-registration.js +383 -0
  224. package/dist/cli/src/workspace-team-contracts.js +1 -0
  225. package/dist/cli/src/world-access.js +231 -0
  226. package/dist/cli/src/world-agent.js +4 -0
  227. package/dist/cli/src/world-checkpoint-scopes.js +15 -0
  228. package/dist/cli/src/world-contracts.js +6 -0
  229. package/dist/cli/src/world-creation.js +201 -0
  230. package/dist/cli/src/world-datasets.js +207 -0
  231. package/dist/cli/src/world-inspection.js +257 -0
  232. package/dist/cli/src/world-recipes.js +103 -0
  233. package/dist/cli/src/world-requests.js +241 -0
  234. package/dist/cli/src/world-session-checkpoints.js +196 -0
  235. package/dist/cli/src/world-session-lifecycle.js +207 -0
  236. package/dist/cli/src/world-session-requests.js +215 -0
  237. package/dist/cli/src/world-session-state.js +145 -0
  238. package/dist/cli/src/world-session-voice.js +66 -0
  239. package/dist/cli/src/world-sessions.js +288 -0
  240. package/dist/cli/src/world-stream.js +99 -0
  241. package/dist/cli/src/world-time-report.js +58 -0
  242. package/dist/contracts/agent-change-contracts.js +75 -0
  243. package/dist/contracts/agent-execution-contracts.js +38 -0
  244. package/dist/contracts/application-state-contracts.js +26 -0
  245. package/dist/contracts/assessment-aggregate-contracts.js +15 -0
  246. package/dist/contracts/assessment-contracts.js +74 -0
  247. package/dist/contracts/billing-commerce-contracts.js +107 -0
  248. package/dist/contracts/billing-wallet-contracts.js +43 -0
  249. package/dist/contracts/campaign-lifecycle.js +1 -0
  250. package/dist/contracts/campaign-world-contracts.js +80 -0
  251. package/dist/contracts/catalog-contracts.js +73 -0
  252. package/dist/contracts/ci-access-contracts.js +68 -0
  253. package/dist/contracts/ci-configuration-contracts.js +88 -0
  254. package/dist/contracts/ci-coverage-contracts.js +65 -0
  255. package/dist/contracts/ci-coverage-labels.js +25 -0
  256. package/dist/contracts/ci-delivery-contracts.js +61 -0
  257. package/dist/contracts/ci-result-contracts.js +103 -0
  258. package/dist/contracts/ci-run-contracts.js +51 -0
  259. package/dist/contracts/ci-setup-contracts.js +88 -0
  260. package/dist/contracts/clip-contracts.js +32 -0
  261. package/dist/contracts/comparison-contracts.js +53 -0
  262. package/dist/contracts/composite-contracts.js +34 -0
  263. package/dist/contracts/context-contracts.js +76 -0
  264. package/dist/contracts/continuation-report-contracts.js +1 -0
  265. package/dist/contracts/continuity-requirements.js +8 -0
  266. package/dist/contracts/coordinated-checkpoint-contracts.js +34 -0
  267. package/dist/contracts/dataset-contracts.js +88 -0
  268. package/dist/contracts/dependency-decision-contracts.js +36 -0
  269. package/dist/contracts/dependency-protocol-contracts.js +43 -0
  270. package/dist/contracts/director-execution.js +51 -0
  271. package/dist/contracts/driver-review-contracts.js +99 -0
  272. package/dist/contracts/evidence-contracts.js +65 -0
  273. package/dist/contracts/evidence-coverage-contracts.js +10 -0
  274. package/dist/contracts/export-contracts.js +44 -0
  275. package/dist/contracts/github-directory-contracts.js +96 -0
  276. package/dist/contracts/insight-contracts.js +11 -0
  277. package/dist/contracts/inspection-contracts.js +1 -0
  278. package/dist/contracts/local-claim-contracts.js +39 -0
  279. package/dist/contracts/local-configuration-contracts.js +7 -0
  280. package/dist/contracts/local-evidence-contracts.js +32 -0
  281. package/dist/contracts/local-grant-contracts.js +83 -0
  282. package/dist/contracts/local-input-contracts.js +19 -0
  283. package/dist/contracts/local-runner-contracts.js +42 -0
  284. package/dist/contracts/local-trial-live-contracts.js +16 -0
  285. package/dist/contracts/local-value-source-contracts.js +92 -0
  286. package/dist/contracts/local-world-native-contracts.js +8 -0
  287. package/dist/contracts/mcp-contracts.js +42 -0
  288. package/dist/contracts/media-contracts.js +28 -0
  289. package/dist/contracts/native-check-contracts.js +31 -0
  290. package/dist/contracts/native-identity-contracts.js +52 -0
  291. package/dist/contracts/onboarding-contracts.js +32 -0
  292. package/dist/contracts/performance-contracts.js +85 -0
  293. package/dist/contracts/planning-contracts.js +81 -0
  294. package/dist/contracts/real-operation-contracts.js +30 -0
  295. package/dist/contracts/recommendation-contracts.js +54 -0
  296. package/dist/contracts/report-contracts.js +1 -0
  297. package/dist/contracts/resource-lifecycle-contracts.js +57 -0
  298. package/dist/contracts/revision-contracts.js +12 -0
  299. package/dist/contracts/revision-request-contracts.js +39 -0
  300. package/dist/contracts/saved-record-contracts.js +76 -0
  301. package/dist/contracts/scenario-draft-comparison.js +91 -0
  302. package/dist/contracts/scenario-world-contracts.js +14 -0
  303. package/dist/contracts/service-contracts.js +1 -0
  304. package/dist/contracts/session-command-contracts.js +56 -0
  305. package/dist/contracts/session-contracts.js +65 -0
  306. package/dist/contracts/session-state-contracts.js +67 -0
  307. package/dist/contracts/session-voice-contracts.js +45 -0
  308. package/dist/contracts/source-set-contracts.js +26 -0
  309. package/dist/contracts/source-upload-contracts.js +22 -0
  310. package/dist/contracts/tool-command-contracts.js +57 -0
  311. package/dist/contracts/tool-connection-contracts.js +87 -0
  312. package/dist/contracts/tool-contribution-contracts.js +35 -0
  313. package/dist/contracts/tool-group-contracts.js +53 -0
  314. package/dist/contracts/tool-group-state-contracts.js +63 -0
  315. package/dist/contracts/tool-lifecycle-contracts.js +94 -0
  316. package/dist/contracts/tool-package-contracts.js +91 -0
  317. package/dist/contracts/tool-protocol-contracts.js +71 -0
  318. package/dist/contracts/tool-runtime-billing-contracts.js +28 -0
  319. package/dist/contracts/tool-setup-proposal.js +59 -0
  320. package/dist/contracts/tool-state-contracts.js +79 -0
  321. package/dist/contracts/trial-state-contracts.js +30 -0
  322. package/dist/contracts/typescript/agent-change.js +1 -0
  323. package/dist/contracts/typescript/assessment-aggregate.js +1 -0
  324. package/dist/contracts/typescript/assessment.js +1 -0
  325. package/dist/contracts/typescript/billing-commerce.js +1 -0
  326. package/dist/contracts/typescript/campaigns.js +1 -0
  327. package/dist/contracts/typescript/catalog.js +1 -0
  328. package/dist/contracts/typescript/ci-access.js +1 -0
  329. package/dist/contracts/typescript/ci-configuration.js +1 -0
  330. package/dist/contracts/typescript/ci-delivery.js +1 -0
  331. package/dist/contracts/typescript/ci-result.js +1 -0
  332. package/dist/contracts/typescript/ci-runs.js +1 -0
  333. package/dist/contracts/typescript/clips.js +1 -0
  334. package/dist/contracts/typescript/comparison.js +1 -0
  335. package/dist/contracts/typescript/composite.js +1 -0
  336. package/dist/contracts/typescript/connections.js +1 -0
  337. package/dist/contracts/typescript/context.js +1 -0
  338. package/dist/contracts/typescript/datasets.js +1 -0
  339. package/dist/contracts/typescript/evidence-coverage.js +1 -0
  340. package/dist/contracts/typescript/export.js +1 -0
  341. package/dist/contracts/typescript/github-directory.js +1 -0
  342. package/dist/contracts/typescript/insight.js +1 -0
  343. package/dist/contracts/typescript/inspection.js +1 -0
  344. package/dist/contracts/typescript/intake.js +1 -0
  345. package/dist/contracts/typescript/local-claim.js +1 -0
  346. package/dist/contracts/typescript/local-configuration.js +1 -0
  347. package/dist/contracts/typescript/local-evidence.js +1 -0
  348. package/dist/contracts/typescript/local-grant.js +1 -0
  349. package/dist/contracts/typescript/local-input.js +1 -0
  350. package/dist/contracts/typescript/local-runner.js +1 -0
  351. package/dist/contracts/typescript/local-trial-live.js +1 -0
  352. package/dist/contracts/typescript/local-value-source.js +1 -0
  353. package/dist/contracts/typescript/local-world-native.js +1 -0
  354. package/dist/contracts/typescript/mcp.js +1 -0
  355. package/dist/contracts/typescript/media.js +1 -0
  356. package/dist/contracts/typescript/native-check.js +1 -0
  357. package/dist/contracts/typescript/native-identity.js +1 -0
  358. package/dist/contracts/typescript/onboarding.js +1 -0
  359. package/dist/contracts/typescript/performance.js +1 -0
  360. package/dist/contracts/typescript/planning.js +1 -0
  361. package/dist/contracts/typescript/preparation.js +1 -0
  362. package/dist/contracts/typescript/real-operation.js +1 -0
  363. package/dist/contracts/typescript/recommendation.js +1 -0
  364. package/dist/contracts/typescript/reports.js +1 -0
  365. package/dist/contracts/typescript/resource-lifecycle.js +1 -0
  366. package/dist/contracts/typescript/saved-record.js +1 -0
  367. package/dist/contracts/typescript/scenarios.js +1 -0
  368. package/dist/contracts/typescript/services.js +1 -0
  369. package/dist/contracts/typescript/session-command.js +1 -0
  370. package/dist/contracts/typescript/session-state.js +1 -0
  371. package/dist/contracts/typescript/session-voice.js +1 -0
  372. package/dist/contracts/typescript/session.js +1 -0
  373. package/dist/contracts/typescript/tool-command.js +1 -0
  374. package/dist/contracts/typescript/tool-connection.js +1 -0
  375. package/dist/contracts/typescript/tool-contribution.js +1 -0
  376. package/dist/contracts/typescript/tool-groups.js +1 -0
  377. package/dist/contracts/typescript/tool-lifecycle.js +1 -0
  378. package/dist/contracts/typescript/tool-package.js +1 -0
  379. package/dist/contracts/typescript/tool-state.js +1 -0
  380. package/dist/contracts/typescript/trial-state.js +1 -0
  381. package/dist/contracts/typescript/vault.js +1 -0
  382. package/dist/contracts/typescript/workspace-team.js +1 -0
  383. package/dist/contracts/typescript/world-stream.js +1 -0
  384. package/dist/contracts/workspace-team-contracts.js +55 -0
  385. package/dist/contracts/world-command.js +65 -0
  386. package/dist/contracts/world-lifetime-contracts.js +74 -0
  387. package/dist/contracts/world-recipe-contracts.js +27 -0
  388. package/dist/contracts/world-stream-contracts.js +27 -0
  389. package/dist/package.json +1 -0
  390. package/package.json +16 -16
  391. package/LICENSE.md +0 -23
  392. package/PACKAGING.json +0 -50
@@ -0,0 +1,377 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { CliError } from './http.js';
3
+ import { identifier } from './world-contracts.js';
4
+ /** Native controller pipe only. Not a public API, URL proxy or model tool. */
5
+ export const SESSION_FRAME_SCHEMA = 'firedrill.local-session-frame.v1';
6
+ const MAX_DOCUMENT = 16 * 1024 ** 2, CHUNK = 16384, HASH = /^[a-f0-9]{64}$/;
7
+ const record = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
8
+ const sha = (body) => createHash('sha256').update(body).digest('hex');
9
+ const unavailable = () => new CliError('local_session_observation_unavailable', 'The local world did not return a confirmed observation. No command was retried.');
10
+ const invalid = () => new CliError('local_session_identity_changed', 'The local world response did not match its saved session.');
11
+ function exact(value, fields) {
12
+ if (Object.keys(value).sort().join(',') !== [...fields].sort().join(','))
13
+ throw invalid();
14
+ }
15
+ /**
16
+ * One request at a time, independent of concurrent private model frames.
17
+ * Loss is not replay permission. Command UUID/hash recovery uses result(), not
18
+ * another publication or a replacement world. The enclosing runner retains its
19
+ * current device/session/lease authority and owns container teardown separately.
20
+ */
21
+ export class LocalSessionChannel {
22
+ pending = null;
23
+ stopped = false;
24
+ closing = false;
25
+ released = false;
26
+ closingObserved;
27
+ resolveClosing;
28
+ rejectClosing;
29
+ onAbort = () => this.close();
30
+ operation;
31
+ session;
32
+ emit;
33
+ signal;
34
+ inspectObservation;
35
+ constructor(operation, session, emit, signal, inspectObservation) {
36
+ this.operation = operation;
37
+ this.session = session;
38
+ this.emit = emit;
39
+ this.signal = signal;
40
+ this.inspectObservation = inspectObservation;
41
+ identifier(operation);
42
+ identifier(session);
43
+ this.closingObserved = new Promise((resolve, reject) => { this.resolveClosing = resolve; this.rejectClosing = reject; });
44
+ void this.closingObserved.catch(() => undefined);
45
+ signal.addEventListener('abort', this.onAbort, { once: true });
46
+ if (signal.aborted)
47
+ this.close();
48
+ }
49
+ get isClosing() { return this.closing; }
50
+ get isReleased() { return this.released; }
51
+ /** Resolves only for the actual native closing frame, never elapsed time. */
52
+ waitClosing() { return this.closingObserved; }
53
+ async release() {
54
+ if (!this.closing)
55
+ throw unavailable();
56
+ const result = await this.request({ action: 'release' });
57
+ exact(result, ['released']);
58
+ if (result.released !== true)
59
+ throw invalid();
60
+ this.released = true;
61
+ this.close();
62
+ }
63
+ close() {
64
+ this.stopped = true;
65
+ if (!this.closing)
66
+ this.rejectClosing(unavailable());
67
+ this.signal.removeEventListener('abort', this.onAbort);
68
+ const pending = this.pending;
69
+ this.pending = null;
70
+ if (pending) {
71
+ clearTimeout(pending.timer);
72
+ for (const part of pending.parts)
73
+ part.fill(0);
74
+ pending.parts = [];
75
+ pending.reject(unavailable());
76
+ }
77
+ }
78
+ async request(value) {
79
+ if (this.stopped || this.signal.aborted || this.pending || this.closing
80
+ && ['publish', 'checkpoint_open', 'checkpoint_chunk', 'checkpoint_finish'].includes(String(value.action)))
81
+ throw unavailable();
82
+ const body = Buffer.from(JSON.stringify(value));
83
+ if (!body.length || body.length > MAX_DOCUMENT)
84
+ throw invalid();
85
+ const requestId = randomUUID();
86
+ const promise = new Promise((resolve, reject) => {
87
+ const timer = setTimeout(() => this.close(), 90000);
88
+ this.pending = { id: requestId, size: null, sha256: null, sequence: 0, bytes: 0, parts: [], resolve, reject, timer };
89
+ });
90
+ // An abort can arrive while private input chunks are still being written.
91
+ // Mark the promise handled immediately; the real caller still awaits it.
92
+ void promise.catch(() => undefined);
93
+ const send = (kind, fields = {}) => this.emit({ schema: SESSION_FRAME_SCHEMA,
94
+ id: this.operation, request_id: requestId, kind, ...fields });
95
+ try {
96
+ await send('request_start', { length: body.length, sha256: sha(body) });
97
+ let sequence = 0;
98
+ for (let offset = 0; offset < body.length; offset += CHUNK) {
99
+ if (this.stopped || this.signal.aborted)
100
+ throw unavailable();
101
+ await send('request_chunk', { sequence: sequence++, data: body.subarray(offset, offset + CHUNK).toString('base64') });
102
+ }
103
+ await send('request_end', { sequence });
104
+ }
105
+ catch {
106
+ this.close();
107
+ throw unavailable();
108
+ }
109
+ finally {
110
+ body.fill(0);
111
+ }
112
+ // A confirmed unavailable observation is not a broken transport or a
113
+ // reason to close the world. The owner may read the ORIGINAL command again.
114
+ return await promise;
115
+ }
116
+ async accept(value) {
117
+ try {
118
+ await this.readFrame(value);
119
+ }
120
+ catch {
121
+ this.close();
122
+ throw invalid();
123
+ }
124
+ }
125
+ async readFrame(value) {
126
+ if (this.stopped || this.signal.aborted || !record(value))
127
+ throw invalid();
128
+ const frame = value, pending = this.pending;
129
+ if (frame.schema === SESSION_FRAME_SCHEMA && frame.kind === 'closing') {
130
+ exact(frame, ['schema', 'kind', 'id', 'session_id']);
131
+ if (this.closing || frame.id !== this.operation || frame.session_id !== this.session)
132
+ throw invalid();
133
+ this.closing = true;
134
+ this.resolveClosing();
135
+ return;
136
+ }
137
+ if (frame.schema !== SESSION_FRAME_SCHEMA || frame.id !== this.operation || !pending || frame.request_id !== pending.id)
138
+ throw invalid();
139
+ const base = ['schema', 'kind', 'id', 'request_id'];
140
+ if (frame.kind === 'response_start') {
141
+ exact(frame, [...base, 'length', 'sha256']);
142
+ if (pending.size !== null || !Number.isSafeInteger(frame.length) || Number(frame.length) < 1 || Number(frame.length) > MAX_DOCUMENT
143
+ || typeof frame.sha256 !== 'string' || !HASH.test(frame.sha256))
144
+ throw invalid();
145
+ pending.size = Number(frame.length);
146
+ pending.sha256 = frame.sha256;
147
+ return;
148
+ }
149
+ if (pending.size === null)
150
+ throw invalid();
151
+ if (frame.kind === 'response_chunk') {
152
+ exact(frame, [...base, 'sequence', 'data']);
153
+ if (frame.sequence !== pending.sequence || typeof frame.data !== 'string' || !frame.data.length
154
+ || frame.data.length > 4 * Math.ceil(CHUNK / 3))
155
+ throw invalid();
156
+ const body = Buffer.from(frame.data, 'base64');
157
+ if (!body.length || body.length > CHUNK || body.toString('base64') !== frame.data || pending.bytes + body.length > pending.size)
158
+ throw invalid();
159
+ pending.parts.push(body);
160
+ pending.bytes += body.length;
161
+ pending.sequence++;
162
+ await this.emit({ schema: SESSION_FRAME_SCHEMA, id: this.operation, request_id: pending.id,
163
+ kind: 'response_ack', sequence: frame.sequence });
164
+ return;
165
+ }
166
+ exact(frame, [...base, 'sequence']);
167
+ if (frame.kind !== 'response_end' || frame.sequence !== pending.sequence || pending.bytes !== pending.size)
168
+ throw invalid();
169
+ const bytes = Buffer.concat(pending.parts, pending.bytes);
170
+ let result;
171
+ try {
172
+ if (sha(bytes) !== pending.sha256)
173
+ throw invalid();
174
+ result = JSON.parse(bytes.toString('utf8'));
175
+ }
176
+ finally {
177
+ bytes.fill(0);
178
+ for (const part of pending.parts)
179
+ part.fill(0);
180
+ pending.parts = [];
181
+ }
182
+ if (!record(result) || typeof result.ok !== 'boolean')
183
+ throw invalid();
184
+ if (!result.ok) {
185
+ exact(result, ['ok', 'code']);
186
+ if (result.code !== 'local_session_observation_unavailable')
187
+ throw invalid();
188
+ clearTimeout(pending.timer);
189
+ this.pending = null;
190
+ pending.reject(unavailable());
191
+ return;
192
+ }
193
+ exact(result, ['ok', 'data']);
194
+ if (!record(result.data))
195
+ throw invalid();
196
+ clearTimeout(pending.timer);
197
+ this.pending = null;
198
+ pending.resolve(result.data);
199
+ }
200
+ async observe() {
201
+ const result = await this.request({ action: 'observe' });
202
+ exact(result, ['schema', 'operation_id', 'session_id', 'status', 'launch']);
203
+ if (result.schema !== 'firedrill.world-session-observation.v1' || result.operation_id !== this.operation
204
+ || result.session_id !== this.session || result.status !== null && !record(result.status)
205
+ || result.launch !== null && !record(result.launch))
206
+ throw invalid();
207
+ const observation = result;
208
+ this.inspectObservation?.(observation);
209
+ return observation;
210
+ }
211
+ async finalObservation() {
212
+ if (!this.closing)
213
+ throw unavailable();
214
+ const result = await this.request({ action: 'final_observation' });
215
+ exact(result, ['schema', 'operation_id', 'session_id', 'status_json', 'status_reference', 'launch']);
216
+ if (result.schema !== 'firedrill.local-world-final-observation.v1' || result.operation_id !== this.operation
217
+ || result.session_id !== this.session || result.launch !== null && !record(result.launch))
218
+ throw invalid();
219
+ const reference = result.status_reference;
220
+ let status = null, statusBytes = null;
221
+ try {
222
+ if (reference === null) {
223
+ if (result.status_json !== null)
224
+ throw invalid();
225
+ }
226
+ else {
227
+ if (!record(reference))
228
+ throw invalid();
229
+ exact(reference, ['schema', 'size', 'sha256']);
230
+ if (reference.schema !== 'firedrill.local-world-final-reference.v1' || !Number.isSafeInteger(reference.size)
231
+ || Number(reference.size) < 1 || Number(reference.size) > 8 * 1024 ** 2
232
+ || typeof reference.sha256 !== 'string' || !HASH.test(reference.sha256)
233
+ || typeof result.status_json !== 'string' || !/^[\x00-\x7f]*$/.test(result.status_json))
234
+ throw invalid();
235
+ statusBytes = Buffer.from(result.status_json, 'ascii');
236
+ if (statusBytes.length !== reference.size || sha(statusBytes) !== reference.sha256)
237
+ throw invalid();
238
+ const parsed = JSON.parse(statusBytes.toString('ascii'));
239
+ if (!record(parsed))
240
+ throw invalid();
241
+ status = parsed;
242
+ }
243
+ const observation = { schema: 'firedrill.world-session-observation.v1', session_id: this.session,
244
+ operation_id: this.operation, status, launch: result.launch };
245
+ this.inspectObservation?.(observation);
246
+ return { observation, reference: reference, statusBytes };
247
+ }
248
+ catch {
249
+ statusBytes?.fill(0);
250
+ throw invalid();
251
+ }
252
+ }
253
+ command(result, commandId) {
254
+ if (result.schema !== 'firedrill.world-session-command-observation.v1' || result.operation_id !== this.operation
255
+ || result.session_id !== this.session || result.command_id !== commandId || !Number.isSafeInteger(result.sequence) || Number(result.sequence) < 1
256
+ || typeof result.command_sha256 !== 'string' || !HASH.test(result.command_sha256)
257
+ || !['queued', 'accepted', 'observed', 'not_dispatched', 'unknown', 'stop_requested'].includes(String(result.state)))
258
+ throw invalid();
259
+ return result;
260
+ }
261
+ async publish(commandBytes, body) {
262
+ if (!commandBytes.length || commandBytes.length > 65536 || body.length > 8 * 1024 ** 2)
263
+ throw invalid();
264
+ let document;
265
+ try {
266
+ document = JSON.parse(commandBytes.toString('utf8'));
267
+ }
268
+ catch {
269
+ throw invalid();
270
+ }
271
+ if (!record(document) || typeof document.command_id !== 'string' || identifier(document.command_id) !== document.command_id
272
+ || document.operation_id !== this.operation || document.session_id !== this.session)
273
+ throw invalid();
274
+ const result = this.command(await this.request({ action: 'publish', command: commandBytes.toString('base64'), body: body.toString('base64') }), document.command_id);
275
+ if (result.command_sha256 !== sha(commandBytes) || result.sequence !== document.sequence)
276
+ throw invalid();
277
+ return result;
278
+ }
279
+ /** Fixed native checkpoint input, streamed without a host archive file. It is
280
+ * not command publication; the enclosing original-owner transport commits
281
+ * publication only after the complete hash and native transfer are confirmed. */
282
+ async checkpointInput(commandBytes, read) {
283
+ if (!commandBytes.length || commandBytes.length > 65536)
284
+ throw invalid();
285
+ let document;
286
+ try {
287
+ document = JSON.parse(commandBytes.toString('utf8'));
288
+ }
289
+ catch {
290
+ throw invalid();
291
+ }
292
+ if (!record(document) || document.kind !== 'checkpoint_load' || document.session_id !== this.session
293
+ || document.operation_id !== this.operation || typeof document.command_id !== 'string'
294
+ || identifier(document.command_id) !== document.command_id || !record(document.request)
295
+ || !Number.isSafeInteger(document.request.size) || Number(document.request.size) < 1 || Number(document.request.size) > 512 * 1024 ** 2
296
+ || typeof document.request.sha256 !== 'string' || !HASH.test(document.request.sha256))
297
+ throw invalid();
298
+ const commandId = document.command_id, size = Number(document.request.size), digest = document.request.sha256;
299
+ const opened = await this.request({ action: 'checkpoint_open', command: commandBytes.toString('base64') });
300
+ exact(opened, ['command_id', 'size', 'sha256']);
301
+ if (opened.command_id !== commandId || opened.size !== size || opened.sha256 !== digest)
302
+ throw invalid();
303
+ const hash = createHash('sha256');
304
+ for (let offset = 0; offset < size; offset += 65536) {
305
+ this.signal.throwIfAborted();
306
+ const length = Math.min(65536, size - offset), raw = await read(offset, length);
307
+ try {
308
+ if (!Buffer.isBuffer(raw) || raw.length !== length)
309
+ throw invalid();
310
+ hash.update(raw);
311
+ const part = await this.request({ action: 'checkpoint_chunk', command_id: commandId, offset, data: raw.toString('base64') });
312
+ exact(part, ['command_id', 'offset']);
313
+ if (part.command_id !== commandId || part.offset !== offset + length)
314
+ throw invalid();
315
+ }
316
+ finally {
317
+ raw.fill(0);
318
+ }
319
+ }
320
+ if (hash.digest('hex') !== digest)
321
+ throw invalid();
322
+ const finished = await this.request({ action: 'checkpoint_finish', command_id: commandId });
323
+ exact(finished, ['command_id', 'size', 'sha256', 'ready']);
324
+ if (finished.command_id !== commandId || finished.size !== size || finished.sha256 !== digest || finished.ready !== true)
325
+ throw invalid();
326
+ }
327
+ async result(commandId) {
328
+ return this.command(await this.request({ action: 'result', command_id: identifier(commandId) }), commandId);
329
+ }
330
+ async openFile(commandId, part) {
331
+ commandId = identifier(commandId);
332
+ const result = await this.request({ action: 'file_open', command_id: commandId, part });
333
+ exact(result, ['file_id', 'command_id', 'part', 'size', 'sha256']);
334
+ if (typeof result.file_id !== 'string' || identifier(result.file_id) !== result.file_id || result.command_id !== commandId || result.part !== part
335
+ || !Number.isSafeInteger(result.size) || Number(result.size) < 1 || Number(result.size) > 544 * 1024 ** 2
336
+ || typeof result.sha256 !== 'string' || !HASH.test(result.sha256))
337
+ throw invalid();
338
+ return this.file(result.file_id, Number(result.size), result.sha256);
339
+ }
340
+ /** Original private native matcher packet. Never log, persist or upload to GCS. */
341
+ async openNativeFilters(contextSha256) {
342
+ if (!HASH.test(contextSha256))
343
+ throw invalid();
344
+ const result = await this.request({ action: 'native_filters_open' });
345
+ exact(result, ['file_id', 'part', 'size', 'sha256', 'context_sha256', 'scope']);
346
+ if (typeof result.file_id !== 'string' || identifier(result.file_id) !== result.file_id || result.part !== 'native_filters'
347
+ || result.scope !== 'native_database_credentials' || result.context_sha256 !== contextSha256
348
+ || !Number.isSafeInteger(result.size) || Number(result.size) < 1 || Number(result.size) > 64 * 1024 ** 2
349
+ || typeof result.sha256 !== 'string' || !HASH.test(result.sha256))
350
+ throw invalid();
351
+ return this.file(result.file_id, Number(result.size), result.sha256);
352
+ }
353
+ file(fileId, size, sha256) {
354
+ let closed = false;
355
+ return { id: fileId, size, sha256, read: async (offset, length) => {
356
+ if (closed || !Number.isSafeInteger(offset) || !Number.isSafeInteger(length) || offset < 0 || length < 1 || length > CHUNK || offset + length > size)
357
+ throw invalid();
358
+ const response = await this.request({ action: 'file_chunk', file_id: fileId, offset, length });
359
+ exact(response, ['file_id', 'offset', 'length', 'sha256', 'data']);
360
+ if (response.file_id !== fileId || response.offset !== offset || response.length !== length || typeof response.data !== 'string'
361
+ || response.data.length > 4 * Math.ceil(CHUNK / 3))
362
+ throw invalid();
363
+ const bytes = Buffer.from(response.data, 'base64');
364
+ if (bytes.length !== length || bytes.toString('base64') !== response.data || sha(bytes) !== response.sha256)
365
+ throw invalid();
366
+ return bytes;
367
+ }, close: async () => {
368
+ if (closed)
369
+ return;
370
+ closed = true;
371
+ const response = await this.request({ action: 'file_close', file_id: fileId });
372
+ exact(response, ['file_id', 'closed']);
373
+ if (response.file_id !== fileId || response.closed !== true)
374
+ throw invalid();
375
+ } };
376
+ }
377
+ }
@@ -0,0 +1,34 @@
1
+ import { CliError } from './http.js';
2
+ import { localContainerCompletion } from './runner-container.js';
3
+ import { syncClosingReceipt } from './runner-completion.js';
4
+ import { localTrialCollection } from './runner-trial-journal.js';
5
+ /** Close exact execution authority before bulk evidence synchronization. No new
6
+ * claim, model, target, Docker lookup or inferred resource deletion belongs here.
7
+ */
8
+ export async function syncLocalTrialCompletion(scope, operation, signal, options = {}) {
9
+ const saved = await localContainerCompletion(scope, operation, 'trial');
10
+ let evidence = null;
11
+ if (saved.document.resource_state === 'removed') {
12
+ try {
13
+ const collection = await localTrialCollection(scope, operation), journal = collection.journal;
14
+ if (journal.owner.job !== saved.job || journal.owner.attempt !== saved.attempt || journal.owner.device !== saved.device
15
+ || journal.owner.request !== saved.request || journal.manifest_sha256 !== saved.manifestSha256
16
+ || JSON.stringify(journal.observation.launch) !== JSON.stringify(saved.document.launch)
17
+ || JSON.stringify(journal.observation.status) !== JSON.stringify(saved.document.status))
18
+ throw new CliError('local_trial_closing_identity_changed', 'Drill closing evidence does not match its exact saved container. No result was claimed.');
19
+ // Close authority promptly using the exact private checkpoint. The cloud
20
+ // verifies every declared page/hash before publication; rereading all
21
+ // evidence here must not extend execution permission or miss its window.
22
+ signal.throwIfAborted();
23
+ evidence = { schema: 'firedrill.local-trial-aggregate.v1', execution_id: journal.execution_id,
24
+ pages: journal.pages, event_offset: journal.event_offset, artifact_offset: journal.artifact_offset,
25
+ artifacts_retained: journal.artifacts_retained, page_chain_sha256: journal.page_chain_sha256,
26
+ collection_complete: journal.stage === 'local_collected' };
27
+ }
28
+ catch (error) {
29
+ if (error?.code !== 'ENOENT')
30
+ throw error;
31
+ }
32
+ }
33
+ return syncClosingReceipt(scope, { ...saved, document: { ...saved.document, evidence } }, signal, options);
34
+ }