@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

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 (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Resolve the agentsam-machine native binary.
3
+ * Preference order:
4
+ * 1. AgentSam-managed user runtime under ~/.agentsam/runtimes/machine
5
+ * 2. AGENTSAM_MACHINE_BIN explicit override
6
+ * 3. agentsam-machine on PATH
7
+ * 4. Built binary under native/agentsam-machine/target/{release,debug}
8
+ * 5. cargo run --manifest-path (SDK contributor fallback)
9
+ */
10
+
11
+ import fs from 'node:fs';
12
+ import path from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { spawnSync } from 'node:child_process';
15
+ import { findExecutable, managedMachineResolution } from './machine-runtime.js';
16
+
17
+ const here = path.dirname(fileURLToPath(import.meta.url));
18
+ const sdkRoot = path.resolve(here, '../..');
19
+ const machineCrate = path.join(sdkRoot, 'native/agentsam-machine');
20
+ const machineManifest = path.join(machineCrate, 'Cargo.toml');
21
+
22
+ /**
23
+ * @typedef {{ kind: 'binary', path: string, source: string, version?: string } | { kind: 'cargo', manifest: string, source: string } | { kind: 'missing', tried: string[] }} MachineBinaryResolution
24
+ */
25
+
26
+ /**
27
+ * @returns {MachineBinaryResolution}
28
+ */
29
+ export function resolveMachineBinary(env = process.env) {
30
+ const tried = [];
31
+
32
+ const managed = managedMachineResolution(env);
33
+ tried.push(...managed.tried);
34
+ if (managed.available) {
35
+ return {
36
+ kind: 'binary',
37
+ path: managed.path,
38
+ source: 'managed-runtime',
39
+ version: managed.state.current_version,
40
+ };
41
+ }
42
+
43
+ const explicit = String(env.AGENTSAM_MACHINE_BIN || '').trim();
44
+ if (explicit) {
45
+ tried.push(explicit);
46
+ if (fs.existsSync(explicit) && fs.statSync(explicit).isFile()) {
47
+ return { kind: 'binary', path: explicit, source: 'AGENTSAM_MACHINE_BIN' };
48
+ }
49
+ }
50
+
51
+ const pathHit = findExecutable('agentsam-machine', env);
52
+ if (pathHit) return { kind: 'binary', path: pathHit, source: 'PATH' };
53
+ tried.push('PATH:agentsam-machine');
54
+
55
+ for (const rel of ['target/release/agentsam-machine', 'target/debug/agentsam-machine']) {
56
+ const candidate = path.join(machineCrate, rel);
57
+ tried.push(candidate);
58
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
59
+ return {
60
+ kind: 'binary',
61
+ path: candidate,
62
+ source: rel.includes('release') ? 'crate-release' : 'crate-debug',
63
+ };
64
+ }
65
+ }
66
+
67
+ if (fs.existsSync(machineManifest)) {
68
+ const cargo = findExecutable('cargo', env);
69
+ if (cargo) return { kind: 'cargo', manifest: machineManifest, source: 'cargo-run' };
70
+ tried.push('cargo');
71
+ }
72
+
73
+ return { kind: 'missing', tried };
74
+ }
75
+
76
+ /**
77
+ * @param {MachineBinaryResolution} resolution
78
+ * @param {string[]} machineArgv
79
+ * @param {{ stdio?: import('node:child_process').StdioOptions, env?: NodeJS.ProcessEnv }} [options]
80
+ */
81
+ export function spawnMachine(resolution, machineArgv, options = {}) {
82
+ const env = options.env || process.env;
83
+ const stdio = options.stdio || 'inherit';
84
+ const maxBuffer = options.maxBuffer || 32 * 1024 * 1024;
85
+
86
+ if (resolution.kind === 'binary') {
87
+ return spawnSync(resolution.path, machineArgv, { stdio, env, encoding: 'utf8', maxBuffer });
88
+ }
89
+
90
+ if (resolution.kind === 'cargo') {
91
+ return spawnSync(
92
+ 'cargo',
93
+ ['run', '--quiet', '--manifest-path', resolution.manifest, '--bin', 'agentsam-machine', '--', ...machineArgv],
94
+ { stdio, env, encoding: 'utf8', maxBuffer },
95
+ );
96
+ }
97
+
98
+ const err = new Error(
99
+ 'agentsam-machine is not installed. Run: agentsam machine install. ' +
100
+ 'Standalone Cargo users can run: cargo install agentsam-machine-cli. ' +
101
+ 'Tried: ' + ((resolution.tried || []).join(', ') || '(none)'),
102
+ );
103
+ err.code = 'AGENTSAM_MACHINE_BINARY_MISSING';
104
+ throw err;
105
+ }
106
+
107
+ export function machineSdkRoot() {
108
+ return sdkRoot;
109
+ }
@@ -0,0 +1,266 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+
6
+ export const MACHINE_RUNTIME_SCHEMA = 'agentsam.machine.runtime.v1';
7
+ export const MACHINE_PACKAGE = 'agentsam-machine-cli';
8
+
9
+ function expandHome(value, home) {
10
+ if (!value) return value;
11
+ if (value === '~') return home;
12
+ if (value.startsWith('~/')) return path.join(home, value.slice(2));
13
+ return value;
14
+ }
15
+
16
+ export function agentsamHome(env = process.env) {
17
+ const home = os.homedir();
18
+ const configured = String(env.AGENTSAM_HOME || '').trim();
19
+ return configured ? path.resolve(expandHome(configured, home)) : path.join(home, '.agentsam');
20
+ }
21
+
22
+ export function machineRuntimeRoot(env = process.env) {
23
+ return path.join(agentsamHome(env), 'runtimes', 'machine');
24
+ }
25
+
26
+ export function machineRuntimeStatePath(env = process.env) {
27
+ return path.join(machineRuntimeRoot(env), 'current.json');
28
+ }
29
+
30
+ export function machineBinaryName() {
31
+ return process.platform === 'win32' ? 'agentsam-machine.exe' : 'agentsam-machine';
32
+ }
33
+
34
+ export function machineManagedAliasPath(env = process.env) {
35
+ return path.join(agentsamHome(env), 'bin', machineBinaryName());
36
+ }
37
+
38
+ export function readMachineRuntimeState(env = process.env) {
39
+ const file = machineRuntimeStatePath(env);
40
+ if (!fs.existsSync(file)) return null;
41
+ try {
42
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
43
+ if (parsed?.schema !== MACHINE_RUNTIME_SCHEMA) return null;
44
+ if (typeof parsed?.current_version !== 'string' || !parsed.current_version.trim()) return null;
45
+ return parsed;
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ export function managedMachineResolution(env = process.env) {
52
+ const statePath = machineRuntimeStatePath(env);
53
+ const state = readMachineRuntimeState(env);
54
+ const tried = [statePath];
55
+ if (!state) return { available: false, state: null, path: null, tried };
56
+
57
+ const binary = path.join(
58
+ machineRuntimeRoot(env),
59
+ 'versions',
60
+ state.current_version,
61
+ 'bin',
62
+ machineBinaryName(),
63
+ );
64
+ tried.push(binary);
65
+
66
+ if (!fs.existsSync(binary) || !fs.statSync(binary).isFile()) {
67
+ return { available: false, state, path: binary, tried };
68
+ }
69
+ return { available: true, state, path: binary, tried };
70
+ }
71
+
72
+ export function findExecutable(command, env = process.env) {
73
+ const probe = process.platform === 'win32' ? ['where', [command]] : ['which', [command]];
74
+ const result = spawnSync(probe[0], probe[1], {
75
+ encoding: 'utf8',
76
+ stdio: ['ignore', 'pipe', 'ignore'],
77
+ env,
78
+ });
79
+ if (result.status !== 0) return null;
80
+ return String(result.stdout || '')
81
+ .split(/\r?\n/)
82
+ .map((line) => line.trim())
83
+ .find(Boolean) || null;
84
+ }
85
+
86
+ export function machineBinaryVersion(binary, env = process.env) {
87
+ const result = spawnSync(binary, ['--version'], {
88
+ encoding: 'utf8',
89
+ stdio: ['ignore', 'pipe', 'pipe'],
90
+ env,
91
+ });
92
+ if (result.status !== 0) return null;
93
+ const output = String(result.stdout || result.stderr || '').trim();
94
+ const match = output.match(/(?:^|\s)(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)(?:\s|$)/);
95
+ return match?.[1] || null;
96
+ }
97
+
98
+ export function machineRuntimeStatus(env = process.env) {
99
+ const managed = managedMachineResolution(env);
100
+ const cargo = findExecutable('cargo', env);
101
+ return {
102
+ schema: MACHINE_RUNTIME_SCHEMA,
103
+ manager: 'agentsam',
104
+ runtime_root: machineRuntimeRoot(env),
105
+ state_path: machineRuntimeStatePath(env),
106
+ installed: managed.available,
107
+ current_version: managed.state?.current_version || null,
108
+ binary: managed.path,
109
+ source: managed.state?.source || null,
110
+ installed_at_iso: managed.state?.installed_at_iso || null,
111
+ stable_alias: machineManagedAliasPath(env),
112
+ cargo: { available: Boolean(cargo), path: cargo },
113
+ };
114
+ }
115
+
116
+ export function discoverLatestMachineVersion(env = process.env) {
117
+ const cargo = findExecutable('cargo', env);
118
+ if (!cargo) {
119
+ const error = new Error('Cargo is required to install the current agentsam-machine crates.io distribution.');
120
+ error.code = 'AGENTSAM_MACHINE_CARGO_MISSING';
121
+ throw error;
122
+ }
123
+
124
+ const result = spawnSync(cargo, ['search', MACHINE_PACKAGE, '--limit', '1'], {
125
+ encoding: 'utf8',
126
+ stdio: ['ignore', 'pipe', 'pipe'],
127
+ env,
128
+ });
129
+ if (result.status !== 0) {
130
+ const error = new Error(
131
+ String(result.stderr || '').trim() ||
132
+ 'Unable to resolve latest ' + MACHINE_PACKAGE + ' version from crates.io.',
133
+ );
134
+ error.code = 'AGENTSAM_MACHINE_REGISTRY_LOOKUP_FAILED';
135
+ throw error;
136
+ }
137
+
138
+ const match = String(result.stdout || '').match(/^agentsam-machine-cli\s*=\s*"([^"]+)"/m);
139
+ if (!match) {
140
+ const error = new Error('Unable to parse crates.io version for ' + MACHINE_PACKAGE + '.');
141
+ error.code = 'AGENTSAM_MACHINE_REGISTRY_PARSE_FAILED';
142
+ throw error;
143
+ }
144
+ return match[1];
145
+ }
146
+
147
+ function writeCurrentState(version, env = process.env) {
148
+ const root = machineRuntimeRoot(env);
149
+ fs.mkdirSync(root, { recursive: true });
150
+ const state = {
151
+ schema: MACHINE_RUNTIME_SCHEMA,
152
+ manager: 'agentsam',
153
+ package: MACHINE_PACKAGE,
154
+ current_version: version,
155
+ source: 'crates.io',
156
+ installed_at_iso: new Date().toISOString(),
157
+ };
158
+ const target = machineRuntimeStatePath(env);
159
+ const temp = target + '.tmp-' + process.pid;
160
+ fs.writeFileSync(temp, JSON.stringify(state, null, 2) + '\n', { mode: 0o600 });
161
+ fs.renameSync(temp, target);
162
+ return state;
163
+ }
164
+
165
+ function syncManagedAlias(binary, env = process.env) {
166
+ const alias = machineManagedAliasPath(env);
167
+ fs.mkdirSync(path.dirname(alias), { recursive: true });
168
+ try { fs.rmSync(alias, { force: true }); } catch {}
169
+ if (process.platform === 'win32') fs.copyFileSync(binary, alias);
170
+ else fs.symlinkSync(binary, alias);
171
+ return alias;
172
+ }
173
+
174
+ export function installManagedMachine({
175
+ env = process.env,
176
+ version = null,
177
+ force = false,
178
+ write = () => {},
179
+ } = {}) {
180
+ const cargo = findExecutable('cargo', env);
181
+ if (!cargo) {
182
+ const error = new Error(
183
+ 'Cargo is required by the current Machine distribution. Install Rust/Cargo, then rerun agentsam machine install.',
184
+ );
185
+ error.code = 'AGENTSAM_MACHINE_CARGO_MISSING';
186
+ throw error;
187
+ }
188
+
189
+ const desired = version || discoverLatestMachineVersion(env);
190
+ const root = machineRuntimeRoot(env);
191
+ const versionsRoot = path.join(root, 'versions');
192
+ const finalRoot = path.join(versionsRoot, desired);
193
+ const finalBinary = path.join(finalRoot, 'bin', machineBinaryName());
194
+ fs.mkdirSync(versionsRoot, { recursive: true });
195
+
196
+ if (!force && fs.existsSync(finalBinary)) {
197
+ const actual = machineBinaryVersion(finalBinary, env);
198
+ if (actual === desired) {
199
+ const state = writeCurrentState(desired, env);
200
+ const alias = syncManagedAlias(finalBinary, env);
201
+ return { changed: false, version: desired, binary: finalBinary, alias, state, source: 'managed-cache' };
202
+ }
203
+ }
204
+
205
+ const stage = fs.mkdtempSync(path.join(root, '.install-'));
206
+ write('Installing ' + MACHINE_PACKAGE + '@' + desired + ' from crates.io…\n');
207
+
208
+ const result = spawnSync(
209
+ cargo,
210
+ ['install', MACHINE_PACKAGE, '--root', stage, '--version', desired, '--locked', '--force'],
211
+ { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], env },
212
+ );
213
+ if (result.status !== 0) {
214
+ fs.rmSync(stage, { recursive: true, force: true });
215
+ const error = new Error(
216
+ String(result.stderr || result.stdout || '').trim() ||
217
+ 'cargo install failed for ' + MACHINE_PACKAGE + '@' + desired,
218
+ );
219
+ error.code = 'AGENTSAM_MACHINE_INSTALL_FAILED';
220
+ throw error;
221
+ }
222
+
223
+ const stagedBinary = path.join(stage, 'bin', machineBinaryName());
224
+ if (!fs.existsSync(stagedBinary)) {
225
+ fs.rmSync(stage, { recursive: true, force: true });
226
+ const error = new Error('cargo install completed without ' + machineBinaryName());
227
+ error.code = 'AGENTSAM_MACHINE_INSTALL_BINARY_MISSING';
228
+ throw error;
229
+ }
230
+
231
+ const actual = machineBinaryVersion(stagedBinary, env);
232
+ if (actual !== desired) {
233
+ fs.rmSync(stage, { recursive: true, force: true });
234
+ const error = new Error(
235
+ 'installed Machine version mismatch: expected ' + desired + ', received ' + (actual || 'unknown'),
236
+ );
237
+ error.code = 'AGENTSAM_MACHINE_INSTALL_VERSION_MISMATCH';
238
+ throw error;
239
+ }
240
+
241
+ if (fs.existsSync(finalRoot)) fs.rmSync(finalRoot, { recursive: true, force: true });
242
+ fs.renameSync(stage, finalRoot);
243
+ const state = writeCurrentState(desired, env);
244
+ const alias = syncManagedAlias(finalBinary, env);
245
+ return { changed: true, version: desired, binary: finalBinary, alias, state, source: 'crates.io' };
246
+ }
247
+
248
+ export function updateManagedMachine({
249
+ env = process.env,
250
+ force = false,
251
+ write = () => {},
252
+ } = {}) {
253
+ const latest = discoverLatestMachineVersion(env);
254
+ const status = machineRuntimeStatus(env);
255
+ if (!force && status.installed && status.current_version === latest) {
256
+ return {
257
+ changed: false,
258
+ version: latest,
259
+ binary: status.binary,
260
+ alias: machineManagedAliasPath(env),
261
+ state: readMachineRuntimeState(env),
262
+ source: 'already-current',
263
+ };
264
+ }
265
+ return installManagedMachine({ env, version: latest, force, write });
266
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * agentsam machine — deterministic native Machine lifecycle + perception.
3
+ */
4
+
5
+ import path from 'node:path';
6
+ import { resolveMachineBinary, spawnMachine } from './machine-binary.js';
7
+ import {
8
+ installManagedMachine,
9
+ machineBinaryVersion,
10
+ machineRuntimeStatus,
11
+ updateManagedMachine,
12
+ } from './machine-runtime.js';
13
+
14
+ function usage() {
15
+ return 'agentsam machine — deterministic local perception (native engine)\n\n' +
16
+ 'Usage:\n' +
17
+ ' agentsam machine status [--json]\n' +
18
+ ' agentsam machine doctor [--json]\n' +
19
+ ' agentsam machine install [--version <semver>] [--force] [--json]\n' +
20
+ ' agentsam machine update [--force] [--json]\n' +
21
+ ' agentsam machine inspect <path> [--json] [--run-id <id>] [--include-generated]\n' +
22
+ ' agentsam machine --help\n\n' +
23
+ 'Runtime authority:\n' +
24
+ ' AgentSam manages one user-level Machine runtime under ~/.agentsam/runtimes/machine/.\n' +
25
+ ' Every repository uses that managed runtime first; PATH and SDK source are fallbacks only.\n' +
26
+ ' Install/update are explicit and never run merely because you entered a repository.\n\n' +
27
+ 'Notes:\n' +
28
+ ' Default inspect is read-only and network-free.\n' +
29
+ ' Large detail is externalized under <target>/.agentsam/machine/runs/<run_id>/.\n' +
30
+ ' Generated/cache trees are summarized unless --include-generated is set.\n' +
31
+ ' Current registry distribution uses crates.io and therefore requires Cargo for install/update.\n';
32
+ }
33
+
34
+ function parseArgs(argv = []) {
35
+ const out = {
36
+ help: false,
37
+ json: false,
38
+ force: false,
39
+ includeGenerated: false,
40
+ runId: null,
41
+ version: null,
42
+ subcommand: null,
43
+ target: null,
44
+ positionals: [],
45
+ };
46
+
47
+ for (let i = 0; i < argv.length; i += 1) {
48
+ const arg = argv[i];
49
+ if (arg === '--help' || arg === '-h') out.help = true;
50
+ else if (arg === '--json') out.json = true;
51
+ else if (arg === '--force') out.force = true;
52
+ else if (arg === '--include-generated') out.includeGenerated = true;
53
+ else if (arg === '--run-id') {
54
+ const value = argv[++i];
55
+ if (value == null || value.startsWith('--')) throw new Error('--run-id requires a value');
56
+ out.runId = value;
57
+ } else if (arg === '--version') {
58
+ const value = argv[++i];
59
+ if (value == null || value.startsWith('--')) throw new Error('--version requires a value');
60
+ out.version = value;
61
+ } else if (arg.startsWith('-')) {
62
+ throw new Error('unknown machine option: ' + arg);
63
+ } else {
64
+ out.positionals.push(arg);
65
+ }
66
+ }
67
+
68
+ out.subcommand = out.positionals[0] || null;
69
+ out.target = out.positionals[1] || null;
70
+ return out;
71
+ }
72
+
73
+ function statusPayload() {
74
+ const managed = machineRuntimeStatus();
75
+ const resolution = resolveMachineBinary();
76
+ let effectiveVersion = null;
77
+ if (resolution.kind === 'binary') effectiveVersion = machineBinaryVersion(resolution.path);
78
+
79
+ return {
80
+ capability: 'machine.status',
81
+ managed,
82
+ effective: {
83
+ ...resolution,
84
+ version: resolution.version || effectiveVersion,
85
+ },
86
+ };
87
+ }
88
+
89
+ function printTextStatus(payload) {
90
+ console.log('AgentSam Machine');
91
+ console.log('');
92
+ console.log(' managed ' + (payload.managed.installed ? 'installed' : 'not installed'));
93
+ console.log(' version ' + (payload.managed.current_version || '—'));
94
+ console.log(' binary ' + (payload.managed.binary || '—'));
95
+ console.log(' runtime ' + payload.managed.runtime_root);
96
+ console.log(' effective ' + payload.effective.source);
97
+ console.log(' effective v ' + (payload.effective.version || 'unknown'));
98
+ console.log(' cargo ' + (payload.managed.cargo.available ? payload.managed.cargo.path : 'not found'));
99
+ if (!payload.managed.installed) {
100
+ console.log('');
101
+ console.log(' Run agentsam machine install to adopt the user-managed runtime.');
102
+ }
103
+ }
104
+
105
+ function printTextDoctor(payload) {
106
+ printTextStatus(payload);
107
+ console.log('');
108
+ if (payload.effective.kind === 'missing') {
109
+ console.log(' ✕ Machine unavailable');
110
+ console.log(' tried ' + (payload.effective.tried || []).join(', '));
111
+ } else if (payload.managed.installed) {
112
+ console.log(' ✓ managed Machine runtime is available');
113
+ } else {
114
+ console.log(' ○ Machine works through fallback source: ' + payload.effective.source);
115
+ console.log(' ○ install the managed runtime to make resolution consistent across repositories');
116
+ }
117
+ }
118
+
119
+ function printInstallResult(action, result) {
120
+ console.log('AgentSam Machine ' + action);
121
+ console.log('');
122
+ console.log(' version ' + result.version);
123
+ console.log(' binary ' + result.binary);
124
+ console.log(' alias ' + result.alias);
125
+ console.log(' source ' + result.source);
126
+ console.log(' changed ' + (result.changed ? 'yes' : 'no'));
127
+ }
128
+
129
+ export async function runMachine(argv = []) {
130
+ const args = parseArgs(argv);
131
+ if (args.help || !args.subcommand) {
132
+ console.log(usage());
133
+ return 0;
134
+ }
135
+
136
+ if (args.subcommand === 'status') {
137
+ const payload = statusPayload();
138
+ if (args.json) console.log(JSON.stringify(payload));
139
+ else printTextStatus(payload);
140
+ return 0;
141
+ }
142
+
143
+ if (args.subcommand === 'doctor') {
144
+ const payload = statusPayload();
145
+ if (args.json) console.log(JSON.stringify({ ...payload, capability: 'machine.doctor' }));
146
+ else printTextDoctor(payload);
147
+ return payload.effective.kind === 'missing' ? 1 : 0;
148
+ }
149
+
150
+ if (args.subcommand === 'install') {
151
+ const result = installManagedMachine({
152
+ version: args.version,
153
+ force: args.force,
154
+ write: args.json ? () => {} : (value) => process.stdout.write(value),
155
+ });
156
+ if (args.json) console.log(JSON.stringify({ capability: 'machine.install', ...result }));
157
+ else printInstallResult('install', result);
158
+ return 0;
159
+ }
160
+
161
+ if (args.subcommand === 'update') {
162
+ const result = updateManagedMachine({
163
+ force: args.force,
164
+ write: args.json ? () => {} : (value) => process.stdout.write(value),
165
+ });
166
+ if (args.json) console.log(JSON.stringify({ capability: 'machine.update', ...result }));
167
+ else printInstallResult('update', result);
168
+ return 0;
169
+ }
170
+
171
+ if (args.subcommand === 'inspect') {
172
+ const resolution = resolveMachineBinary();
173
+ const target = args.target || process.cwd();
174
+ const abs = path.resolve(target);
175
+ const machineArgv = ['inspect', abs];
176
+ if (args.runId) machineArgv.push('--run-id', args.runId);
177
+ if (args.includeGenerated) machineArgv.push('--include-generated');
178
+ if (args.json) machineArgv.push('--json');
179
+
180
+ const result = spawnMachine(resolution, machineArgv, {
181
+ stdio: args.json ? ['ignore', 'pipe', 'pipe'] : 'inherit',
182
+ maxBuffer: 32 * 1024 * 1024,
183
+ });
184
+
185
+ if (result.error) throw result.error;
186
+ if (args.json) {
187
+ const stdout = String(result.stdout || '');
188
+ const stderr = String(result.stderr || '');
189
+ if (result.status && result.status !== 0) {
190
+ const err = new Error(stderr.trim() || 'agentsam-machine exited with code ' + result.status);
191
+ err.exitCode = result.status;
192
+ throw err;
193
+ }
194
+ try {
195
+ console.log(JSON.stringify(JSON.parse(stdout)));
196
+ } catch {
197
+ process.stdout.write(stdout);
198
+ }
199
+ if (stderr.trim()) process.stderr.write(stderr);
200
+ }
201
+ return result.status ?? 0;
202
+ }
203
+
204
+ console.log(usage());
205
+ const err = new Error('Unknown machine subcommand: ' + args.subcommand);
206
+ err.exitCode = 1;
207
+ throw err;
208
+ }