@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,584 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { describe, it } from 'node:test';
3
- import {
4
- buildDecisionState,
5
- defineChoose,
6
- defineScore,
7
- defineCheck,
8
- evaluate,
9
- evaluateDependentStages,
10
- applyDecisionPolicy,
11
- composeUtility,
12
- createDecisionReceipt,
13
- appendOutcome,
14
- QUESTION_REGISTRY,
15
- getRegisteredQuestion,
16
- brierScore,
17
- logLoss,
18
- expectedCalibrationError,
19
- hierarchicalChoose,
20
- beamRetain,
21
- createSemanticEvaluator,
22
- DECISION_STATE_SCHEMA,
23
- DECISION_RECEIPT_SCHEMA,
24
- } from '../../src/sam/decision/index.js';
25
- import {
26
- concentrationFromScores,
27
- expectedScore,
28
- softmax,
29
- assertProbabilitiesSumToOne,
30
- buildAnswer,
31
- } from '../../src/sam/decision/confidence.js';
32
- import { validateQuestion } from '../../src/sam/decision/validate.js';
33
- import { selectEvaluator, DETERMINISTIC_EVALUATOR, SEMANTIC_EVALUATOR } from '../../src/sam/decision/evaluators/select.js';
34
- import { AgentSamClient, ensureSeedOperations, resetSeedFlagForTests, clearSamRegistryForTests } from '../../src/sam/index.js';
35
- import { planAStar, planGoap } from '../../src/sam/planning/index.js';
36
-
37
- describe('SAM decision state', () => {
38
- it('builds a versioned state contract', () => {
39
- const state = buildDecisionState({
40
- intent: { type: 'symbol_lookup' },
41
- repository: { root: '/tmp/repo', dirty: { value: true, source: 'git.status' } },
42
- facts: { requires_local_files: true },
43
- });
44
- assert.equal(state.schema, DECISION_STATE_SCHEMA);
45
- assert.equal(state.repository.root, '/tmp/repo');
46
- assert.equal(state.facts.requires_local_files, true);
47
- });
48
- });
49
-
50
- describe('SAM question contracts', () => {
51
- it('validates choose with finite options', () => {
52
- const q = defineChoose({
53
- id: 'lane',
54
- options: ['local', 'remote'],
55
- criteria: { local: { use_when: ['x'] }, remote: {} },
56
- });
57
- assert.equal(q.type, 'choose');
58
- assert.deepEqual(q.options, ['local', 'remote']);
59
- });
60
-
61
- it('fails closed on choose without options', () => {
62
- assert.throws(
63
- () => defineChoose({ id: 'empty', options: [] }),
64
- (err) => err.code === 'choose_options_required',
65
- );
66
- });
67
-
68
- it('validates score with ordered levels', () => {
69
- const q = defineScore({
70
- id: 'risk',
71
- levels: [
72
- { index: 0, label: 'low' },
73
- { index: 1, label: 'mid' },
74
- { index: 2, label: 'high' },
75
- ],
76
- });
77
- assert.equal(q.type, 'score');
78
- assert.equal(q.levels.length, 3);
79
- });
80
-
81
- it('rejects duplicate score level indexes', () => {
82
- assert.throws(
83
- () => defineScore({
84
- id: 'bad',
85
- levels: [{ index: 1, label: 'a' }, { index: 1, label: 'b' }],
86
- }),
87
- (err) => err.code === 'score_levels_unordered',
88
- );
89
- });
90
-
91
- it('validates check yes/no contract', () => {
92
- const q = defineCheck({
93
- id: 'needs_approval',
94
- instructions: { question: 'Approve?', inspect: ['policy'] },
95
- });
96
- assert.equal(q.type, 'check');
97
- });
98
-
99
- it('keeps registry question ids stable', () => {
100
- assert.ok(QUESTION_REGISTRY.terminal_lane);
101
- assert.equal(getRegisteredQuestion('terminal_lane').id, 'terminal_lane');
102
- assert.equal(getRegisteredQuestion('change_risk').type, 'score');
103
- });
104
-
105
- it('accepts structured string/object/array criteria', () => {
106
- validateQuestion({
107
- id: 'x',
108
- type: 'choose',
109
- options: ['a'],
110
- criteria: { a: { use_when: ['one'] } },
111
- instructions: ['step'],
112
- });
113
- validateQuestion({
114
- id: 'y',
115
- type: 'choose',
116
- options: ['a'],
117
- criteria: 'prose ok',
118
- instructions: 'string ok',
119
- });
120
- });
121
-
122
- it('fails closed on malformed criteria', () => {
123
- assert.throws(
124
- () => validateQuestion({ id: 'z', type: 'choose', options: ['a'], criteria: 42 }),
125
- (err) => err.code === 'invalid_criteria',
126
- );
127
- });
128
- });
129
-
130
- describe('SAM batch evaluate independence', () => {
131
- const baseState = {
132
- intent: { type: 'architecture concept review' },
133
- runtime: { terminal_lanes: { local: 'healthy', remote: 'healthy', sandbox: 'healthy' } },
134
- constraints: { requires_local_files: true },
135
- code: { affected_packages: ['agentsam-sdk', 'identity'] },
136
- facts: { change_risk_hint: 1 },
137
- };
138
-
139
- it('one state serves multiple independent questions', async () => {
140
- const result = await evaluate({
141
- state: baseState,
142
- questions: [
143
- 'terminal_lane',
144
- 'retrieval_mode',
145
- 'change_risk',
146
- 'requires_approval',
147
- 'security_review_required',
148
- 'verification_scope',
149
- ],
150
- });
151
- assert.equal(result.ok, true);
152
- assert.equal(result.answers.terminal_lane.value, 'local');
153
- assert.equal(result.answers.retrieval_mode.value, 'semantic');
154
- assert.equal(result.answers.change_risk.type, 'score');
155
- assert.equal(result.answers.requires_approval.type, 'check');
156
- assert.ok(result.receipt?.why?.decisions?.length >= 6);
157
- });
158
-
159
- it('deterministic batch equals separate deterministic evaluations', async () => {
160
- const ids = ['terminal_lane', 'change_risk', 'requires_approval'];
161
- const batch = await evaluate({ state: baseState, questions: ids, receipt: false });
162
- for (const id of ids) {
163
- const solo = await evaluate({ state: baseState, questions: [id], receipt: false });
164
- assert.equal(solo.answers[id].value, batch.answers[id].value);
165
- assert.deepEqual(solo.answers[id].scores, batch.answers[id].scores);
166
- }
167
- });
168
-
169
- it('questions do not secretly consume previous answers', async () => {
170
- let seenSibling = false;
171
- const spy = {
172
- kind: 'deterministic',
173
- version: 'spy',
174
- supports: () => true,
175
- async evaluate(state, questions) {
176
- const answers = {};
177
- for (const q of questions) {
178
- // Prove evaluator only sees state — no answer bag passed in.
179
- assert.ok(state.schema);
180
- answers[q.id] = buildAnswer({
181
- type: 'check',
182
- question_id: q.id,
183
- value: false,
184
- support: 0.1,
185
- evaluator: { kind: 'deterministic', version: 'spy' },
186
- });
187
- }
188
- return { ok: true, answers, model_used: false };
189
- },
190
- };
191
- const result = await evaluate({
192
- state: baseState,
193
- questions: [
194
- defineCheck({ id: 'a', evaluator_hint: 'deterministic' }),
195
- defineCheck({ id: 'b', evaluator_hint: 'deterministic' }),
196
- ],
197
- evaluators: [spy],
198
- receipt: false,
199
- });
200
- assert.equal(seenSibling, false);
201
- assert.ok(result.answers.a);
202
- assert.ok(result.answers.b);
203
- });
204
- });
205
-
206
- describe('SAM evaluators', () => {
207
- it('prefers deterministic when facts are available', () => {
208
- const q = getRegisteredQuestion('terminal_lane');
209
- const ev = selectEvaluator(q);
210
- assert.equal(ev.kind, 'deterministic');
211
- });
212
-
213
- it('does not silently fall back to semantic', () => {
214
- const q = defineChoose({
215
- id: 'unknown_thing',
216
- options: ['a', 'b'],
217
- // no evaluator_hint — must not pick semantic
218
- });
219
- assert.throws(
220
- () => selectEvaluator(q, [SEMANTIC_EVALUATOR]),
221
- (err) => err.code === 'evaluator_unsupported',
222
- );
223
- assert.throws(
224
- () => selectEvaluator(q, [DETERMINISTIC_EVALUATOR, SEMANTIC_EVALUATOR]),
225
- (err) => err.code === 'evaluator_unsupported',
226
- );
227
- });
228
-
229
- it('unsupported evaluator fails clearly', async () => {
230
- await assert.rejects(
231
- () => evaluate({
232
- state: {},
233
- questions: [defineChoose({ id: 'nope', options: ['x'], evaluator_hint: 'deterministic' })],
234
- }),
235
- (err) => err.code === 'evaluator_unsupported' || err.code === 'evaluation_incomplete',
236
- );
237
- });
238
-
239
- it('semantic evaluator is not used as silent fallback and fails closed when unconfigured', async () => {
240
- await assert.rejects(
241
- () => evaluate({
242
- state: {},
243
- questions: [defineCheck({ id: 'semantic_only', evaluator_hint: 'semantic' })],
244
- }),
245
- (err) => err.code === 'evaluator_unavailable',
246
- );
247
- });
248
-
249
- it('semantic numbers are labeled estimates, not calibrated probabilities', async () => {
250
- const semantic = createSemanticEvaluator({
251
- complete: async () => ({ value: true, support: 0.87 }),
252
- });
253
- const result = await evaluate({
254
- state: {},
255
- questions: [defineCheck({ id: 'sem_check', evaluator_hint: 'semantic' })],
256
- evaluators: [semantic],
257
- receipt: false,
258
- });
259
- const a = result.answers.sem_check;
260
- assert.equal(a.support, 0.87);
261
- assert.equal(a.calibrated_probability, null);
262
- assert.ok(a.warnings.some((w) => /not_calibrated/.test(w)));
263
- });
264
- });
265
-
266
- describe('SAM confidence contract', () => {
267
- it('documents concentration as distribution shape, not P(correct)', () => {
268
- const concentrated = concentrationFromScores({ a: 10, b: 0.1, c: 0.1 });
269
- const uniform = concentrationFromScores({ a: 1, b: 1, c: 1 });
270
- assert.ok(concentrated > uniform);
271
- assert.ok(concentrated > 0.5);
272
- });
273
-
274
- it('probability distributions sum to 1 within tolerance', () => {
275
- const probs = softmax({ a: 1, b: 2, c: 3 });
276
- assert.equal(assertProbabilitiesSumToOne(probs), true);
277
- });
278
-
279
- it('score expected value is probability-weighted level position', () => {
280
- const levels = [{ index: 0 }, { index: 1 }, { index: 2 }];
281
- const value = expectedScore(levels, { 0: 0.2, 1: 0.5, 2: 0.3 });
282
- assert.ok(Math.abs(value - 1.1) < 1e-9);
283
- });
284
-
285
- it('calibrated_probability requires calibration_id', () => {
286
- assert.throws(
287
- () => buildAnswer({
288
- type: 'check',
289
- question_id: 'x',
290
- value: true,
291
- calibrated_probability: 0.9,
292
- }),
293
- (err) => err.code === 'calibration_required',
294
- );
295
- });
296
-
297
- it('maps probability_true without calibration to support with warning', () => {
298
- const a = buildAnswer({
299
- type: 'check',
300
- question_id: 'x',
301
- value: true,
302
- probability_true: 0.77,
303
- });
304
- assert.equal(a.support, 0.77);
305
- assert.ok(a.warnings.includes('probability_true_mapped_to_support_without_calibration'));
306
- });
307
- });
308
-
309
- describe('SAM policy owns permission', () => {
310
- it('policy overrides model confidence / low approval support', () => {
311
- const answers = {
312
- requires_approval: buildAnswer({
313
- type: 'check',
314
- question_id: 'requires_approval',
315
- value: false,
316
- support: 0.08,
317
- }),
318
- terminal_lane: buildAnswer({
319
- type: 'choose',
320
- question_id: 'terminal_lane',
321
- value: 'local',
322
- scores: { local: 5 },
323
- confidence_estimate: 0.99,
324
- }),
325
- };
326
- const policy = applyDecisionPolicy({
327
- answers,
328
- policy: { production_database_write: 'ALWAYS_REQUIRE_APPROVAL', confidence_grants_authority: true },
329
- state: { facts: { production_write: true } },
330
- });
331
- assert.equal(policy.require_approval, true);
332
- assert.equal(policy.authorization_source, 'policy');
333
- assert.ok(policy.notes.some((n) => /ignored_confidence/.test(n)));
334
- });
335
-
336
- it('composeUtility keeps weights in code', () => {
337
- const u = composeUtility(
338
- { goal_progress: 1, reversibility: 1, risk: 0.5, cost: 0.2, confidence: 0.8 },
339
- { goal_progress: 0.5, risk: 0.3 },
340
- );
341
- assert.ok(Number.isFinite(u));
342
- });
343
- });
344
-
345
- describe('SAM receipts + calibration', () => {
346
- it('receipt records evaluator and question versions', async () => {
347
- const result = await evaluate({
348
- state: { constraints: { requires_local_files: true }, runtime: { terminal_lanes: { local: true } } },
349
- questions: ['terminal_lane'],
350
- });
351
- assert.equal(result.receipt.schema, DECISION_RECEIPT_SCHEMA);
352
- assert.equal(result.receipt.question_versions.terminal_lane, 1);
353
- assert.ok(result.receipt.evaluators?.length || result.receipt.evaluator);
354
- assert.ok(result.receipt.why);
355
- });
356
-
357
- it('outcome can be appended', () => {
358
- const receipt = createDecisionReceipt({
359
- question_ids: ['requires_approval'],
360
- question_versions: { requires_approval: 1 },
361
- answers: {
362
- requires_approval: buildAnswer({
363
- type: 'check',
364
- question_id: 'requires_approval',
365
- value: true,
366
- support: 0.9,
367
- }),
368
- },
369
- evaluator: { kind: 'deterministic', version: '1' },
370
- });
371
- const withOutcome = appendOutcome(receipt, {
372
- success: true,
373
- human_corrected: false,
374
- verification: ['policy_ok'],
375
- });
376
- assert.equal(withOutcome.outcome.success, true);
377
- assert.equal(withOutcome.outcome.schema, 'agentsam.decision-outcome.v1');
378
- });
379
-
380
- it('calibration metrics have known fixture values', () => {
381
- // Perfect calibration: always predict 1 when y=1 and 0 when y=0
382
- const perfect = [
383
- { p: 1, y: 1 },
384
- { p: 0, y: 0 },
385
- { p: 1, y: 1 },
386
- { p: 0, y: 0 },
387
- ];
388
- assert.equal(brierScore(perfect), 0);
389
- assert.ok(logLoss(perfect) < 1e-10);
390
- assert.equal(expectedCalibrationError(perfect, 10).ece, 0);
391
-
392
- // Classic Brier: one miss at p=0.5 → (0.5-1)^2 = 0.25
393
- assert.equal(brierScore([{ p: 0.5, y: 1 }]), 0.25);
394
- });
395
- });
396
-
397
- describe('SAM dependent stages + hierarchical beam', () => {
398
- it('dependent-stage workflow requires explicit second state', async () => {
399
- await assert.rejects(
400
- () => evaluateDependentStages(
401
- { state: { facts: { 'choose.stage': 'x' } }, questions: [] },
402
- null,
403
- {},
404
- ),
405
- (err) => err.code === 'invalid_dependent_stage' || err.code === 'empty_batch',
406
- );
407
-
408
- const stage1 = await evaluateDependentStages(
409
- {
410
- state: {
411
- facts: { 'choose.pick': 'ast' },
412
- intent: 'symbol lookup',
413
- runtime: { terminal_lanes: { local: true } },
414
- },
415
- questions: ['retrieval_mode'],
416
- receipt: false,
417
- },
418
- async (first) => ({
419
- facts: { richer: true, 'choose.skill_candidate': 'mcp-oauth' },
420
- intent: { text: 'audit the OAuth migration' },
421
- skills: {
422
- 'mcp-oauth': { tags: ['oauth', 'mcp'] },
423
- security: { tags: ['security'] },
424
- },
425
- retrieval: first.answers.retrieval_mode.value,
426
- }),
427
- {
428
- questions: [
429
- getRegisteredQuestion('skill_candidate', {
430
- options: ['mcp-oauth', 'security', 'platform-context', 'deploy'],
431
- criteria: {
432
- 'mcp-oauth': { tags: ['oauth', 'mcp', 'migration'] },
433
- security: { tags: ['security'] },
434
- 'platform-context': { tags: ['platform'] },
435
- deploy: { tags: ['deploy'] },
436
- },
437
- }),
438
- ],
439
- receipt: false,
440
- },
441
- );
442
- assert.equal(stage1.stage1.answers.retrieval_mode.type, 'choose');
443
- assert.equal(stage1.stage2.answers.skill_candidate.value, 'mcp-oauth');
444
- });
445
-
446
- it('beam/hierarchical choice retains multiple paths when close', () => {
447
- const beam = beamRetain(
448
- [
449
- { id: 'a', score: 0.91 },
450
- { id: 'b', score: 0.90 },
451
- { id: 'c', score: 0.50 },
452
- ],
453
- { beamWidth: 3, closeMargin: 0.08 },
454
- );
455
- assert.deepEqual(beam.map((b) => b.id), ['a', 'b']);
456
-
457
- const hier = hierarchicalChoose({
458
- nodes: [
459
- { id: 'security', parent: null, score: 0.8 },
460
- { id: 'platform', parent: null, score: 0.79 },
461
- { id: 'oauth', parent: 'security', score: 0.9 },
462
- ],
463
- closeMargin: 0.05,
464
- beamWidth: 3,
465
- });
466
- assert.equal(hier.committed, false);
467
- assert.ok(hier.beam.includes('security'));
468
- assert.ok(hier.beam.includes('platform'));
469
- });
470
- });
471
-
472
- describe('SAM real use cases', () => {
473
- it('terminal lane: local files + healthy local → local', async () => {
474
- const result = await evaluate({
475
- state: {
476
- constraints: { requires_local_files: true },
477
- runtime: { terminal_lanes: { local: 'healthy', remote: 'healthy', sandbox: 'healthy' } },
478
- },
479
- questions: ['terminal_lane'],
480
- });
481
- assert.equal(result.answers.terminal_lane.value, 'local');
482
- assert.ok(!('probabilities' in result.answers.terminal_lane) || result.answers.terminal_lane.probabilities == null);
483
- });
484
-
485
- it('cross-cutting change fan-out', async () => {
486
- const result = await evaluate({
487
- state: {
488
- code: { affected_packages: ['a', 'b', 'c', 'd'] },
489
- facts: { security_boundary: true, auth_change: true, production_write: true },
490
- runtime: { terminal_lanes: { local: true, remote: true, sandbox: true } },
491
- constraints: { isolation_required: true },
492
- },
493
- questions: [
494
- 'change_risk',
495
- 'requires_approval',
496
- 'terminal_lane',
497
- 'security_review_required',
498
- 'verification_scope',
499
- ],
500
- policy: { production_database_write: 'ALWAYS_REQUIRE_APPROVAL' },
501
- });
502
- assert.ok(result.answers.change_risk.value >= 3);
503
- assert.equal(result.answers.requires_approval.value, true);
504
- assert.equal(result.answers.terminal_lane.value, 'sandbox');
505
- assert.equal(result.answers.security_review_required.value, true);
506
- assert.equal(result.policy_result.require_approval, true);
507
- });
508
-
509
- it('skill selection for OAuth migration', async () => {
510
- const result = await evaluate({
511
- state: {
512
- intent: { text: 'audit the OAuth migration for MCP routes' },
513
- facts: { intent_tags: ['oauth', 'mcp', 'migration'] },
514
- },
515
- questions: [
516
- getRegisteredQuestion('skill_candidate', {
517
- options: ['mcp-oauth', 'security', 'platform-context', 'deploy'],
518
- criteria: {
519
- 'mcp-oauth': { tags: ['oauth', 'mcp'], description: 'MCP OAuth flows' },
520
- security: { tags: ['security', 'audit'] },
521
- 'platform-context': { tags: ['platform'] },
522
- deploy: { tags: ['deploy'] },
523
- },
524
- }),
525
- ],
526
- });
527
- assert.equal(result.answers.skill_candidate.value, 'mcp-oauth');
528
- });
529
- });
530
-
531
- describe('SAM decision.evaluate operation', () => {
532
- it('is registered and invokable via AgentSamClient', async () => {
533
- clearSamRegistryForTests();
534
- resetSeedFlagForTests();
535
- ensureSeedOperations();
536
- const sam = new AgentSamClient({ autoSeed: true });
537
- const result = await sam.decision.evaluate({
538
- state: {
539
- constraints: { requires_local_files: true },
540
- runtime: { terminal_lanes: { local: true } },
541
- },
542
- questions: ['terminal_lane'],
543
- });
544
- assert.equal(result.ok, true);
545
- assert.equal(result.data.answers.terminal_lane.value, 'local');
546
- });
547
- });
548
-
549
- describe('SAM A*/GOAP remain green alongside decision', () => {
550
- it('A* still finds cheapest path', () => {
551
- const edges = {
552
- start: [
553
- { action: 'via_a', nextState: 'a', cost: 1 },
554
- { action: 'direct', nextState: 'goal', cost: 10 },
555
- ],
556
- a: [{ action: 'finish', nextState: 'goal', cost: 1 }],
557
- goal: [],
558
- };
559
- const result = planAStar({
560
- initialState: 'start',
561
- isGoal: (s) => s === 'goal',
562
- expand: (s) => edges[s] || [],
563
- stateKey: (s) => String(s),
564
- });
565
- assert.equal(result.total_cost, 2);
566
- });
567
-
568
- it('GOAP still plans', () => {
569
- const result = planGoap({
570
- initialState: { have: false },
571
- goal: { have: true },
572
- actions: [
573
- {
574
- id: 'get',
575
- cost: 1,
576
- preconditions: { have: false },
577
- effects: { have: true },
578
- },
579
- ],
580
- });
581
- assert.equal(result.ok, true);
582
- assert.ok(result.plan.length >= 1);
583
- });
584
- });
@@ -1,99 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { describe, it, before } from 'node:test';
3
- import {
4
- AgentSamClient,
5
- defineSamOperation,
6
- ensureSeedOperations,
7
- getSamOperation,
8
- listSamOperations,
9
- SAM_EXPANSION,
10
- SAM_RESULT_SCHEMA,
11
- } from '../../src/sam/index.js';
12
-
13
- describe('SAM kernel seed', () => {
14
- before(() => {
15
- ensureSeedOperations();
16
- });
17
-
18
- it('names Systematic Autonomous Machinery', () => {
19
- assert.equal(SAM_EXPANSION, 'Systematic Autonomous Machinery');
20
- assert.equal(SAM_RESULT_SCHEMA, 'agentsam.result.v1');
21
- });
22
-
23
- it('registers seed operations including planning', () => {
24
- const ids = listSamOperations().map((o) => o.id);
25
- for (const id of [
26
- 'repository.inspect',
27
- 'brand.scan',
28
- 'security.scan',
29
- 'terminal.exec',
30
- 'cad.blender.inspect',
31
- 'codebaseindex.ingest',
32
- 'planning.astar',
33
- 'planning.goap',
34
- ]) {
35
- assert.ok(ids.includes(id), `missing ${id}`);
36
- }
37
- assert.equal(getSamOperation('repository.inspect')?.execution.model, 'never');
38
- assert.equal(getSamOperation('planning.astar')?.execution.model, 'never');
39
- assert.equal(getSamOperation('codebaseindex.ingest')?.execution.model, 'optional');
40
- });
41
-
42
- it('defineSamOperation rejects incomplete defs', () => {
43
- assert.throws(() => defineSamOperation({ id: 'x.y', handler: () => {} }), /module and action/);
44
- });
45
-
46
- it('describe returns metadata without executing', async () => {
47
- const sam = new AgentSamClient();
48
- const info = await sam.describe('security.scan');
49
- assert.equal(info.ok, true);
50
- assert.equal(info.id, 'security.scan');
51
- assert.equal(info.execution.model, 'never');
52
- assert.equal(info.risk, 'read_only');
53
- });
54
-
55
- it('discover finds blender inspect by query', async () => {
56
- const sam = new AgentSamClient();
57
- const found = await sam.discover({ query: 'blender inspect' });
58
- assert.equal(found.ok, true);
59
- assert.ok(found.operations.some((c) => c.id === 'cad.blender.inspect'));
60
- });
61
-
62
- it('invoke repository.inspect returns SamResult envelope', async () => {
63
- const sam = new AgentSamClient({ cwd: process.cwd() });
64
- const result = await sam.invoke('repository.inspect', { root: process.cwd() });
65
- assert.equal(result.schema, SAM_RESULT_SCHEMA);
66
- assert.equal(result.operation, 'repository.inspect');
67
- assert.equal(result.ok, true);
68
- assert.ok(result.receipt?.id?.startsWith('samr_'));
69
- assert.equal(result.receipt.execution.model_used, false);
70
- assert.equal(result.receipt.execution.deterministic, true);
71
- assert.ok(result.data?.snapshot || result.data?.merkle_root);
72
- });
73
-
74
- it('domain projection matches invoke', async () => {
75
- const sam = new AgentSamClient();
76
- const viaModule = await sam.security.scan({ root: process.cwd(), offline: true });
77
- assert.equal(viaModule.ok, true);
78
- assert.equal(viaModule.operation, 'security.scan');
79
- assert.equal(viaModule.data?.scanner, 'agentsam-sca');
80
- });
81
-
82
- it('invoke unknown operation fails cleanly', async () => {
83
- const sam = new AgentSamClient();
84
- const result = await sam.invoke('no.such.op', {});
85
- assert.equal(result.ok, false);
86
- assert.equal(result.error?.code, 'sam_operation_not_found');
87
- });
88
-
89
- it('terminal.exec via invoke', async () => {
90
- const sam = new AgentSamClient();
91
- const result = await sam.invoke('terminal.exec', {
92
- command: 'node',
93
- args: ['-e', 'process.stdout.write("ok")'],
94
- cwd: process.cwd(),
95
- });
96
- assert.equal(result.ok, true);
97
- assert.match(String(result.data?.stdout || ''), /ok/);
98
- });
99
- });