@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
@@ -1,133 +0,0 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import fs from 'node:fs';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import { execFileSync } from 'node:child_process';
7
- import { getCapability, getCapabilityManifest, repositorySnapshot } from '../src/capabilities/index.js';
8
- import { getPreset, resolvePreset } from '../src/presets/index.js';
9
- import { scanTrustBoundary } from '../src/security/trust-boundary.js';
10
-
11
- const CLI = path.resolve('src/cli.js');
12
-
13
- function git(cwd, args) { return execFileSync('git', args, { cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }).trim(); }
14
-
15
- function fixture() {
16
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-capability-'));
17
- fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: 'snapshot-fixture', version: '1.0.0', type: 'module' }, null, 2));
18
- fs.mkdirSync(path.join(root, 'src'));
19
- fs.writeFileSync(path.join(root, 'src', 'index.js'), 'export const value = 1;\n');
20
- git(root, ['init', '-q']);
21
- git(root, ['config', 'user.email', 'test@example.com']);
22
- git(root, ['config', 'user.name', 'AgentSam Test']);
23
- git(root, ['add', '.']);
24
- git(root, ['commit', '-qm', 'fixture']);
25
- return root;
26
- }
27
-
28
- test('capability manifest exposes deterministic primitives without requiring a model', () => {
29
- const manifest = getCapabilityManifest();
30
- assert.equal(manifest.schema_version, 1);
31
- assert.equal(getCapability('repository.snapshot').model_required, false);
32
- assert.equal(getCapability('repository.snapshot').side_effects, 'none');
33
- assert.equal(getCapability('knowledge.index').deterministic, true);
34
- });
35
-
36
- test('presets resolve to explicit feature/capability selections', () => {
37
- assert.equal(getPreset('cms').lane, 'cms');
38
- const preset = resolvePreset('prototype');
39
- assert.deepEqual(preset.features, ['agent']);
40
- assert.throws(() => resolvePreset('nope'), /unknown_preset/);
41
- });
42
-
43
- test('repository.snapshot composes deterministic evidence and content addressing', async t => {
44
- const root = fixture();
45
- t.after(() => fs.rmSync(root, { recursive: true, force: true }));
46
- const one = await repositorySnapshot({ cwd: root, churnDays: 30 });
47
- const two = await repositorySnapshot({ cwd: root, churnDays: 30 });
48
- assert.equal(one.capability, 'repository.snapshot');
49
- assert.match(one.snapshot_id, /^rsnap_[a-f0-9]{24}$/);
50
- assert.match(one.content_hash, /^sha256:[a-f0-9]{64}$/);
51
- assert.equal(one.content_hash, two.content_hash);
52
- assert.equal(one.snapshot_id, two.snapshot_id);
53
- assert.equal(one.repository.revision_sha, git(root, ['rev-parse', 'HEAD']));
54
- assert.ok(one.tree.merkle_root);
55
- assert.match(one.tree.metadata_root, /^sha256:[a-f0-9]{64}$/);
56
- assert.equal(one.tree.manifest.format, 'agentsam-merkle');
57
- assert.equal(one.tree.manifest.version, 1);
58
- assert.equal(one.tree.manifest.hash_algorithm, 'sha256');
59
- assert.match(one.tree.manifest.policy_hash, /^sha256:[a-f0-9]{64}$/);
60
- assert.equal(one.tree.classifier.format, 'agentsam-filemeta');
61
- assert.equal(one.tree.classifier.version, 1);
62
- const source = one.tree.files.find((entry) => entry.path === 'src/index.js');
63
- assert.equal(source.mode, 420);
64
- assert.equal(source.system, 'snapshot-fixture');
65
- assert.equal(source.language, 'javascript');
66
- assert.deepEqual(source.symbols, ['value']);
67
- assert.equal(one.analysis.trust_boundary.analyzer, 'agentsam-execution-boundary');
68
- assert.equal(one.analysis.trust_boundary.metadata_root, one.tree.metadata_root);
69
- assert.equal(one.analysis.trust_boundary.complete, true);
70
- assert.equal(one.analysis.trust_boundary.status, 'clean');
71
- assert.ok(one.intelligence.summary.file_count >= 2);
72
- assert.equal(one.packages[0].name, 'snapshot-fixture');
73
- assert.equal(one.knowledge.configured, false);
74
- });
75
-
76
- test('repository inspection and security scan share one Git-ignore/Merkle trust authority', async t => {
77
- const root = fixture();
78
- t.after(() => fs.rmSync(root, { recursive: true, force: true }));
79
- fs.mkdirSync(path.join(root, 'frontend'));
80
- fs.mkdirSync(path.join(root, 'backend'));
81
- fs.mkdirSync(path.join(root, 'ignored'));
82
- fs.writeFileSync(path.join(root, 'frontend', 'client.ts'), "import { secretValue } from '../backend/secrets.ts';\nexport const value = secretValue;\n");
83
- fs.writeFileSync(path.join(root, 'backend', 'secrets.ts'), "export const secretValue = process.env.API_KEY;\n");
84
- fs.writeFileSync(path.join(root, 'ignored', 'noise.ts'), "import fs from 'node:fs'; export const x = process.env.PRIVATE_TOKEN + String(fs);\n");
85
- fs.writeFileSync(path.join(root, '.gitignore'), 'ignored/\n');
86
-
87
- const snapshot = await repositorySnapshot({ cwd: root, churnDays: 30 });
88
- const boundary = await scanTrustBoundary(root);
89
- assert.equal(snapshot.tree.metadata_root, boundary.metadata_root);
90
- assert.equal(snapshot.tree.merkle_root, boundary.merkle_root);
91
- assert.equal(snapshot.analysis.trust_boundary.status, 'action-required');
92
- assert.deepEqual(
93
- snapshot.analysis.trust_boundary.findings.map((item) => [item.kind, item.source, item.target]),
94
- boundary.findings.map((item) => [item.kind, item.source, item.target]),
95
- );
96
- assert.equal(snapshot.tree.paths.some((value) => value.startsWith('ignored/')), false);
97
- assert.equal(boundary.findings.some((item) => item.source.startsWith('ignored/')), false);
98
- });
99
-
100
- test('product UX creates a preset project, adds a feature, and inspects before first commit', t => {
101
- const parent = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-product-'));
102
- t.after(() => fs.rmSync(parent, { recursive: true, force: true }));
103
- execFileSync(process.execPath, [CLI, 'create', 'demo', '--preset', 'cms', '--target', 'local'], {
104
- cwd: parent,
105
- stdio: 'pipe',
106
- });
107
- const project = path.join(parent, 'demo');
108
- const config = JSON.parse(fs.readFileSync(path.join(project, '.agentsam', 'config.json'), 'utf8'));
109
- assert.equal(config.schema_version, 2);
110
- assert.equal(config.project.name, 'demo');
111
- assert.equal(config.product.preset, 'cms');
112
- assert.deepEqual(config.product.features, ['cms', 'knowledge', 'brand', 'theme']);
113
- assert.ok(config.product.capabilities.includes('repository.snapshot'));
114
- assert.match(config.repository.id, /^local:[0-9a-f-]{36}$/);
115
- assert.equal(config.defaults.runtime, 'local');
116
- assert.equal(config.defaults.model, 'auto');
117
- assert.equal(fs.existsSync(path.join(project, 'agentsam.config.js')), false);
118
-
119
- execFileSync(process.execPath, [CLI, 'add', 'knowledge', '--cwd', project, '--json'], { stdio: 'pipe' });
120
- const features = JSON.parse(fs.readFileSync(path.join(project, '.agentsam', 'features.json'), 'utf8'));
121
- assert.equal(features.features.knowledge.selected, true);
122
-
123
- const snapshot = JSON.parse(execFileSync(process.execPath, [CLI, 'inspect', '--cwd', project, '--json'], {
124
- encoding: 'utf8',
125
- stdio: ['ignore', 'pipe', 'pipe'],
126
- }));
127
- assert.equal(snapshot.capability, 'repository.snapshot');
128
- assert.equal(snapshot.repository.repository_id, config.repository.id);
129
- assert.equal(snapshot.repository.identity_source, 'project-config');
130
- assert.equal(snapshot.repository.revision_sha, null);
131
- assert.ok(snapshot.tree.stats.files > 0);
132
- assert.ok(snapshot.analysis?.trust_boundary);
133
- });
@@ -1,129 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import test from 'node:test';
6
- import { runEnv } from '../../src/commands/env.js';
7
- import { ensureAgentEnvLoader, renderEnvShellExports, setProviderCredential } from '../../src/lib/provider-credentials.js';
8
- import { runApiKey } from '../../src/commands/api-key.js';
9
- import { collectWhoami } from '../../src/commands/whoami.js';
10
-
11
- function tmpHome() {
12
- return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-env-api-'));
13
- }
14
-
15
- test('load-agent-env.sh delegates to agentsam env shell (no plaintext secrets)', () => {
16
- const home = tmpHome();
17
- const loader = ensureAgentEnvLoader({ home });
18
- const source = fs.readFileSync(loader, 'utf8');
19
- assert.match(source, /agentsam env shell --profile default/);
20
- assert.doesNotMatch(source, /export AGENTSAM_API_KEY=/);
21
- assert.doesNotMatch(source, /env\.d\//);
22
- });
23
-
24
- test('env boot-line prints source load-agent-env without provider args', async () => {
25
- const home = tmpHome();
26
- const result = await runEnv(['boot-line'], { home, write: () => {} });
27
- assert.equal(result.command, 'source ~/.agentsam/load-agent-env.sh');
28
- });
29
-
30
- test('env shell emits exports from vault without requiring ambient AGENTSAM_API_KEY', async () => {
31
- const home = tmpHome();
32
- setProviderCredential('inneranimalmedia', 'aak_testsecretvalue1234567890abcdef', {
33
- home,
34
- disableOsStore: true,
35
- });
36
- const result = await runEnv(['shell', '--profile', 'default'], {
37
- home,
38
- env: {},
39
- write: () => {},
40
- });
41
- assert.match(result.script, /export AGENTSAM_API_KEY=/);
42
- assert.ok(result.providers.includes('inneranimalmedia'));
43
- });
44
-
45
- test('renderEnvShellExports prefers vault over empty ambient env', () => {
46
- const home = tmpHome();
47
- setProviderCredential('cursor', 'cursor_test_key_value_xxxxxxxx', {
48
- home,
49
- disableOsStore: true,
50
- });
51
- const result = renderEnvShellExports({ home, env: {}, profile: 'default' });
52
- assert.ok(result.providers.includes('cursor'));
53
- assert.match(result.script, /export CURSOR_API_KEY=/);
54
- });
55
-
56
- test('api-key create stores secret via host mint response', async () => {
57
- const home = tmpHome();
58
- const result = await runApiKey(['create', '--name', 'Test Mac', '--store', 'vault', '--activate'], {
59
- home,
60
- env: {},
61
- disableOsStore: true,
62
- authorityLoader: async () => ({ value: 'oauth_session_token', kind: 'browser_oauth', source: 'test' }),
63
- postJsonImpl: async () => ({
64
- ok: true,
65
- credential: { id: 'aakcred_1', name: 'Test Mac', prefix: 'aak_abc…', scopes: ['account:read'] },
66
- secret_once: 'aak_mintedsecretvalue1234567890abcd',
67
- }),
68
- write: () => {},
69
- });
70
- assert.equal(result.ok, true);
71
- assert.equal(result.activated, true);
72
- assert.equal(result.credential.prefix, 'aak_abc…');
73
- });
74
-
75
- test('whoami surfaces tokenPermissions and authType from context', async () => {
76
- const home = tmpHome();
77
- const status = await collectWhoami({
78
- home,
79
- env: {},
80
- authorityLoader: async () => ({ value: 'aak_presented', kind: 'api_key', source: 'environment' }),
81
- contextLoader: async () => ({
82
- user_id: 'au_1',
83
- account_id: 'acct_1',
84
- email: 'dev@example.test',
85
- auth_type: 'api_key',
86
- tokenPermissions: ['account:read', 'repository:read', 'models:invoke'],
87
- credential: {
88
- id: 'aakcred_1',
89
- name: 'Sams-iMac',
90
- prefix: 'aak_7fm…',
91
- environment: 'development',
92
- status: 'active',
93
- },
94
- cloudflare: { ok: true },
95
- byok: {},
96
- terminal: { available: false, instances: [], connections: [] },
97
- }),
98
- });
99
- assert.equal(status.loggedIn, true);
100
- assert.equal(status.authType, 'api_key');
101
- assert.deepEqual(status.tokenPermissions, ['account:read', 'repository:read', 'models:invoke']);
102
- assert.equal(status.credential.name, 'Sams-iMac');
103
- assert.doesNotMatch(JSON.stringify(status), /aak_presented/);
104
- });
105
-
106
- test('repository does not normalize AGENTSAM_DEFAULT_APP', () => {
107
- const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), '../..');
108
- const hits = [];
109
- function walk(dir) {
110
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
111
- if (entry.name === 'node_modules' || entry.name === '.git' || entry.name === 'dist') continue;
112
- const full = path.join(dir, entry.name);
113
- if (entry.isDirectory()) walk(full);
114
- else if (/\.(js|mjs|ts|tsx|sh|json|md)$/.test(entry.name)) {
115
- const text = fs.readFileSync(full, 'utf8');
116
- // Allow docs that explicitly forbid the variable.
117
- if (/AGENTSAM_DEFAULT_APP/.test(text) && !/no AGENTSAM_DEFAULT_APP|not normalize AGENTSAM_DEFAULT_APP|Remove.*AGENTSAM_DEFAULT_APP|doesNotMatch.*AGENTSAM_DEFAULT_APP|APP_SELECTOR=/.test(text)) {
118
- if (/process\.env\.AGENTSAM_DEFAULT_APP|AGENTSAM_DEFAULT_APP\s*\|\||\$\{AGENTSAM_DEFAULT_APP/.test(text)) {
119
- hits.push(full);
120
- }
121
- }
122
- }
123
- }
124
- }
125
- walk(path.join(root, 'src'));
126
- walk(path.join(root, 'scripts'));
127
- walk(path.join(root, 'apps/local-studio/backend'));
128
- assert.deepEqual(hits, []);
129
- });
@@ -1,37 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { describe, it } from 'node:test';
3
- import {
4
- createCodebaseindexJobGraph,
5
- advanceJobGraph,
6
- freezePlanJobGraph,
7
- formatJobGraphHuman,
8
- } from '../../src/indexing/ingest/job-graph.js';
9
- import { classifyTopLevel } from '../../src/indexing/ingest/inventory.js';
10
-
11
- describe('codebaseindex job graph plan freeze', () => {
12
- it('does not leave → run pointer after plan.dry_run', () => {
13
- let g = createCodebaseindexJobGraph();
14
- g = advanceJobGraph(g, 'plan.dry_run');
15
- assert.equal(g.nodes.find((n) => n.status === 'run')?.id, 'ast.parse');
16
- g = freezePlanJobGraph(g, { skipEmbedding: true });
17
- assert.equal(g.status, 'planned');
18
- assert.equal(g.nodes.filter((n) => n.status === 'run').length, 0);
19
- assert.equal(g.nodes.find((n) => n.id === 'embedding.generate')?.status, 'skipped');
20
- const text = formatJobGraphHuman(g, { planOnly: true });
21
- assert.match(text, /PLANNED FOR RUN/);
22
- assert.match(text, /○ ast\.parse/);
23
- assert.doesNotMatch(text, /→/);
24
- });
25
- });
26
-
27
- describe('inventory path categories', () => {
28
- it('classifies source vs dependencies vs generated', () => {
29
- assert.equal(classifyTopLevel('src'), 'source');
30
- assert.equal(classifyTopLevel('apps'), 'source');
31
- assert.equal(classifyTopLevel('docs'), 'docs');
32
- assert.equal(classifyTopLevel('node_modules'), 'dependencies');
33
- assert.equal(classifyTopLevel('dist'), 'dependencies');
34
- assert.equal(classifyTopLevel('generated'), 'generated');
35
- assert.equal(classifyTopLevel('.agentsam'), 'operational');
36
- });
37
- });
@@ -1,219 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import test from 'node:test';
6
-
7
- import {
8
- finishLiveEvalRun,
9
- getLiveEvalStatus,
10
- startLiveEvalRun,
11
- } from '../../src/eval/index.js';
12
- import { recordToolReceipt } from '../../src/mcp/index.js';
13
- import { runEval } from '../../src/commands/eval.js';
14
-
15
- function tempHome() {
16
- return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-live-eval-test-'));
17
- }
18
-
19
- test('live eval lifecycle: start, track receipts, get status, finish', async () => {
20
- const home = tempHome();
21
-
22
- // Initially inactive
23
- const initialStatus = getLiveEvalStatus({ home });
24
- assert.equal(initialStatus.active, false);
25
-
26
- // Start live eval run
27
- const run = startLiveEvalRun(
28
- {
29
- suite: 'sdk-real-work-20260919',
30
- case: 'cad-shell-unification',
31
- model: 'Muse Spark 1.3',
32
- provider: 'cursor',
33
- client: 'cursor',
34
- reasoning: 'high',
35
- },
36
- { home }
37
- );
38
-
39
- assert.ok(run.run_id.startsWith('evr_'));
40
- assert.equal(run.suite_id, 'sdk-real-work-20260919');
41
- assert.equal(run.case_id, 'cad-shell-unification');
42
- assert.equal(run.model, 'Muse Spark 1.3');
43
-
44
- // Verify starting again fails
45
- assert.throws(() => startLiveEvalRun({}, { home }), /live_eval_run_already_active/);
46
-
47
- // Record tool calls into the live session
48
- recordToolReceipt({ tool_key: 'github_read', source_client: 'cursor', duration_ms: 50 }, { home });
49
- recordToolReceipt({ tool_key: 'mcp:d1_query', source_client: 'cursor_mcp', duration_ms: 12 }, { home });
50
- recordToolReceipt({ tool_key: 'terminal_exec', source_client: 'agentsam', duration_ms: 300 }, { home });
51
-
52
- // Status check reflects active state and tool receipts
53
- const activeStatus = getLiveEvalStatus({ home });
54
- assert.equal(activeStatus.active, true);
55
- assert.equal(activeStatus.receipts_summary.tool_call_count, 3);
56
- assert.equal(activeStatus.receipts_summary.mcp_call_count, 1);
57
-
58
- // Finish run
59
- const result = await finishLiveEvalRun({ home, gate: 'PASS' });
60
- assert.equal(result.evalRunRow.id, run.run_id);
61
- assert.equal(result.evalRunRow.passed, 1);
62
- assert.equal(result.evalRunRow.tool_calls_attempted, 3);
63
- assert.equal(result.evalRunRow.tool_calls_succeeded, 3);
64
- assert.equal(result.modelObservationRow.id, `obs_${run.run_id}`);
65
- assert.equal(result.modelObservationRow.passed, 1);
66
-
67
- // After finish, status is inactive again
68
- const postStatus = getLiveEvalStatus({ home });
69
- assert.equal(postStatus.active, false);
70
- });
71
-
72
- test('agentsam eval live CLI commands work end-to-end', async () => {
73
- const home = tempHome();
74
- const logs = [];
75
- const write = (str) => logs.push(str);
76
-
77
- // CLI start
78
- const startResult = await runEval(
79
- ['live', 'start', '--case', 'errors-v1-reconciliation', '--model', 'Muse Spark 1.3', '--json'],
80
- { home, write }
81
- );
82
- assert.ok(startResult.run_id.startsWith('evr_'));
83
-
84
- // Record receipt
85
- recordToolReceipt({ tool_key: 'mcp:eval_query', source_client: 'cursor_mcp', duration_ms: 40 }, { home });
86
-
87
- // CLI status
88
- const statusResult = await runEval(['live', 'status', '--json'], { home, write });
89
- assert.equal(statusResult.active, true);
90
- assert.equal(statusResult.receipts_summary.tool_call_count, 1);
91
-
92
- // CLI finish
93
- const finishResult = await runEval(['live', 'finish', '--gate', 'PASS', '--json'], { home, write });
94
- assert.equal(finishResult.evalRunRow.passed, 1);
95
- assert.equal(finishResult.summary.gate_status, 'PASS');
96
-
97
- // Verify non-JSON output formats cleanly
98
- const emptyStatus = await runEval(['live', 'status'], { home, write });
99
- assert.equal(emptyStatus.active, false);
100
- });
101
-
102
- test('finishLiveEvalRun archives run locally, generates SQL for both tables, and respects configurable tenant/database', async () => {
103
- const home = tempHome();
104
- const run = startLiveEvalRun(
105
- {
106
- case: 'cad-render-eval',
107
- model: 'Muse Spark 1.3',
108
- tenant: 'test-tenant',
109
- workspace: 'cad-workspace',
110
- user: 'test-user',
111
- database: 'test-database',
112
- },
113
- { home }
114
- );
115
-
116
- assert.equal(run.tenant_id, 'test-tenant');
117
- assert.equal(run.workspace_id, 'cad-workspace');
118
- assert.equal(run.user_id, 'test-user');
119
- assert.equal(run.database, 'test-database');
120
-
121
- const result = await finishLiveEvalRun({ home, gate: 'PASS' });
122
-
123
- // 1. Dual record construction
124
- assert.equal(result.evalRunRow.tenant_id, 'test-tenant');
125
- assert.equal(result.modelObservationRow.tenant_id, 'test-tenant');
126
- assert.equal(result.modelObservationRow.workspace_id, 'cad-workspace');
127
- assert.equal(result.modelObservationRow.user_id, 'test-user');
128
- assert.equal(result.modelObservationRow.status, 'completed');
129
- assert.equal(result.modelObservationRow.passed, 1);
130
- assert.equal(result.modelObservationRow.expected_markers_total, 1);
131
- assert.equal(typeof result.modelObservationRow.output_chars, 'number');
132
-
133
- // 2. Both tables present in generated D1 SQL
134
- assert.ok(result.summary.d1_sql.includes('INSERT OR REPLACE INTO agentsam_eval_runs'));
135
- assert.ok(result.summary.d1_sql.includes('INSERT OR REPLACE INTO agentsam_model_eval_observations'));
136
-
137
- // 3. Local archive created
138
- const archivedRunPath = path.join(home, '.agentsam', 'eval', 'runs', `${run.run_id}.json`);
139
- assert.ok(fs.existsSync(archivedRunPath), 'Archived run file must exist locally');
140
- const archived = JSON.parse(fs.readFileSync(archivedRunPath, 'utf8'));
141
- assert.equal(archived.evalRunRow.id, run.run_id);
142
- assert.equal(archived.modelObservationRow.id, `obs_${run.run_id}`);
143
- });
144
-
145
- test('finishLiveEvalRun preserves active run state and receipts if remote persistence fails without --force', async () => {
146
- const home = tempHome();
147
- const run = startLiveEvalRun({ case: 'resilience-test' }, { home });
148
-
149
- recordToolReceipt({ tool_key: 'git_status', duration_ms: 20 }, { home });
150
-
151
- // Call finish with remote=true pointing to an unreachable endpoint and wrangler fallback disabled
152
- const result = await finishLiveEvalRun({
153
- home,
154
- remote: true,
155
- evalEndpoint: 'http://127.0.0.1:1/nonexistent',
156
- wranglerFallback: false,
157
- timeoutMs: 100,
158
- });
159
-
160
- // Verification: remote failure noted, evidence preserved, active run kept intact
161
- assert.equal(result.summary.d1_executed, false);
162
- assert.equal(result.summary.state_preserved, true);
163
- assert.ok(result.summary.d1_error);
164
-
165
- const activeStatus = getLiveEvalStatus({ home });
166
- assert.equal(activeStatus.active, true, 'Active run state must be retained when remote persistence fails');
167
- assert.equal(activeStatus.receipts_summary.tool_call_count, 1, 'Tool receipts must be preserved when remote persistence fails');
168
-
169
- // Finish with force: true to finalize and clear active run
170
- const forcedResult = await finishLiveEvalRun({
171
- home,
172
- remote: true,
173
- evalEndpoint: 'http://127.0.0.1:1/nonexistent',
174
- wranglerFallback: false,
175
- timeoutMs: 100,
176
- force: true,
177
- });
178
-
179
- assert.equal(forcedResult.summary.d1_executed, false);
180
- const clearedStatus = getLiveEvalStatus({ home });
181
- assert.equal(clearedStatus.active, false, 'Forced finish clears active run');
182
- });
183
-
184
- test('finishLiveEvalRun reuses the configured inneranimalmedia MCP bearer for remote persistence', { concurrency: false }, async () => {
185
- const home = tempHome();
186
- const mcpDir = path.join(home, '.agentsam', 'mcp');
187
- fs.mkdirSync(mcpDir, { recursive: true });
188
- fs.writeFileSync(
189
- path.join(mcpDir, 'inneranimalmedia.json'),
190
- JSON.stringify({ auth: { type: 'bearer', token: 'fixture-eval-token' } }),
191
- );
192
-
193
- startLiveEvalRun({ case: 'authenticated-remote-eval' }, { home });
194
-
195
- const originalFetch = globalThis.fetch;
196
- let authorization = null;
197
- try {
198
- globalThis.fetch = async (_url, init = {}) => {
199
- authorization = new Headers(init.headers).get('Authorization');
200
- return new Response(JSON.stringify({ ok: true }), {
201
- status: 200,
202
- headers: { 'Content-Type': 'application/json' },
203
- });
204
- };
205
-
206
- const result = await finishLiveEvalRun({
207
- home,
208
- remote: true,
209
- evalEndpoint: 'https://example.test/api/eval/record',
210
- wranglerFallback: false,
211
- });
212
-
213
- assert.equal(authorization, 'Bearer fixture-eval-token');
214
- assert.equal(result.summary.d1_executed, true);
215
- assert.equal(result.summary.persistence_method, 'http_endpoint');
216
- } finally {
217
- globalThis.fetch = originalFetch;
218
- }
219
- });
@@ -1,128 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import test from 'node:test';
6
- import { fileURLToPath } from 'node:url';
7
- import { discoverGoRuntime, resolveProductRoot, ensureProductContract, buildGoProduct } from '../../src/go/index.js';
8
- import { runGo } from '../../src/commands/go.js';
9
-
10
- const SDK_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
11
-
12
-
13
- function tempStateRoot() {
14
- return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-go-test-state-'));
15
- }
16
-
17
- test('discoverGoRuntime finds agentsam-go-worker without inventing a sibling', () => {
18
- const discovery = discoverGoRuntime(SDK_ROOT);
19
- assert.equal(discovery.go.ok, true);
20
- assert.ok(discovery.runtime, 'expected Go runtime');
21
- assert.match(discovery.runtime.module, /agentsam-go-worker/);
22
- assert.equal(path.basename(discovery.runtime.productRoot), 'agentsam-go-worker');
23
- const productRoot = resolveProductRoot(discovery, 'agentsam-go-worker');
24
- const contract = ensureProductContract(productRoot);
25
- assert.equal(contract.product, 'agentsam-go-worker');
26
- assert.equal(contract.existing, true);
27
- assert.deepEqual(contract.created, []);
28
- });
29
-
30
- test('ensureProductContract refuses missing product roots instead of scaffolding siblings', () => {
31
- const missing = path.join(os.tmpdir(), `agentsam-go-missing-${Date.now()}`);
32
- assert.throws(() => ensureProductContract(missing), /product_root_missing/);
33
- });
34
-
35
- test('buildGoProduct emits build receipt after go test/vet/build', () => {
36
- const discovery = discoverGoRuntime(SDK_ROOT);
37
- const productRoot = resolveProductRoot(discovery);
38
- const stateRoot = tempStateRoot();
39
- const result = buildGoProduct({
40
- productRoot,
41
- runtimeRoot: discovery.runtime.runtimeRoot,
42
- repositoryRoot: discovery.repository_root,
43
- stateRoot,
44
- });
45
- assert.equal(result.receipt.schema, 'agentsam.go-build-receipt.v1');
46
- assert.equal(result.tests.ok, true);
47
- assert.equal(result.vet.ok, true);
48
- assert.ok(result.build.binary);
49
- assert.match(result.receipt.artifact.digest, /^sha256:[a-f0-9]{64}$/);
50
- assert.equal(result.receipt.tests.runtime_probe, true);
51
- assert.match(result.receipt.source.identity, /^git:[a-f0-9]{40}$/);
52
- assert.equal(result.probe.checks.source_identity, true);
53
- assert.equal(result.probe.checks.source_commit, true);
54
- assert.equal(result.probe.checks.error_envelope, true);
55
- assert.equal(result.probe.checks.clean_shutdown, true);
56
- assert.ok(fs.existsSync(result.receiptPath));
57
- });
58
-
59
- test('agentsam go build --json exposes only portable build paths', async () => {
60
- const stateRoot = tempStateRoot();
61
- const chunks = [];
62
-
63
- const result = await runGo(
64
- ['build', '--json'],
65
- {
66
- write: (value) => chunks.push(String(value)),
67
- stateRoot,
68
- },
69
- );
70
-
71
- assert.ok(path.isAbsolute(result.receiptPath), 'internal execution keeps absolute receipt path');
72
- assert.ok(path.isAbsolute(result.build.binary), 'internal execution keeps absolute binary path');
73
-
74
- const output = chunks.join('');
75
- const parsed = JSON.parse(output);
76
-
77
- assert.equal(path.isAbsolute(parsed.receiptPath), false);
78
- assert.equal(path.isAbsolute(parsed.build.binary), false);
79
- assert.equal(path.isAbsolute(parsed.receipt.runtime.module_root), false);
80
- assert.equal(Object.hasOwn(parsed.probe || {}, 'origin'), false);
81
- assert.equal(Object.hasOwn(parsed.receipt?.probe || {}, 'origin'), false);
82
- assert.equal(output.includes(SDK_ROOT), false);
83
- });
84
-
85
- test('agentsam go --cloudflare agentsam-go-worker --skip-deploy is idempotent', async () => {
86
- const stateRoot = tempStateRoot();
87
- const chunks = [];
88
- const write = (v) => chunks.push(String(v));
89
- const first = await runGo(
90
- ['--cloudflare', 'agentsam-go-worker', '--skip-deploy', '--json'],
91
- { write, stateRoot },
92
- );
93
- assert.equal(first.ok, true);
94
- assert.equal(first.product, 'agentsam-go-worker');
95
- assert.equal(first.scaffold_changes_required, false);
96
- assert.equal(first.mode, 'self_host');
97
- assert.equal(first.deploy.registry.reason, 'self_host_registry_isolated');
98
-
99
- const chunks2 = [];
100
- const second = await runGo(
101
- ['--cloudflare', 'agentsam-go-worker', '--skip-deploy', '--json'],
102
- {
103
- write: (v) => chunks2.push(String(v)),
104
- stateRoot,
105
- },
106
- );
107
- assert.equal(second.ok, true);
108
- assert.equal(second.existing_product, true);
109
- assert.equal(second.scaffold_changes_required, false);
110
- assert.ok(second.deploy.receiptPath);
111
- assert.ok(fs.existsSync(second.deploy.productPath));
112
- });
113
-
114
- test('agentsam go status --json reports discovery', async () => {
115
- const stateRoot = tempStateRoot();
116
- const chunks = [];
117
- const result = await runGo(
118
- ['status', '--json'],
119
- {
120
- write: (v) => chunks.push(String(v)),
121
- stateRoot,
122
- },
123
- );
124
- assert.equal(result.ok, true);
125
- assert.ok(result.discovery.go.ok);
126
- const parsed = JSON.parse(chunks.join(''));
127
- assert.equal(parsed.product, 'agentsam-go-worker');
128
- });