@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -0,0 +1,202 @@
1
+ import {
2
+ GOAP_SCHEMAS,
3
+ normalizeActionSpec,
4
+ normalizeBlackboard,
5
+ normalizeGoal,
6
+ } from './contracts.js';
7
+ import { goapInputError } from './errors.js';
8
+
9
+ const TODO_TO_GOAL_STATUS = Object.freeze({
10
+ open: 'proposed',
11
+ running: 'active',
12
+ blocked: 'blocked',
13
+ complete: 'satisfied',
14
+ cancelled: 'cancelled',
15
+ });
16
+
17
+ const PRIORITY_COST = Object.freeze({
18
+ critical: 1,
19
+ high: 2,
20
+ medium: 3,
21
+ low: 4,
22
+ });
23
+
24
+ function clean(value) {
25
+ return value == null ? '' : String(value).trim();
26
+ }
27
+
28
+ function array(value) {
29
+ return Array.isArray(value) ? value : [];
30
+ }
31
+
32
+ function object(value) {
33
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
34
+ }
35
+
36
+ function taskById(plan) {
37
+ return new Map(array(plan?.tasks).map((task) => [task.id, task]));
38
+ }
39
+
40
+ function blockersFor(plan, task) {
41
+ const byId = taskById(plan);
42
+ return array(task?.metadata?.depends_on)
43
+ .map((id) => byId.get(id) || { id, title: null, status: 'missing' })
44
+ .filter((dependency) => dependency.status !== 'complete')
45
+ .map((dependency) => ({
46
+ id: dependency.id,
47
+ title: dependency.title || null,
48
+ status: dependency.status,
49
+ }));
50
+ }
51
+
52
+ export function projectPlanActions(plan = {}) {
53
+ const available = [];
54
+ const blocked = [];
55
+
56
+ for (const task of array(plan.tasks)) {
57
+ if (task.status !== 'open') continue;
58
+ const blockers = blockersFor(plan, task);
59
+ const action = {
60
+ id: task.id,
61
+ title: task.title,
62
+ status: task.status,
63
+ spec: normalizeActionSpec({
64
+ preconditions: array(task.metadata?.depends_on).map((todoId) => ({
65
+ fact: 'todo.complete',
66
+ todo_id: todoId,
67
+ value: true,
68
+ })),
69
+ effects: [{
70
+ fact: 'todo.complete',
71
+ todo_id: task.id,
72
+ value: true,
73
+ }],
74
+ cost: PRIORITY_COST[task.priority] ?? 3,
75
+ metadata: {
76
+ kind: task.metadata?.kind || 'work',
77
+ priority: task.priority || 'medium',
78
+ sort_order: Number(task.sort_order ?? 50),
79
+ },
80
+ }),
81
+ };
82
+
83
+ if (blockers.length) blocked.push({ ...action, blockers });
84
+ else available.push(action);
85
+ }
86
+
87
+ return { available, blocked };
88
+ }
89
+
90
+ export function projectGoapWorld({
91
+ repository = {},
92
+ plan,
93
+ activeTodo = null,
94
+ actions = null,
95
+ knowledge = {},
96
+ evidence = null,
97
+ accountId = null,
98
+ revision = 1,
99
+ updatedAt = null,
100
+ } = {}) {
101
+ const repositoryId = clean(repository.repository_id ?? repository.repositoryId);
102
+ if (!repositoryId) {
103
+ throw goapInputError('repository.repository_id is required for GOAP world projection', {
104
+ stage: 'project_world',
105
+ details: { field: 'repository.repository_id' },
106
+ });
107
+ }
108
+ if (!plan?.id) {
109
+ throw goapInputError('plan.id is required for GOAP world projection', {
110
+ stage: 'project_world',
111
+ details: { field: 'plan.id' },
112
+ });
113
+ }
114
+
115
+ const projectedActions = actions || projectPlanActions(plan);
116
+ const todo = activeTodo || null;
117
+ const goalId = todo?.id || plan.id;
118
+ const goalTitle = todo?.title || plan.title || plan.id;
119
+ const goalStatus = todo
120
+ ? (TODO_TO_GOAL_STATUS[todo.status] || 'proposed')
121
+ : (Number(plan.tasks_done || 0) === Number(plan.tasks_total || -1) ? 'satisfied' : 'active');
122
+
123
+ const state = {
124
+ plan: {
125
+ id: plan.id,
126
+ title: plan.title || null,
127
+ status: plan.status || null,
128
+ tasks_done: Number(plan.tasks_done || 0),
129
+ tasks_total: Number(plan.tasks_total || array(plan.tasks).length),
130
+ },
131
+ todo: todo ? {
132
+ id: todo.id,
133
+ title: todo.title || null,
134
+ status: todo.status || null,
135
+ priority: todo.priority || null,
136
+ kind: todo.metadata?.kind || 'work',
137
+ depends_on: array(todo.metadata?.depends_on),
138
+ acceptance: array(todo.metadata?.acceptance),
139
+ evidence: array(todo.metadata?.evidence),
140
+ } : null,
141
+ repository: {
142
+ repository_id: repositoryId,
143
+ branch: repository.branch || null,
144
+ revision_sha: repository.revision_sha || repository.revisionSha || null,
145
+ dirty: repository.dirty ?? null,
146
+ merkle_root: repository.merkle_root || null,
147
+ },
148
+ knowledge: { ...object(knowledge) },
149
+ actions: projectedActions,
150
+ evidence: evidence || null,
151
+ };
152
+
153
+ const blackboard = normalizeBlackboard({
154
+ id: 'world:' + repositoryId,
155
+ account_id: clean(accountId) || null,
156
+ repository_id: repositoryId,
157
+ current_goal_id: goalId,
158
+ state,
159
+ revision,
160
+ locked_by: 'project_local_plan',
161
+ checkpoint_sha: repository.revision_sha || repository.revisionSha || null,
162
+ last_action: 'world_snapshot_projected',
163
+ updated_at: updatedAt,
164
+ });
165
+
166
+ const goal = normalizeGoal({
167
+ id: goalId,
168
+ account_id: clean(accountId),
169
+ repository_id: repositoryId,
170
+ title: goalTitle,
171
+ goal_status: goalStatus,
172
+ priority: todo?.priority || null,
173
+ spec: {
174
+ desired: [{
175
+ fact: todo ? 'todo.complete' : 'plan.complete',
176
+ [todo ? 'todo_id' : 'plan_id']: goalId,
177
+ value: true,
178
+ }],
179
+ constraints: array(todo?.metadata?.depends_on).map((todoId) => ({
180
+ fact: 'todo.complete',
181
+ todo_id: todoId,
182
+ value: true,
183
+ })),
184
+ metadata: {
185
+ source: 'project_local_plan',
186
+ plan_id: plan.id,
187
+ todo_id: todo?.id || null,
188
+ },
189
+ },
190
+ updated_at: updatedAt,
191
+ });
192
+
193
+ return {
194
+ schema: GOAP_SCHEMAS.world,
195
+ source: 'project_local_plan',
196
+ repository_id: repositoryId,
197
+ blackboard,
198
+ goal,
199
+ actions: projectedActions,
200
+ evidence: evidence || null,
201
+ };
202
+ }
@@ -0,0 +1,245 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import {
5
+ AgentSamError,
6
+ ERROR_REASON,
7
+ planRecovery,
8
+ } from '@inneranimalmedia/agentsam-errors';
9
+ import {
10
+ GOAP_SCHEMAS,
11
+ MemoryGoapAdapter,
12
+ createD1SqliteGoapAdapter,
13
+ createGoapControlPlane,
14
+ goalStatusFromTicket,
15
+ ticketStatusFromGoal,
16
+ } from '../src/index.js';
17
+
18
+ const scope = {
19
+ account_id: 'acct_test',
20
+ repository_id: 'github:example/repo',
21
+ workspace_id: 'ws_test',
22
+ };
23
+
24
+ test('status mapping preserves database statuses while exposing logical GOAP states', () => {
25
+ assert.equal(goalStatusFromTicket('backlog'), 'proposed');
26
+ assert.equal(goalStatusFromTicket('in_review'), 'verifying');
27
+ assert.equal(ticketStatusFromGoal('satisfied'), 'shipped');
28
+ });
29
+
30
+ test('memory adapter atomically activates goal with CAS and append-only cursor', async () => {
31
+ const adapter = new MemoryGoapAdapter({
32
+ blackboards: [{
33
+ ...scope,
34
+ id: 'bb_1',
35
+ current_goal_id: null,
36
+ state: { build: { valid: false } },
37
+ revision: 4,
38
+ }],
39
+ goals: [{
40
+ ...scope,
41
+ id: 'tkt_1',
42
+ title: 'Make build valid',
43
+ status: 'backlog',
44
+ goal_spec_json: { desired: [{ fact: 'build.valid', op: 'eq', value: true }] },
45
+ }],
46
+ });
47
+
48
+ const service = createGoapControlPlane({ ports: adapter.ports(), clock: () => 100 });
49
+ const activated = await service.activateGoal({
50
+ scope,
51
+ goalId: 'tkt_1',
52
+ expectedRevision: 4,
53
+ actor: { type: 'test', id: 'runner' },
54
+ });
55
+
56
+ assert.equal(activated.blackboard.revision, 5);
57
+ assert.equal(activated.blackboard.current_goal_id, 'tkt_1');
58
+ assert.equal(activated.goal.status, 'active');
59
+ assert.equal(activated.events.length, 1);
60
+ assert.equal(activated.events[0].type, 'goal.activated');
61
+ assert.equal(activated.events[0].payload.blackboard_revision, 5);
62
+ assert.match(activated.events[0].cursor, /^memory:/);
63
+
64
+ await assert.rejects(
65
+ service.activateGoal({ scope, goalId: 'tkt_1', expectedRevision: 4 }),
66
+ (error) => {
67
+ assert.equal(error instanceof AgentSamError, true);
68
+ assert.equal(error.reason, ERROR_REASON.STALE_VERSION);
69
+ assert.equal(error.code, 'ABORTED');
70
+ assert.equal(error.envelope.tool, 'goap');
71
+ assert.equal(planRecovery(error.envelope).disposition, 'retry');
72
+ return true;
73
+ },
74
+ );
75
+ });
76
+
77
+ function d1Like(db) {
78
+ return {
79
+ prepare(sql) {
80
+ const statement = db.prepare(sql);
81
+ return {
82
+ bind(...values) {
83
+ return {
84
+ async first() {
85
+ return statement.get(...values) ?? null;
86
+ },
87
+ async all() {
88
+ return { results: statement.all(...values) };
89
+ },
90
+ async run() {
91
+ return statement.run(...values);
92
+ },
93
+ };
94
+ },
95
+ };
96
+ },
97
+ async batch(statements) {
98
+ db.exec('BEGIN IMMEDIATE');
99
+ try {
100
+ const results = [];
101
+ for (const statement of statements) results.push(await statement.run());
102
+ db.exec('COMMIT');
103
+ return results;
104
+ } catch (error) {
105
+ try { db.exec('ROLLBACK'); } catch {}
106
+ throw error;
107
+ }
108
+ },
109
+ };
110
+ }
111
+
112
+ function createSqlite({ eventOwnership = true } = {}) {
113
+ const sqlite = new DatabaseSync(':memory:');
114
+ const eventOwnershipColumns = eventOwnership ? 'account_id TEXT, repository_id TEXT,' : '';
115
+ sqlite.exec([
116
+ 'CREATE TABLE agentsam_workspace_state (',
117
+ 'id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, repository_id TEXT NOT NULL,',
118
+ 'current_task_id TEXT, state_json TEXT NOT NULL DEFAULT \'{}\',',
119
+ 'state_schema TEXT NOT NULL DEFAULT \'agentsam.blackboard.v1\',',
120
+ 'revision INTEGER NOT NULL DEFAULT 1, locked_by TEXT, lock_expires_at INTEGER,',
121
+ 'checkpoint_sha TEXT, last_agent_action TEXT, updated_at INTEGER NOT NULL);',
122
+ 'CREATE TABLE agentsam_tickets (',
123
+ 'id TEXT PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL, priority TEXT,',
124
+ 'account_id TEXT NOT NULL, repository_id TEXT NOT NULL, goal_schema TEXT,',
125
+ 'goal_spec_json TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);',
126
+ 'CREATE TABLE agentsam_ticket_events (',
127
+ 'id TEXT PRIMARY KEY, ticket_id TEXT NOT NULL, event_type TEXT NOT NULL, detail TEXT,',
128
+ 'created_at INTEGER NOT NULL, actor_type TEXT, actor_id TEXT, ' + eventOwnershipColumns,
129
+ 'payload_json TEXT NOT NULL DEFAULT \'{}\', workflow_run_id TEXT, execution_step_id TEXT,',
130
+ 'schema_version TEXT NOT NULL DEFAULT \'agentsam.event.v1\');',
131
+ ].join('\n'));
132
+ sqlite.prepare(
133
+ 'INSERT INTO agentsam_workspace_state ' +
134
+ '(id, workspace_id, repository_id, current_task_id, state_json, revision, updated_at) ' +
135
+ 'VALUES (?, ?, ?, NULL, \'{}\', 7, 1)',
136
+ ).run('bb_sql', scope.workspace_id, scope.repository_id);
137
+ sqlite.prepare(
138
+ 'INSERT INTO agentsam_tickets ' +
139
+ '(id, title, status, account_id, repository_id, goal_schema, goal_spec_json, created_at, updated_at) ' +
140
+ 'VALUES (?, ?, \'backlog\', ?, ?, ?, ?, 1, 1)',
141
+ ).run(
142
+ 'tkt_sql',
143
+ 'Ship portable GOAP',
144
+ scope.account_id,
145
+ scope.repository_id,
146
+ GOAP_SCHEMAS.goal,
147
+ JSON.stringify({ schema: GOAP_SCHEMAS.goal, desired: [] }),
148
+ );
149
+ return sqlite;
150
+ }
151
+
152
+
153
+ test('repository_join blackboard ownership rejects cross-account reads on shared stores', async () => {
154
+ const sqlite = createSqlite();
155
+ sqlite.exec(
156
+ 'CREATE TABLE code_repositories (id TEXT PRIMARY KEY, account_id TEXT NOT NULL);',
157
+ );
158
+ sqlite.prepare(
159
+ 'INSERT INTO code_repositories (id, account_id) VALUES (?, ?)',
160
+ ).run(scope.repository_id, scope.account_id);
161
+
162
+ const ports = createD1SqliteGoapAdapter({
163
+ db: d1Like(sqlite),
164
+ blackboardOwnership: 'repository_join',
165
+ });
166
+
167
+ const owned = await ports.blackboardStore.get(scope);
168
+ assert.equal(owned.repository_id, scope.repository_id);
169
+
170
+ const foreign = await ports.blackboardStore.get({
171
+ ...scope,
172
+ account_id: 'acct_other',
173
+ });
174
+ assert.equal(foreign, null);
175
+
176
+ sqlite.close();
177
+ });
178
+
179
+ test('D1/SQLite adapter atomically guards stale revisions with canonical AgentSam errors', async () => {
180
+ const sqlite = createSqlite();
181
+ const ports = createD1SqliteGoapAdapter({ db: d1Like(sqlite) });
182
+ const service = createGoapControlPlane({ ports, clock: () => 1234 });
183
+
184
+ await assert.rejects(
185
+ service.activateGoal({ scope, goalId: 'tkt_sql', expectedRevision: 6 }),
186
+ (error) => {
187
+ assert.equal(error instanceof AgentSamError, true);
188
+ assert.equal(error.reason, ERROR_REASON.STALE_VERSION);
189
+ assert.equal(error.envelope.domain, 'tool');
190
+ assert.equal(error.envelope.tool, 'goap');
191
+ return true;
192
+ },
193
+ );
194
+
195
+ assert.equal(sqlite.prepare('SELECT revision FROM agentsam_workspace_state').get().revision, 7);
196
+ assert.equal(sqlite.prepare('SELECT status FROM agentsam_tickets').get().status, 'backlog');
197
+ assert.equal(sqlite.prepare('SELECT COUNT(*) AS n FROM agentsam_ticket_events').get().n, 0);
198
+
199
+ const result = await service.activateGoal({
200
+ scope,
201
+ goalId: 'tkt_sql',
202
+ expectedRevision: 7,
203
+ actor: { type: 'test', id: 'sqlite' },
204
+ });
205
+
206
+ assert.equal(result.blackboard.revision, 8);
207
+ assert.equal(result.blackboard.current_goal_id, 'tkt_sql');
208
+ assert.equal(result.goal.status, 'active');
209
+ assert.equal(result.events[0].type, 'goal.activated');
210
+ assert.match(result.events[0].cursor, /^sqlite:/);
211
+
212
+ const eventRow = sqlite.prepare(
213
+ 'SELECT account_id, repository_id, payload_json, schema_version FROM agentsam_ticket_events LIMIT 1',
214
+ ).get();
215
+ assert.equal(eventRow.account_id, scope.account_id);
216
+ assert.equal(eventRow.repository_id, scope.repository_id);
217
+ assert.equal(eventRow.schema_version, GOAP_SCHEMAS.event);
218
+ assert.equal(JSON.parse(eventRow.payload_json).blackboard_revision, 8);
219
+
220
+ sqlite.close();
221
+ });
222
+
223
+ test('ticket_join event ownership supports the legacy platform event table', async () => {
224
+ const sqlite = createSqlite({ eventOwnership: false });
225
+ const ports = createD1SqliteGoapAdapter({
226
+ db: d1Like(sqlite),
227
+ eventOwnership: 'ticket_join',
228
+ cursorPrefix: 'd1',
229
+ });
230
+ const service = createGoapControlPlane({ ports, clock: () => 2000 });
231
+
232
+ const result = await service.activateGoal({
233
+ scope,
234
+ goalId: 'tkt_sql',
235
+ expectedRevision: 7,
236
+ });
237
+
238
+ assert.equal(result.blackboard.revision, 8);
239
+ assert.equal(result.goal.status, 'active');
240
+ assert.equal(result.events.length, 1);
241
+ assert.match(result.events[0].cursor, /^d1:/);
242
+ assert.equal(sqlite.prepare('SELECT COUNT(*) AS n FROM agentsam_ticket_events').get().n, 1);
243
+
244
+ sqlite.close();
245
+ });
@@ -0,0 +1,79 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { projectGoapWorld, projectPlanActions } from '../src/world.js';
4
+
5
+ const plan = {
6
+ id: 'plan_1',
7
+ title: 'Ship portable loop',
8
+ status: 'active',
9
+ tasks_done: 1,
10
+ tasks_total: 3,
11
+ tasks: [
12
+ {
13
+ id: 'todo_done',
14
+ title: 'Freeze contract',
15
+ status: 'complete',
16
+ priority: 'high',
17
+ sort_order: 10,
18
+ metadata: { kind: 'decision', depends_on: [] },
19
+ },
20
+ {
21
+ id: 'todo_active',
22
+ title: 'Project world',
23
+ status: 'running',
24
+ priority: 'critical',
25
+ sort_order: 20,
26
+ metadata: { kind: 'implement', depends_on: ['todo_done'], acceptance: [], evidence: [] },
27
+ },
28
+ {
29
+ id: 'todo_next',
30
+ title: 'Verify loop',
31
+ status: 'open',
32
+ priority: 'high',
33
+ sort_order: 30,
34
+ metadata: { kind: 'verify', depends_on: ['todo_active'] },
35
+ },
36
+ ],
37
+ };
38
+
39
+ test('projectPlanActions converts TODO dependencies into GOAP preconditions', () => {
40
+ const actions = projectPlanActions(plan);
41
+ assert.equal(actions.available.length, 0);
42
+ assert.equal(actions.blocked.length, 1);
43
+ assert.equal(actions.blocked[0].id, 'todo_next');
44
+ assert.equal(actions.blocked[0].blockers[0].id, 'todo_active');
45
+ assert.deepEqual(actions.blocked[0].spec.preconditions[0], {
46
+ fact: 'todo.complete',
47
+ todo_id: 'todo_active',
48
+ value: true,
49
+ });
50
+ });
51
+
52
+ test('projectGoapWorld emits canonical world, blackboard, goal, and action contracts', () => {
53
+ const world = projectGoapWorld({
54
+ repository: {
55
+ repository_id: 'github:example/repo',
56
+ branch: 'main',
57
+ revision_sha: 'abc123',
58
+ dirty: false,
59
+ merkle_root: 'sha256:merkle',
60
+ },
61
+ plan,
62
+ activeTodo: plan.tasks[1],
63
+ knowledge: { status: 'current', generation_id: 'gen_1' },
64
+ evidence: { primitive: 'repository.audit', chars: 900 },
65
+ revision: 7,
66
+ updatedAt: 123,
67
+ });
68
+
69
+ assert.equal(world.schema, 'agentsam.goap.world.v1');
70
+ assert.equal(world.blackboard.schema, 'agentsam.blackboard.v1');
71
+ assert.equal(world.blackboard.current_goal_id, 'todo_active');
72
+ assert.equal(world.blackboard.revision, 7);
73
+ assert.equal(world.blackboard.state.repository.merkle_root, 'sha256:merkle');
74
+ assert.equal(world.goal.schema, 'agentsam.goal.v1');
75
+ assert.equal(world.goal.id, 'todo_active');
76
+ assert.equal(world.goal.status, 'active');
77
+ assert.equal(world.goal.spec.desired[0].fact, 'todo.complete');
78
+ assert.equal(world.actions.blocked[0].id, 'todo_next');
79
+ });
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "@inneranimalmedia/agentsam-knowledge",
3
- "version": "0.1.0",
4
- "private": true,
3
+ "version": "2.6.7",
5
4
  "description": "Portable AutoRAG discovery, adapter registries, probes, and company routing contracts for AgentSam.",
