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,393 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { constants } from 'node:fs';
3
+ import { lstat, mkdir, open, rename, unlink } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { api } from './auth.js';
6
+ import { privateDirectory } from './credentials.js';
7
+ import { CliError } from './http.js';
8
+ import { runnerRequestSigner } from './runner-identity.js';
9
+ import { identifier } from './world-contracts.js';
10
+ import { localConfigurationIdentityMatches } from '../../contracts/local-configuration-contracts.js';
11
+ import { localTrialLiveReceiptMatches } from '../../contracts/local-trial-live-contracts.js';
12
+ import { assertEvidencePrivacy, evidenceNeedles } from './runner-evidence-privacy.js';
13
+ import { inspectTrialArtifact, inspectTrialEvent } from './runner-trial-protocol.js';
14
+ import { synchronizeTrialEvidence, trialTransferKey } from './runner-trial-transfer.js';
15
+ import { assertEvidenceRetentionCurrent, evidenceRetentionSignal } from './runner-evidence-retention.js';
16
+ const messages = { 'trial.preparing': 'Preparing the drill world',
17
+ 'trial.world_unavailable': 'The drill world became unavailable', 'runner.started': 'Agent invocation observed',
18
+ 'dependency.request': 'Service request recorded', 'dependency.response': 'Service response recorded',
19
+ 'task.progress': 'Background task activity recorded',
20
+ 'driver.ready': 'Input adapter ready', 'driver.ingress_observed': 'Input delivery observed',
21
+ 'driver.action_started': 'Input action started', 'driver.action_finished': 'Input action finished',
22
+ 'conversation.progress': 'Conversation activity recorded', 'voice.progress': 'Voice activity recorded',
23
+ 'browser.capture_progress': 'Browser capture recorded', 'desktop.capture_progress': 'Desktop capture recorded',
24
+ 'world.continuity.started': 'World window started', 'world.agent.observed': 'Original process observation recorded',
25
+ 'world.interaction.observed': 'Agent input activity recorded',
26
+ 'world.event.intent': 'World event pending', 'world.event.observed': 'World event result recorded',
27
+ 'world.control.observed': 'World control result recorded', 'world.continuity.finished': 'World window finished',
28
+ 'world.time.started': 'World schedule started', 'world.time.advanced': 'World schedule advanced',
29
+ 'world.time.finished': 'World schedule stopped', 'trial.elapsed': 'Drill timing recorded' };
30
+ const hash = (body) => createHash('sha256').update(body).digest('hex');
31
+ const invalid = () => new CliError('local_trial_live_invalid', 'Live activity could not be retained safely. The exact execution was not restarted.');
32
+ async function syncDirectory(directory) {
33
+ const file = await open(directory, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0));
34
+ try {
35
+ await file.sync();
36
+ }
37
+ finally {
38
+ await file.close();
39
+ }
40
+ }
41
+ /** Private disk queue plus one caller-owned upload pump. Neither a new runner
42
+ * daemon nor execution authority. An uncertain POST gets one exact GET, never a
43
+ * write replay. Final collection/closing still validates the entire journal. */
44
+ export async function createLiveTrialRetainer(owner, manifest, configuration, retention, signal, output) {
45
+ signal = evidenceRetentionSignal(retention, signal);
46
+ const control = configuration.control;
47
+ if (owner.purpose !== 'trial' || control.schema !== 'firedrill.trial.v1' || !localConfigurationIdentityMatches(configuration, owner)
48
+ || !/^[a-f0-9]{64}$/.test(manifest) || configuration.manifest_sha256 !== manifest
49
+ || control.job_id !== owner.job || control.operation_id !== owner.lease)
50
+ throw invalid();
51
+ const directory = join(await privateDirectory(), `trial-live-${identifier(owner.owner)}-${identifier(owner.workspace)}-${identifier(owner.lease)}`);
52
+ await mkdir(directory, { mode: 0o700 }).catch(error => { if (error.code !== 'EEXIST')
53
+ throw error; });
54
+ const row = await lstat(directory);
55
+ if (!row.isDirectory() || row.isSymbolicLink() || row.mode & 0o077 || process.getuid && row.uid !== process.getuid())
56
+ throw invalid();
57
+ const blocked = evidenceNeedles(configuration);
58
+ const journal = { schema: 'firedrill.local-trial-live-journal.v2', job_id: owner.job,
59
+ attempt_id: owner.attempt, lease_id: owner.lease, execution_id: control.execution_id, manifest_sha256: manifest, retention,
60
+ artifact_count: 0, cloud_artifact_count: 0, last_cloud_artifact: null, artifact_bytes: 0,
61
+ queued: 0, cursor: 0, pending_transfer: null,
62
+ events: 0, cloud_events: 0, pending: null, state: owner.evidenceUpload ? 'listening' : 'local_only', problem: null,
63
+ provenance: 'customer_device', cloud_completion_recorded: false };
64
+ let writing = Promise.resolve(), enqueueing = Promise.resolve(), pump, finished = false, paused = !owner.evidenceUpload;
65
+ const persist = (initial = false) => {
66
+ assertEvidenceRetentionCurrent(retention);
67
+ const body = Buffer.from(JSON.stringify(journal));
68
+ assertEvidencePrivacy(body, blocked);
69
+ const next = writing.then(async () => {
70
+ assertEvidenceRetentionCurrent(retention);
71
+ const target = join(directory, 'receipt.json'), temporary = initial ? target : target + '.' + randomUUID() + '.tmp';
72
+ const file = await open(temporary, 'wx', 0o600);
73
+ try {
74
+ await file.writeFile(body);
75
+ await file.sync();
76
+ }
77
+ finally {
78
+ await file.close();
79
+ }
80
+ if (!initial)
81
+ await rename(temporary, target);
82
+ await syncDirectory(directory);
83
+ });
84
+ writing = next;
85
+ return next;
86
+ };
87
+ const privateFile = async (name, maximum) => {
88
+ assertEvidenceRetentionCurrent(retention);
89
+ const path = join(directory, name), before = await lstat(path);
90
+ if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.mode & 0o077 || before.size > maximum
91
+ || process.getuid && before.uid !== process.getuid())
92
+ throw invalid();
93
+ const file = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
94
+ const actual = await file.stat();
95
+ if (actual.ino !== before.ino || actual.dev !== before.dev || actual.size !== before.size) {
96
+ await file.close();
97
+ throw invalid();
98
+ }
99
+ return file;
100
+ };
101
+ const read = async (sequence) => {
102
+ const file = await privateFile(`event-${sequence}.json`, 2 * 1024 ** 2);
103
+ try {
104
+ const actual = await file.stat();
105
+ const bytes = await file.readFile(), after = await file.stat();
106
+ if (after.size !== actual.size || after.mtimeMs !== actual.mtimeMs || after.ctimeMs !== actual.ctimeMs)
107
+ throw invalid();
108
+ return bytes;
109
+ }
110
+ finally {
111
+ await file.close();
112
+ }
113
+ };
114
+ const readMetadata = async (name, maximum) => {
115
+ const file = await privateFile(name, maximum);
116
+ try {
117
+ const before = await file.stat(), bytes = await file.readFile(), after = await file.stat();
118
+ if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs)
119
+ throw invalid();
120
+ return JSON.parse(bytes.toString('utf8'));
121
+ }
122
+ finally {
123
+ await file.close();
124
+ }
125
+ };
126
+ const enqueue = (item) => {
127
+ const next = enqueueing.then(async () => {
128
+ if (!Number.isSafeInteger(journal.queued + 1))
129
+ throw invalid();
130
+ const file = await open(join(directory, `queue-${journal.queued}.json`), 'wx', 0o600);
131
+ try {
132
+ await file.writeFile(JSON.stringify(item));
133
+ await file.sync();
134
+ }
135
+ finally {
136
+ await file.close();
137
+ }
138
+ await syncDirectory(directory);
139
+ journal.queued++;
140
+ await persist();
141
+ });
142
+ enqueueing = next;
143
+ return next;
144
+ };
145
+ const queued = async (position) => {
146
+ const value = await readMetadata(`queue-${position}.json`, 256);
147
+ if (!value || typeof value !== 'object' || Array.isArray(value))
148
+ throw invalid();
149
+ const item = value;
150
+ if (item.kind === 'event' && Object.keys(item).sort().join(',') === 'kind,sequence'
151
+ && Number.isSafeInteger(item.sequence) && item.sequence === journal.cloud_events && Number(item.sequence) < journal.events) {
152
+ return { kind: 'event', sequence: Number(item.sequence) };
153
+ }
154
+ if (item.kind === 'artifact' && Object.keys(item).sort().join(',') === 'kind,position'
155
+ && Number.isSafeInteger(item.position) && item.position === journal.cloud_artifact_count && Number(item.position) < journal.artifact_count) {
156
+ return { kind: 'artifact', position: Number(item.position) };
157
+ }
158
+ throw invalid();
159
+ };
160
+ const match = (value, sequence, body) => {
161
+ if (!localTrialLiveReceiptMatches(value, owner, { manifestSha256: manifest, executionId: control.execution_id,
162
+ eventId: createHash('sha256').update(`trial:${owner.attempt}:${sequence}`).digest('hex'),
163
+ sequence, bodySha256: hash(body), bodySize: body.length }))
164
+ throw invalid();
165
+ };
166
+ const upload = async (sequence, bytes) => {
167
+ assertEvidenceRetentionCurrent(retention);
168
+ const active = AbortSignal.any([signal, AbortSignal.timeout(10000)]);
169
+ const auth = { actor: owner.owner, workspace: owner.workspace, signal: active };
170
+ const path = `/api/workspaces/${identifier(owner.workspace)}/local-runners/${identifier(owner.device)}/jobs/${identifier(owner.job)}/claims/${identifier(owner.request)}/trial-events/${sequence}`;
171
+ let receipt = await api(path, auth);
172
+ match(receipt, sequence, bytes);
173
+ if (receipt.state === 'retained')
174
+ return;
175
+ const signer = await runnerRequestSigner(owner, owner.device, active);
176
+ journal.pending = { sequence, sha256: hash(bytes), size: bytes.length };
177
+ journal.state = 'cloud_pending';
178
+ await persist(); // Exact bytes and write intent are durable before dispatch.
179
+ const payload = { schema: 'firedrill.local-trial-live-write.v1', job_id: owner.job,
180
+ attempt_id: owner.attempt, lease_id: owner.lease, request_key: owner.request, device_key: owner.device,
181
+ native_session_id: owner.nativeSession, manifest_sha256: manifest, sequence,
182
+ sent_at_ms: Date.parse(receipt.server_time), event_json: bytes.toString('ascii') };
183
+ const proof = await signer(payload);
184
+ assertEvidenceRetentionCurrent(retention);
185
+ try {
186
+ receipt = await api(path, { ...auth, method: 'POST', body: proof });
187
+ }
188
+ catch (error) {
189
+ if (!(error instanceof CliError) || !['connection_uncertain', 'response_unavailable'].includes(error.code))
190
+ throw error;
191
+ receipt = await api(path, { ...auth, signal: AbortSignal.any([signal, AbortSignal.timeout(5000)]) });
192
+ }
193
+ match(receipt, sequence, bytes);
194
+ if (receipt.state !== 'retained')
195
+ throw invalid();
196
+ };
197
+ const startPump = () => {
198
+ if (finished || paused || pump)
199
+ return;
200
+ pump = (async () => {
201
+ try {
202
+ while (!finished && journal.cursor < journal.queued) {
203
+ signal.throwIfAborted();
204
+ const item = await queued(journal.cursor);
205
+ if (item.kind === 'artifact') {
206
+ const description = await readMetadata(`${item.position}.bin.json`, 8192);
207
+ inspectTrialArtifact(description, control.execution_id, control.scenario_key);
208
+ if (description.id !== item.position + '.bin' || description.kind === 'result')
209
+ throw invalid();
210
+ const metadata = description, file = await privateFile(metadata.id, 512 * 1024 ** 2);
211
+ try {
212
+ const before = await file.stat();
213
+ if (before.size !== metadata.size)
214
+ throw invalid();
215
+ const key = trialTransferKey(owner.lease, 'live-artifact:' + metadata.id);
216
+ const retained = await synchronizeTrialEvidence(owner, manifest, key, { kind: 'trial_live_artifact', receipt: { size: metadata.size, sha256: metadata.sha256 }, metadata }, async (offset, length) => {
217
+ assertEvidenceRetentionCurrent(retention);
218
+ const bytes = Buffer.alloc(length);
219
+ let position = 0;
220
+ while (position < length) {
221
+ const next = await file.read(bytes, position, length - position, offset + position);
222
+ if (!next.bytesRead)
223
+ throw invalid();
224
+ position += next.bytesRead;
225
+ }
226
+ const after = await file.stat();
227
+ if (after.size !== before.size || after.mtimeMs !== before.mtimeMs || after.ctimeMs !== before.ctimeMs)
228
+ throw invalid();
229
+ assertEvidencePrivacy(bytes, blocked);
230
+ return bytes;
231
+ }, AbortSignal.any([signal, AbortSignal.timeout(60000)]), async (value) => { journal.pending_transfer = value; journal.state = 'cloud_pending'; await persist(); });
232
+ journal.last_cloud_artifact = { id: metadata.id, receipt: retained };
233
+ journal.cloud_artifact_count++;
234
+ journal.cursor++;
235
+ journal.state = 'listening';
236
+ await persist();
237
+ output?.('local_trial_file', { job_id: owner.job, execution_id: control.execution_id, kind: metadata.kind,
238
+ artifact_id: retained.id, cloud_retained: true, provenance: 'customer_device', cloud_completion_recorded: false }, `${owner.job.slice(0, 8)}: Evidence file saved.`);
239
+ }
240
+ finally {
241
+ await file.close();
242
+ }
243
+ continue;
244
+ }
245
+ const sequence = item.sequence, bytes = await read(sequence);
246
+ if (bytes.length > 256 * 1024) {
247
+ journal.problem = 'live_envelope_capacity';
248
+ throw invalid();
249
+ }
250
+ await upload(sequence, bytes);
251
+ journal.cloud_events++;
252
+ journal.cursor++;
253
+ journal.pending = null;
254
+ journal.state = 'listening';
255
+ await persist();
256
+ const event = inspectTrialEvent(JSON.parse(bytes.toString('ascii')), control.execution_id, sequence);
257
+ if (event.kind === 'trial.execution_receipt')
258
+ throw invalid();
259
+ output?.('local_trial_activity', { job_id: owner.job, execution_id: control.execution_id,
260
+ sequence, kind: event.kind, observed_at: event.at, cloud_retained: true, provenance: 'customer_device' }, `${owner.job.slice(0, 8)}: ${messages[event.kind] ?? 'Drill activity recorded'}.`);
261
+ }
262
+ }
263
+ catch {
264
+ // Do not restart/retry target or live writes on a transport problem.
265
+ // Complete evidence can still use the existing post-exit sync path.
266
+ paused = true;
267
+ journal.state = 'cloud_paused';
268
+ journal.problem ??= 'live_transfer_unconfirmed';
269
+ await persist();
270
+ output?.('local_trial_live_paused', { job_id: owner.job, execution_id: control.execution_id,
271
+ events_locally_retained: journal.events, events_cloud_retained: journal.cloud_events,
272
+ problem: journal.problem, cloud_completion_recorded: false }, `${owner.job.slice(0, 8)}: Live cloud updates paused. Local evidence collection continues.`);
273
+ }
274
+ })().finally(() => {
275
+ pump = undefined;
276
+ if (!finished && !paused && journal.cursor < journal.queued)
277
+ startPump();
278
+ });
279
+ void pump.catch(() => undefined); // Disk errors are awaited again at finish.
280
+ };
281
+ try {
282
+ await persist(true);
283
+ }
284
+ catch (error) {
285
+ for (const value of blocked)
286
+ value.fill(0);
287
+ throw error;
288
+ }
289
+ return { accept: async (body, event) => {
290
+ signal.throwIfAborted();
291
+ assertEvidenceRetentionCurrent(retention);
292
+ if (finished || event.sequence !== journal.events || event.execution_id !== control.execution_id
293
+ || !body.length || body.length > 2 * 1024 ** 2 || body.some(value => value > 127))
294
+ throw invalid();
295
+ const original = inspectTrialEvent(JSON.parse(body.toString('ascii')), control.execution_id, journal.events);
296
+ if (original.kind !== event.kind || original.at !== event.at || original.kind === 'trial.execution_receipt')
297
+ throw invalid();
298
+ assertEvidencePrivacy(body, blocked);
299
+ const file = await open(join(directory, `event-${event.sequence}.json`), 'wx', 0o600);
300
+ try {
301
+ await file.writeFile(body);
302
+ await file.sync();
303
+ }
304
+ finally {
305
+ await file.close();
306
+ }
307
+ await syncDirectory(directory);
308
+ journal.events++;
309
+ await enqueue({ kind: 'event', sequence: event.sequence });
310
+ startPump();
311
+ }, artifact: async (metadata) => {
312
+ signal.throwIfAborted();
313
+ assertEvidenceRetentionCurrent(retention);
314
+ inspectTrialArtifact(metadata, control.execution_id, control.scenario_key);
315
+ if (finished || metadata.kind === 'result' || metadata.execution_id !== control.execution_id
316
+ || metadata.scenario_key !== control.scenario_key || metadata.id !== journal.artifact_count + '.bin'
317
+ || journal.artifact_bytes + metadata.size > 512 * 1024 ** 2)
318
+ throw invalid();
319
+ metadata = { ...metadata };
320
+ const partial = join(directory, metadata.id + '.partial'), file = await open(partial, 'wx', 0o600);
321
+ const overlap = blocked.reduce((maximum, value) => Math.max(maximum, value.length), 512), digest = createHash('sha256');
322
+ let tail = Buffer.alloc(0), position = 0, closed = false, committed = false;
323
+ const close = async () => { if (!closed) {
324
+ closed = true;
325
+ await file.close();
326
+ } tail.fill(0); };
327
+ return { write: async (bytes) => {
328
+ signal.throwIfAborted();
329
+ assertEvidenceRetentionCurrent(retention);
330
+ if (closed || !bytes.length || bytes.length > 16384 || position + bytes.length > metadata.size)
331
+ throw invalid();
332
+ const scan = Buffer.concat([tail, bytes]);
333
+ assertEvidencePrivacy(scan, blocked);
334
+ tail.fill(0);
335
+ tail = Buffer.from(scan.subarray(Math.max(0, scan.length - overlap + 1)));
336
+ digest.update(bytes);
337
+ let written = 0;
338
+ while (written < bytes.length) {
339
+ const next = await file.write(bytes, written, bytes.length - written);
340
+ if (!next.bytesWritten)
341
+ throw invalid();
342
+ written += next.bytesWritten;
343
+ }
344
+ position += bytes.length;
345
+ }, commit: async () => {
346
+ assertEvidenceRetentionCurrent(retention);
347
+ if (closed || position !== metadata.size || digest.digest('hex') !== metadata.sha256)
348
+ throw invalid();
349
+ await file.sync();
350
+ await close();
351
+ await rename(partial, join(directory, metadata.id));
352
+ await syncDirectory(directory);
353
+ const description = Buffer.from(JSON.stringify(metadata));
354
+ assertEvidencePrivacy(description, blocked);
355
+ const record = await open(join(directory, metadata.id + '.json'), 'wx', 0o600);
356
+ try {
357
+ await record.writeFile(description);
358
+ await record.sync();
359
+ }
360
+ finally {
361
+ await record.close();
362
+ }
363
+ await syncDirectory(directory);
364
+ const artifactPosition = journal.artifact_count;
365
+ journal.artifact_count++;
366
+ journal.artifact_bytes += metadata.size;
367
+ await enqueue({ kind: 'artifact', position: artifactPosition });
368
+ committed = true;
369
+ startPump();
370
+ }, abort: async () => { await close(); if (!committed)
371
+ await unlink(partial).catch(() => undefined); } };
372
+ }, finish: async () => {
373
+ finished = true;
374
+ try {
375
+ // Do not drain a backlog here: closing must not wait for bulk uploads.
376
+ // Await only the bounded in-flight exchange; the original final journal
377
+ // sync retains every remaining event after cleanup/closing as before.
378
+ await enqueueing;
379
+ if (pump)
380
+ await pump;
381
+ journal.state = paused ? owner.evidenceUpload ? 'cloud_paused' : 'local_only' : 'closed';
382
+ await persist();
383
+ return { events_locally_retained: journal.events, events_cloud_retained: journal.cloud_events,
384
+ files_locally_retained: journal.artifact_count, files_cloud_retained: journal.cloud_artifact_count,
385
+ state: journal.state, problem: journal.problem, provenance: 'customer_device', cloud_completion_recorded: false };
386
+ }
387
+ finally {
388
+ for (const value of blocked)
389
+ value.fill(0);
390
+ blocked.length = 0;
391
+ }
392
+ } };
393
+ }