6
5
  "type": "module",
7
6
  "exports": {
@@ -10,6 +9,21 @@
10
9
  "./providers": "./src/providers/index.js",
11
10
  "./backends": "./src/backends/index.js"
12
11
  },
13
- "scripts": { "test": "node --test test/*.test.mjs" },
14
- "engines": { "node": ">=22 <25" }
12
+ "scripts": {
13
+ "test": "node --test test/*.test.mjs"
14
+ },
15
+ "engines": {
16
+ "node": ">=22 <25"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/SamPrimeaux/agentsam-sdk.git",
24
+ "directory": "packages/agentsam-knowledge"
25
+ },
26
+ "files": [
27
+ "src"
28
+ ]
15
29
  }
@@ -6,6 +6,12 @@ import { createBackendRegistry } from '../backends/index.js';
6
6
 
7
7
  const clean = value => String(value || '').trim();
8
8
  const unique = values => [...new Set(values.filter(Boolean))];
9
+ function portableRepositoryIdentity(remote, root) {
10
+ const value = clean(remote);
11
+ const github = value.match(/^(?:git@github\.com:|https?:\/\/github\.com\/)([^/]+)\/([^/]+?)(?:\.git)?$/i);
12
+ if (github) return 'github:' + github[1].toLowerCase() + '/' + github[2].toLowerCase();
13
+ return value || 'local:' + path.basename(root);
14
+ }
9
15
  function git(root, args) { try { return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || null; } catch { return null; } }
10
16
  function findScopes(root) {
11
17
  const candidates = ['packages', 'src', 'services', 'apps', 'docs', 'README.md', 'schema', 'migrations'];
@@ -16,15 +22,16 @@ export async function discoverAutoRag({ root = process.cwd(), env = process.env,
16
22
  const providerRegistry = createProviderRegistry({ gemini: { apiKey: env.GEMINI_API_KEY, fetchImpl }, openai: { apiKey: env.OPENAI_API_KEY, fetchImpl }, ollama: { env, fetchImpl } });
17
23
  const providers = await providerRegistry.capabilities();
18
24
  const docker = git(root, ['--version']) && (() => { try { return Boolean(execFileSync('docker', ['--version'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] })); } catch { return false; } })();
19
- const repositoryId = git(root, ['config', '--get', 'remote.origin.url']) || `local:${path.basename(root)}`;
25
+ const repositoryId = portableRepositoryIdentity(git(root, ['config', '--get', 'remote.origin.url']), root);
20
26
  return Object.freeze({
21
27
  repository: { root, name: path.basename(root), identity: repositoryId, branch: git(root, ['branch', '--show-current']), revision: git(root, ['rev-parse', 'HEAD']), git: isGit, merkle: fs.existsSync(path.join(root, '.agentsam', 'merkle.json')), semantic_merkle: fs.existsSync(path.join(root, '.agentsam', 'merkle.json')) },
22
28
  scopes: findScopes(root),
23
- capabilities: { sqlite: true, git: isGit, merkle: isGit, structural_indexing: true, local_knowledge_engine: true, repository_intelligence: fs.existsSync(path.join(root, 'packages', 'agentsam-repository')), docker, providers, backends: createBackendRegistry().capabilities(), company_graph: Boolean(companyAdapter?.discover) ? await companyAdapter.discover() : { available: false } },
29
+ capabilities: { sqlite: true, git: isGit, merkle: isGit, structural_indexing: true, local_knowledge_engine: true, repository_intelligence: true, docker, providers, backends: createBackendRegistry().capabilities(), company_graph: Boolean(companyAdapter?.discover) ? await companyAdapter.discover() : { available: false } },
24
30
  });
25
31
  }
26
32
  export function recommendAutoRag({ discovery, purpose = 'code', include, provider = 'none', backend = 'local_exact', semantic = false } = {}) {
27
- const scopes = include?.length ? unique(include) : purpose === 'code' ? discovery.scopes.filter(scope => ['packages', 'src'].includes(scope)).slice(0, 2) : discovery.scopes.filter(scope => /^(docs|README\.md|schema|migrations)$/.test(scope)).slice(0, 3);
33
+ const codeRoots = ['apps', 'src', 'packages', 'services'];
34
+ const scopes = include?.length ? unique(include) : purpose === 'code' ? codeRoots.filter(scope => discovery.scopes.includes(scope)).slice(0, 3) : discovery.scopes.filter(scope => /^(docs|README\.md|schema|migrations)$/.test(scope)).slice(0, 3);
28
35
  return Object.freeze({ purpose, repositories: [discovery.repository.identity], scope: scopes.length ? scopes : ['.'], evidence: purpose === 'code' ? ['git', 'merkle', 'semantic-metadata', 'ast', 'lexical'] : ['git', 'merkle', 'lexical'], embedding: semantic ? provider : 'none', control_plane: 'local_sqlite', backend, probe: { max_files: 25, max_chunks: 100, max_semantic_queries: 1, paid_embeddings: false }, company_registration: 'disabled' });
29
36
  }
30
37
  export function safeAutoRagConfig({ existing = {}, recommendation, repositoryId, projectKey } = {}) {
@@ -1,8 +1,40 @@
1
+ import { vectorizeDelete, vectorizeGetByIds, vectorizeHealth, vectorizeQuery, vectorizeUpsert } from '../../../connectors/cloudflare/src/families/vectorize.js';
2
+
1
3
  const clean = value => String(value || '').trim();
2
4
  function profileGuard(profile, supported) {
3
5
  if (!supported.includes(profile?.backend)) throw new Error(`backend_profile_mismatch:${profile?.backend}`);
4
6
  if (!Number.isInteger(profile?.dimensions) || profile.dimensions < 1) throw new Error('backend_dimensions_required');
5
7
  }
8
+ function vectorizeBackend() {
9
+ const id = 'cloudflare_vectorize';
10
+ const resource = context => ({ binding: clean(context?.binding || context?.profile?.binding), index: clean(context?.index || context?.profile?.index) });
11
+ return Object.freeze({
12
+ id,
13
+ capabilities: () => ({ id, explicit_resource_required: true, supported: true, transports: ['worker_binding', 'cloudflare_api'] }),
14
+ prepare(profile, context = {}) {
15
+ profileGuard(profile, [id]);
16
+ const target = { binding: clean(context.binding || profile.binding), index: clean(context.index || profile.index) };
17
+ if (!target.binding) throw new Error('backend_cloudflare_vectorize_binding_required');
18
+ if (!target.index) throw new Error('backend_cloudflare_vectorize_index_required');
19
+ return { id, dimensions: profile.dimensions, ...target };
20
+ },
21
+ async upsert(records, context = {}) { return vectorizeUpsert({ ...resource(context), records, context }); },
22
+ async delete(ids, context = {}) { return vectorizeDelete({ ...resource(context), ids, context }); },
23
+ async query(vector, options = {}, context = {}) { return vectorizeQuery({ ...resource(context), vector, options, context }); },
24
+ async verify(ids, context = {}) {
25
+ const receipt = await vectorizeGetByIds({ ...resource(context), ids, context });
26
+ const rows = Array.isArray(receipt.result) ? receipt.result : null;
27
+ return { verified: rows ? rows.length === ids.length : true, transport: receipt.transport, result: receipt.result };
28
+ },
29
+ async health(context = {}) {
30
+ const target = resource(context);
31
+ if (!target.binding || !target.index) return { id, operational: false, error: 'binding_and_index_required' };
32
+ const health = await vectorizeHealth({ ...target, context });
33
+ return { id, ...health };
34
+ },
35
+ });
36
+ }
37
+
6
38
  function bindingBackend(id, required) {
7
39
  return Object.freeze({
8
40
  id, capabilities: () => ({ id, explicit_resource_required: true, supported: true }),
@@ -21,6 +53,6 @@ export function createBackendRegistry() {
21
53
  async upsert(records, context = {}) { if (!context.store?.cachePut) throw new Error('backend_runtime_unavailable:local_exact'); for (const record of records) await context.store.cachePut(record.id, record.vector); return { upserted: records.length }; },
22
54
  async delete() { return { deleted: 0 }; }, async query() { throw new Error('backend_query_owned_by_knowledge_store'); }, async verify() { return { verified: true }; }, health: async () => ({ id: 'local_exact', operational: true }),
23
55
  });
24
- const adapters = new Map([['local_exact', local], ['postgres_pgvector', bindingBackend('postgres_pgvector', ['resource'])], ['supabase_pgvector', bindingBackend('supabase_pgvector', ['resource'])], ['cloudflare_vectorize', bindingBackend('cloudflare_vectorize', ['binding', 'index'])]]);
56
+ const adapters = new Map([['local_exact', local], ['postgres_pgvector', bindingBackend('postgres_pgvector', ['resource'])], ['supabase_pgvector', bindingBackend('supabase_pgvector', ['resource'])], ['cloudflare_vectorize', vectorizeBackend()]]);
25
57
  return Object.freeze({ ids: () => [...adapters.keys()], get(id) { const item = adapters.get(clean(id)); if (!item) throw new Error(`backend_unsupported:${id}`); return item; }, capabilities: () => [...adapters.values()].map(adapter => adapter.capabilities()) });
26
58
  }