@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
@@ -18,11 +18,39 @@ import {
18
18
  RUNTIME_PROFILES,
19
19
  } from '../lib/setup/runtime.js';
20
20
  import { runRuntime } from './runtime.js';
21
+ import { getCliCommand } from '../cli/command-catalog.js';
21
22
 
22
23
  function writeLine(write, value = '') {
23
24
  write(`${value}\n`);
24
25
  }
25
26
 
27
+ function catalogCommand(id, args = '') {
28
+ const entry = getCliCommand(id);
29
+ if (!entry) throw new Error(`setup_next_command_not_catalogued: ${id}`);
30
+ return `agentsam ${entry.id}${args ? ` ${args}` : ''}`;
31
+ }
32
+
33
+ export function setupNextCommands(capabilityIds = []) {
34
+ const commands = [
35
+ catalogCommand('status'),
36
+ catalogCommand('capabilities'),
37
+ catalogCommand('google-cloud', 'doctor'),
38
+ ];
39
+ if (capabilityIds.includes('google.cloud')) {
40
+ commands.push(catalogCommand('setup', 'google.cloud --inventory'));
41
+ }
42
+ if (capabilityIds.includes('image.vectorize')) {
43
+ commands.push(catalogCommand('capabilities', 'image.vectorize'));
44
+ }
45
+ return [...new Set(commands)];
46
+ }
47
+
48
+ function writeSetupNext(write, capabilityIds = []) {
49
+ writeLine(write, ' Next');
50
+ for (const command of setupNextCommands(capabilityIds)) writeLine(write, ` ${command}`);
51
+ writeLine(write, '');
52
+ }
53
+
26
54
  function printHelp(write) {
27
55
  writeLine(write, '');
28
56
  writeLine(write, ' Agent Sam · setup');
@@ -220,9 +248,9 @@ export async function runSetup(argv = [], options = {}) {
220
248
  }
221
249
  writeLine(write, '');
222
250
  writeLine(write, ' Next');
223
- writeLine(write, ' agentsam gcloud auth login');
224
- writeLine(write, ' agentsam google-cloud connection set --identity EMAIL --project PROJECT');
225
- writeLine(write, ' agentsam google-cloud doctor');
251
+ writeLine(write, ` ${catalogCommand('google-cloud', 'auth login')}`);
252
+ writeLine(write, ` ${catalogCommand('google-cloud', 'connection set --identity EMAIL --project PROJECT')}`);
253
+ writeLine(write, ` ${catalogCommand('google-cloud', 'doctor')}`);
226
254
  writeLine(write, '');
227
255
  }
228
256
  return inv.errors?.length ? 2 : 0;
@@ -243,8 +271,7 @@ export async function runSetup(argv = [], options = {}) {
243
271
  if (dryRun || !plan.would_install.length) {
244
272
  if (!plan.would_install.length) {
245
273
  writeLine(write, ' ✓ setup complete — requested capabilities already satisfied');
246
- writeLine(write, ' Next: agentsam doctor · agentsam capabilities · agentsam google-cloud doctor');
247
- writeLine(write, '');
274
+ writeSetupNext(write, capabilityIds);
248
275
  }
249
276
  if (json) write(JSON.stringify({ environment, plan, executed: false }, null, 2) + '\n');
250
277
  return 0;
@@ -262,17 +289,7 @@ export async function runSetup(argv = [], options = {}) {
262
289
  writeLine(write, receipt.ok ? ' ✓ Agent Sam setup complete' : ' ✕ Setup finished with failures');
263
290
  writeLine(write, ` Receipt ${receipt.path}`);
264
291
  writeLine(write, '');
265
- writeLine(write, ' Next');
266
- writeLine(write, ' agentsam doctor');
267
- writeLine(write, ' agentsam capabilities');
268
- if (capabilityIds.includes('google.cloud')) {
269
- writeLine(write, ' agentsam setup google.cloud --inventory');
270
- writeLine(write, ' agentsam gcloud auth login');
271
- }
272
- if (capabilityIds.includes('image.vectorize')) {
273
- writeLine(write, ' agentsam image optimize ./logo.png # when image command ships');
274
- }
275
- writeLine(write, '');
292
+ writeSetupNext(write, capabilityIds);
276
293
 
277
294
  if (json) write(JSON.stringify({ environment, plan, receipt }, null, 2) + '\n');
278
295
  return receipt.ok ? 0 : 2;
@@ -49,25 +49,86 @@ function looksLikeNpmPackage(source) {
49
49
  * Download an npm package tarball and return the extracted package root
50
50
  * that contains agentsam.skill.json (or package root for relative resolve).
51
51
  */
52
+
53
+ function buildNpmPackEnv(baseEnv = process.env) {
54
+ const env = { ...baseEnv };
55
+
56
+ // resolveNpmSkillPackage requires a physical tarball.
57
+ // Parent npm lifecycle flags such as `npm publish --dry-run`
58
+ // must not change the semantics of this nested npm invocation.
59
+ for (const key of Object.keys(env)) {
60
+ if (/^npm_config_dry[_-]?run$/i.test(key)) {
61
+ delete env[key];
62
+ }
63
+ }
64
+
65
+ return env;
66
+ }
67
+
52
68
  export function resolveNpmSkillPackage(spec, options = {}) {
53
69
  const spawn = options.spawnSyncImpl || spawnSync;
54
- const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-skill-npm-'));
55
- const pack = spawn('npm', ['pack', spec, '--pack-destination', tmp], {
56
- encoding: 'utf8',
57
- cwd: options.cwd || process.cwd(),
58
- env: options.env || process.env,
59
- });
60
- if ((pack.status ?? 1) !== 0) {
61
- throw new Error(`npm_pack_failed:${spec}:${String(pack.stderr || pack.stdout || '').trim() || 'unknown'}`);
62
- }
63
- const tgzName = String(pack.stdout || '')
64
- .trim()
65
- .split(/\r?\n/)
66
- .filter(Boolean)
67
- .pop();
68
- if (!tgzName) throw new Error(`npm_pack_empty:${spec}`);
69
- const tgzPath = path.join(tmp, path.basename(tgzName));
70
- if (!fs.existsSync(tgzPath)) throw new Error(`npm_pack_missing:${tgzPath}`);
70
+ const maxPackAttempts = 2;
71
+
72
+ let tmp = null;
73
+ let tgzPath = null;
74
+ let lastExpectedPath = null;
75
+
76
+ for (let attempt = 1; attempt <= maxPackAttempts; attempt += 1) {
77
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-skill-npm-'));
78
+
79
+ const pack = spawn('npm', ['pack', spec, '--json', '--pack-destination', tmp], {
80
+ encoding: 'utf8',
81
+ cwd: options.cwd || process.cwd(),
82
+ env: buildNpmPackEnv(options.env || process.env),
83
+ });
84
+
85
+ if ((pack.status ?? 1) !== 0) {
86
+ throw new Error(
87
+ `npm_pack_failed:${spec}:${String(pack.stderr || pack.stdout || '').trim() || 'unknown'}`,
88
+ );
89
+ }
90
+
91
+ let tgzName = null;
92
+
93
+ try {
94
+ const payload = JSON.parse(String(pack.stdout || ''));
95
+ const entry = Array.isArray(payload) ? payload[0] : payload;
96
+ if (entry?.filename) tgzName = path.basename(String(entry.filename));
97
+ } catch {
98
+ // Fall through to filesystem discovery.
99
+ }
100
+
101
+ const packed = fs.readdirSync(tmp)
102
+ .filter((name) => name.endsWith('.tgz'))
103
+ .sort();
104
+
105
+ if (!tgzName && packed.length === 1) {
106
+ tgzName = packed[0];
107
+ }
108
+
109
+ if (tgzName) {
110
+ const expected = path.join(tmp, tgzName);
111
+ lastExpectedPath = expected;
112
+
113
+ if (fs.existsSync(expected)) {
114
+ tgzPath = expected;
115
+ break;
116
+ }
117
+ }
118
+
119
+ // npm occasionally reports success before producing no artifact.
120
+ // Treat only that narrow condition as transient and retry once.
121
+ if (attempt < maxPackAttempts) {
122
+ fs.rmSync(tmp, { recursive: true, force: true });
123
+ tmp = null;
124
+ }
125
+ }
126
+
127
+ if (!tmp || !tgzPath || !fs.existsSync(tgzPath)) {
128
+ throw new Error(
129
+ `npm_pack_missing:${lastExpectedPath || spec}:attempts=${maxPackAttempts}`,
130
+ );
131
+ }
71
132
 
72
133
  const extractDir = path.join(tmp, 'pkg');
73
134
  fs.mkdirSync(extractDir, { recursive: true });
@@ -4,6 +4,7 @@ import { buildStatusActionPlan } from '../status/actions.js';
4
4
  import { openExternalUrl } from '../lib/open-url.js';
5
5
  import readline from 'node:readline/promises';
6
6
  import { stdin as input, stdout as output } from 'node:process';
7
+ import { renderCommandHelp } from '../ui/cli/help.js';
7
8
 
8
9
  function parseStatusArgs(argv = []) {
9
10
  const opts = {
@@ -11,12 +12,14 @@ function parseStatusArgs(argv = []) {
11
12
  offline: false,
12
13
  discoverModels: true,
13
14
  interactive: false,
15
+ help: false,
14
16
  };
15
17
  for (const arg of argv) {
16
18
  if (arg === '--json') opts.json = true;
17
19
  else if (arg === '--offline') opts.offline = true;
18
20
  else if (arg === '--no-discover') opts.discoverModels = false;
19
21
  else if (arg === '--interactive' || arg === '-i') opts.interactive = true;
22
+ else if (arg === '--help' || arg === '-h') opts.help = true;
20
23
  else throw new Error(`unknown status option: ${arg}`);
21
24
  }
22
25
  return opts;
@@ -68,13 +71,17 @@ async function runInteractiveMenu(status, write) {
68
71
 
69
72
  export async function runStatus(argv = [], opts = {}) {
70
73
  const parsed = parseStatusArgs(argv);
74
+ const write = opts.write || ((value) => process.stdout.write(value));
75
+ if (parsed.help) {
76
+ write(renderCommandHelp('status'));
77
+ return null;
78
+ }
71
79
  const status = await (opts.collectRuntime || collectRuntimeStatus)({
72
80
  ...opts,
73
81
  cwd: opts.cwd || process.cwd(),
74
82
  offline: parsed.offline,
75
83
  discoverModels: parsed.discoverModels,
76
84
  });
77
- const write = opts.write || ((value) => process.stdout.write(value));
78
85
  if (parsed.json) {
79
86
  const plan = buildStatusActionPlan(status);
80
87
  write(`${JSON.stringify({ ...status, next: plan }, null, 2)}\n`);
@@ -39,6 +39,7 @@ export function normalizeProviderTemplateId(id) {
39
39
  if (!key) return '';
40
40
  if (key === 'iam') return 'inneranimalmedia';
41
41
  if (key === 'google-desktop') return 'google_desktop';
42
+ if (key === 'openai' || key === 'chatgpt-hosted' || key === 'chatgpt_hosted') return 'chatgpt';
42
43
  return key;
43
44
  }
44
45
 
@@ -59,7 +59,7 @@ export async function planIndex({ root, config: input, store, embed = false, lim
59
59
  limits: Number.isFinite(maxFiles) || Number.isFinite(maxChunks) ? { max_files: maxFiles, max_chunks: maxChunks } : null } };
60
60
  }
61
61
 
62
- export async function runIndex({ root, config, store, embedder, embed = false, maxInputs = 100, maxCharacters = 200000, limits = null }) {
62
+ export async function runIndex({ root, config, store, embedder, embed = false, vectorBackend = null, vectorContext = {}, maxInputs = 100, maxCharacters = 200000, limits = null }) {
63
63
  if (!store) throw new Error('A writable knowledge store is required.');
64
64
  if (!Number.isInteger(maxInputs) || maxInputs < 0 || !Number.isInteger(maxCharacters) || maxCharacters < 0) throw new Error('Embedding budgets must be nonnegative integers.');
65
65
  const plan = await planIndex({ root, config, store, embed, limits });
@@ -76,6 +76,25 @@ export async function runIndex({ root, config, store, embedder, embed = false, m
76
76
  // Completed work remains reusable even if a later request or publication fails.
77
77
  await store.cachePut(key, vector);
78
78
  }
79
+ let vectorUpsert = null;
80
+ if (embed && plan.config.lane?.backend === 'cloudflare_vectorize') {
81
+ if (!vectorBackend?.upsert) throw new Error('cloudflare_vectorize_backend_required');
82
+ const records = [];
83
+ for (const chunk of plan.chunks) {
84
+ const vector = validateVector(await store.cacheGet(chunk.embedding_key), plan.config.embedding.dimensions);
85
+ records.push({
86
+ id: chunk.id,
87
+ vector,
88
+ metadata: { path: chunk.path, ordinal: chunk.ordinal, content_hash: chunk.content_hash },
89
+ });
90
+ }
91
+ vectorUpsert = await vectorBackend.upsert(records, {
92
+ ...vectorContext,
93
+ binding: plan.config.lane.binding,
94
+ index: plan.config.lane.index,
95
+ profile: { ...plan.config.lane, dimensions: plan.config.embedding.dimensions },
96
+ });
97
+ }
79
98
  // A generation describes one coherent source snapshot. Never publish after a mid-run edit.
80
99
  const check = [];
81
100
  const checkFiles = inventory(root, plan.config.scope).slice(0, limits?.maxFiles == null ? Infinity : limits.maxFiles);
@@ -85,7 +104,7 @@ export async function runIndex({ root, config, store, embedder, embed = false, m
85
104
  source_hash: receipt.source_hash, config_hash: receipt.config_hash, config: plan.config, profile_id: receipt.profile_id,
86
105
  git: gitEvidence(root), files: plan.files, chunks: plan.chunks, symbols: plan.symbols, edges: plan.edges, receipt };
87
106
  await store.publish(generation, plan.previous?.id || null);
88
- return { ...receipt, generation_id: generation.id, published: true };
107
+ return { ...receipt, generation_id: generation.id, published: true, vector_upsert: vectorUpsert };
89
108
  }
90
109
 
91
110
  export async function retrieve({ store, config: input, text, semantic = false, embedder, topK = 8, tokenBudget = 6000, generationId, resultPolicy: requestedResultPolicy }) {
@@ -0,0 +1,127 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readCloudflareDeploymentContract } from '../cloudflare/runtime-status.js';
4
+ import { getRepositoryId, portableRepositoryIdFromGit, tryReadProjectConfig } from '../lib/project-config.js';
5
+ import { resolveProviderCredential } from '../lib/provider-credentials.js';
6
+ import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
7
+
8
+ export const PROJECT_CONTEXT_SCHEMA = 'agentsam.project-context.v1';
9
+ const clean = value => value == null ? '' : String(value).trim();
10
+ const localIndexPath = root => path.join(root, '.agentsam', 'knowledge', 'index.sqlite');
11
+ function readJson(filename) { try { return JSON.parse(fs.readFileSync(filename, 'utf8')); } catch { return null; } }
12
+ function executionState({ observed = false, selected = false, local = false, remote = false, conflicting = false, source = null, reason = null } = {}) {
13
+ return { observed: Boolean(observed), explicitly_selected: Boolean(selected), locally_executable: Boolean(local), remotely_executable: Boolean(remote), missing: !observed, conflicting: Boolean(conflicting), source: source || null, reason: reason || null };
14
+ }
15
+ function cloudflareCredentialState(env) {
16
+ try {
17
+ const credential = resolveProviderCredential('cloudflare', { env });
18
+ const configured = Boolean(credential?.configured);
19
+ const accountResolved = Boolean(clean(credential?.account_id));
20
+ return { configured, account_resolved: accountResolved, executable: configured && accountResolved, source: credential?.source || null, error: credential?.error || (!configured ? 'cloudflare_authorization_required' : !accountResolved ? 'cloudflare_account_id_required' : null) };
21
+ } catch (error) {
22
+ return { configured: false, account_resolved: false, executable: false, source: null, error: error?.message || String(error) };
23
+ }
24
+ }
25
+ function policyConflict(policy, vectorize) {
26
+ if (policy?.lane?.backend !== 'cloudflare_vectorize') return [];
27
+ const binding = clean(policy.lane.binding), index = clean(policy.lane.index);
28
+ if (vectorize.some(row => row.binding === binding && row.index === index)) return [];
29
+ return [{ kind: 'knowledge_deployment_drift', backend: 'cloudflare_vectorize', policy: { binding: binding || null, index: index || null }, observed: vectorize.map(row => ({ binding: row.binding, index: row.index })), detail: 'Knowledge policy selects a Vectorize binding/index that is not declared by the active Wrangler deployment contract.' }];
30
+ }
31
+
32
+ export function discoverProjectContext(root = process.cwd(), options = {}) {
33
+ const resolvedRoot = fs.realpathSync(path.resolve(root));
34
+ const env = options.env || process.env;
35
+ const policy = options.knowledgeConfig || null;
36
+ const projectConfig = options.projectConfig || tryReadProjectConfig(resolvedRoot);
37
+ const git = tryResolveGitContext({ cwd: resolvedRoot });
38
+ const repositoryId = getRepositoryId(projectConfig) || portableRepositoryIdFromGit(resolvedRoot) || `local:${path.basename(resolvedRoot)}`;
39
+ const hostInstallPath = path.join(resolvedRoot, '.agentsam', 'app.json');
40
+ const hostInstall = fs.existsSync(hostInstallPath) ? readJson(hostInstallPath) : null;
41
+ const productManifestPath = path.join(resolvedRoot, 'agentsam.app.json');
42
+ const productManifest = fs.existsSync(productManifestPath) ? readJson(productManifestPath) : null;
43
+ let contract = null, contractError = null;
44
+ try { contract = readCloudflareDeploymentContract(resolvedRoot, projectConfig || {}); } catch (error) { contractError = error?.message || String(error); }
45
+ const bindings = contract?.bindings || [];
46
+ const ai = bindings.find(row => row.type === 'ai') || null;
47
+ const vectorize = bindings.filter(row => row.type === 'vectorize').map(row => ({ binding: row.name, index: row.index_name || null, source: row.source || 'wrangler_config' }));
48
+ const d1 = bindings.filter(row => row.type === 'd1');
49
+ const r2 = bindings.filter(row => row.type === 'r2_bucket');
50
+ const credential = cloudflareCredentialState(env);
51
+ const remoteConfigured = Boolean(contract?.configured);
52
+ const conflicts = policyConflict(policy, vectorize);
53
+ const indexPath = localIndexPath(resolvedRoot);
54
+ const localIndex = { exists: fs.existsSync(indexPath), path: path.relative(resolvedRoot, indexPath) };
55
+ const policyBinding = clean(policy?.lane?.binding), policyIndex = clean(policy?.lane?.index);
56
+ const vectorizeResources = vectorize.map(row => {
57
+ const selected = policy?.lane?.backend === 'cloudflare_vectorize' && row.binding === policyBinding && row.index === policyIndex;
58
+ return {
59
+ ...row,
60
+ configured: Boolean(row.binding && row.index),
61
+ ...executionState({
62
+ observed: Boolean(row.binding && row.index), selected,
63
+ local: Boolean(row.binding && row.index && credential.executable),
64
+ remote: Boolean(row.binding && row.index && remoteConfigured),
65
+ conflicting: conflicts.length > 0 && !selected,
66
+ source: row.source,
67
+ reason: credential.executable ? null : 'Local CLI/Desktop Vectorize execution requires the current user Cloudflare authorization and account id.',
68
+ }),
69
+ };
70
+ });
71
+ const workersAi = ai ? {
72
+ binding: ai.name, configured: true, credential_state: credential,
73
+ ...executionState({ observed: true, selected: policy?.embedding?.provider === 'workers-ai', local: false, remote: remoteConfigured, source: ai.source || 'wrangler_config', reason: 'Workers AI binding is executable in the configured Worker runtime; a local Node process does not possess env.<AI_BINDING>.' }),
74
+ } : {
75
+ binding: null, configured: false, credential_state: credential,
76
+ ...executionState({ observed: false, source: contract?.config || null, reason: 'No Workers AI binding declared.' }),
77
+ };
78
+ const mapBoundResource = row => ({
79
+ binding: row.name,
80
+ name: row.database_name || row.bucket_name || null,
81
+ id: row.database_id || null,
82
+ ...executionState({ observed: true, local: false, remote: remoteConfigured, source: row.source || 'wrangler_config', reason: 'This receipt describes runtime binding execution; local provider API execution is a separate authorized transport.' }),
83
+ });
84
+ const lanes = [];
85
+ if (localIndex.exists) lanes.push({ id: 'local-index', backend: 'local_exact', source: 'local_index', configured: true, locally_executable: true, remotely_executable: false });
86
+ for (const row of vectorizeResources) lanes.push({ id: `cloudflare-vectorize:${row.binding}`, backend: 'cloudflare_vectorize', binding: row.binding, index: row.index, source: row.source, configured: row.configured, locally_executable: row.locally_executable, remotely_executable: row.remotely_executable, explicitly_selected: row.explicitly_selected, conflicting: row.conflicting });
87
+
88
+ return {
89
+ schema: PROJECT_CONTEXT_SCHEMA,
90
+ version: 1,
91
+ repository: { root: resolvedRoot, identity: repositoryId, branch: git?.branch || null, revision: git?.revisionSha || null, dirty: git?.dirty ?? null, source: git ? 'git' : projectConfig ? '.agentsam/config.json' : 'filesystem' },
92
+ project: {
93
+ config_present: Boolean(projectConfig), config_source: projectConfig ? '.agentsam/config.json' : null,
94
+ product_manifest: productManifest ? { id: clean(productManifest.id) || null, source: 'agentsam.app.json' } : null,
95
+ host_install: hostInstall ? { app_id: clean(hostInstall.app_id || hostInstall.id) || null, name: clean(hostInstall.name) || null, role: clean(hostInstall.role) || null, mounts: hostInstall.mounts || null, schema: clean(hostInstall.schema) || null, source: '.agentsam/app.json' } : null,
96
+ },
97
+ deployment: { configured: remoteConfigured, worker_name: contract?.worker_name || null, config: contract?.config || null, error: contractError },
98
+ knowledge: {
99
+ policy_configured: Boolean(policy), policy_source: policy ? '.agentsam/knowledge.json' : null,
100
+ selected_backend: policy?.lane?.backend || null,
101
+ suggested_backend: !policy && vectorizeResources.length === 1 ? 'cloudflare_vectorize' : (!policy ? 'local_exact' : null),
102
+ local_index: { ...localIndex, ...executionState({ observed: localIndex.exists, selected: policy?.lane?.backend === 'local_exact', local: localIndex.exists, remote: false, source: localIndex.exists ? localIndex.path : null, reason: localIndex.exists ? null : 'No local knowledge SQLite index exists.' }) },
103
+ },
104
+ authorization: { cloudflare: credential },
105
+ resources: {
106
+ workers_ai: workersAi,
107
+ vectorize: vectorizeResources,
108
+ d1: d1.map(mapBoundResource),
109
+ r2: r2.map(mapBoundResource),
110
+ },
111
+ conflicts,
112
+ local_index: localIndex,
113
+ cloudflare: {
114
+ configured: remoteConfigured,
115
+ worker_name: contract?.worker_name || null,
116
+ config: contract?.config || null,
117
+ ai_binding: ai?.name || null,
118
+ vectorize: vectorizeResources.map(row => ({ binding: row.binding, index: row.index, source: row.source })),
119
+ error: contractError,
120
+ },
121
+ lanes,
122
+ };
123
+ }
124
+
125
+ export function discoverKnowledgeRuntime(root = process.cwd(), options = {}) {
126
+ return discoverProjectContext(root, options);
127
+ }
@@ -7,7 +7,7 @@ import { isKnowledgeSourcePath } from '../../packages/agentsam-repository/src/so
7
7
  import { fingerprint } from './config.js';
8
8
 
9
9
  export const PARSER = `typescript:${ts.version}:agentsam-1`;
10
- const OMIT = /(^|\/)(?:\.git|\.agentsam|node_modules|dist|build|coverage|vendor|\.next|\.wrangler|\.venv|__pycache__)(\/|$)|(^|\/)(?:\.env[^/]*|\.dev\.vars[^/]*|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|poetry\.lock|uv\.lock|[^/]*\.(?:pem|key|p12|pfx|min\.js|map))$/i;
10
+ const OMIT = /(^|\/)(?:\.git|\.agentsam|node_modules|python_modules|dist|build|target|coverage|vendor|\.next|\.wrangler|\.venv|__pycache__)(\/|$)|(^|\/)(?:\.env[^/]*|\.dev\.vars[^/]*|package-lock\.json|npm-shrinkwrap\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|Cargo\.lock|poetry\.lock|uv\.lock|[^/]*\.(?:pem|key|p12|pfx|min\.js|bundle\.js|map))$/i;
11
11
  const under = (file, scope) => scope === '.' || file === scope || file.startsWith(scope + '/');
12
12
  export function inventory(root, scope) {
13
13
  let files;
@@ -5,9 +5,15 @@ import { fileURLToPath } from 'node:url';
5
5
  const SDK_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
6
6
  const IDENTITY_PKG = path.join(SDK_ROOT, 'packages', 'identity');
7
7
  const AUTH_PAGES_DIR = path.join(IDENTITY_PKG, 'src', 'frontend', 'auth-portal', 'pages');
8
- const MIGRATION_FILE = path.join(IDENTITY_PKG, 'src', 'migrations', '0001_identity_core.sql');
8
+ const PORTABLE_SQL_DIR = path.join(IDENTITY_PKG, 'migrations', 'sqlite');
9
9
  const BRANDING_SCRIPT = path.join(IDENTITY_PKG, 'src', 'frontend', 'auth-portal', 'shared', 'company-branding.js');
10
10
 
11
+ const PORTABLE_SCAFFOLD_FILES = [
12
+ '001_identity_core.sql',
13
+ '002_identity_oauth_client.sql',
14
+ '005_identity_company_native.sql',
15
+ ];
16
+
11
17
  /**
12
18
  * @param {{ projectName: string, brandName?: string, logoUrl?: string, sdkVersion?: string, provider?: string }} config
13
19
  * @returns {Record<string, string>}
@@ -19,7 +25,10 @@ export function buildIdentityAppScaffold(config) {
19
25
  const sdkVersion = config.sdkVersion || 'alpha';
20
26
  const provider = config.provider || 'email';
21
27
 
22
- const migrationSql = `${fs.readFileSync(MIGRATION_FILE, 'utf8')}\n${buildCompanySeedSql({ brandName, logoUrl })}\n`;
28
+ const portableSql = PORTABLE_SCAFFOLD_FILES
29
+ .map((file) => fs.readFileSync(path.join(PORTABLE_SQL_DIR, file), 'utf8'))
30
+ .join('\n\n');
31
+ const migrationSql = `${portableSql}\n${buildCompanySeedSql({ brandName, logoUrl })}\n`;
23
32
  const loginHtml = injectBrandingScript(applyBrandTokens(fs.readFileSync(path.join(AUTH_PAGES_DIR, 'login.html'), 'utf8'), {
24
33
  brandName,
25
34
  logoUrl,
@@ -43,8 +52,8 @@ export function buildIdentityAppScaffold(config) {
43
52
  scripts: {
44
53
  dev: 'wrangler dev',
45
54
  deploy: 'wrangler deploy',
46
- 'db:migrate:local': `wrangler d1 execute ${projectName} --local --file=migrations/0001_identity_core.sql`,
47
- 'db:migrate': `wrangler d1 execute ${projectName} --remote --file=migrations/0001_identity_core.sql`,
55
+ 'db:migrate:local': `wrangler d1 execute ${projectName} --local --file=migrations/0001_identity_portable.sql`,
56
+ 'db:migrate': `wrangler d1 execute ${projectName} --remote --file=migrations/0001_identity_portable.sql`,
48
57
  preview: 'npx agentsam identity preview --open',
49
58
  },
50
59
  dependencies: {
@@ -61,6 +70,9 @@ export function buildIdentityAppScaffold(config) {
61
70
  main = "backend/src/index.js"
62
71
  compatibility_date = "2024-06-01"
63
72
 
73
+ [vars]
74
+ IDENTITY_ADAPTER_PROFILE = "portable"
75
+
64
76
  [assets]
65
77
  directory = "app/frontend"
66
78
  binding = "ASSETS"
@@ -76,7 +88,7 @@ migrations_dir = "migrations"
76
88
  files['.env.example'] = `# Minted at install/build — secrets via wrangler secret put (never commit)
77
89
  # IAM_CLIENT_ID= # plaintext var (public by OAuth design)
78
90
  # IAM_CLIENT_SECRET= # wrangler secret put only
79
- # IAM_ORIGIN=https://inneranimalmedia.com
91
+ # IAM_ORIGIN=
80
92
 
81
93
  # Web browser OAuth (BYOK) — takes /api/oauth/{google|github}/start when set
82
94
  # GOOGLE_CLIENT_ID=
@@ -103,11 +115,12 @@ migrations_dir = "migrations"
103
115
 
104
116
  files['README.md'] = `# ${brandName} — identity app
105
117
 
106
- Boring scaffold: **app/frontend** (auth UI) + **backend** (Worker API) + **migrations** (D1).
118
+ Boring scaffold: **app/frontend** (auth UI) + **backend** (Worker API) + **migrations** (portable \`identity_*\` D1).
107
119
 
108
120
  Provider template: \`${provider}\` (see \`agentsam identity plan --provider ${provider}\`).
109
121
 
110
- **Account SSOT:** \`accounts\` (row of record). \`account_identities\` is IdP linkage only.
122
+ **Schema:** portable \`agentsam.identity\` pack (\`identity_users\`, \`identity_sessions\`, \`identity_companies\`, …).
123
+ Not the hosted IAM \`accounts\` / \`auth_users\` / \`company\` shape.
111
124
 
112
125
  ## Quick start
113
126
 
@@ -135,13 +148,13 @@ npm run dev
135
148
  \`\`\`
136
149
  app/frontend/ Auth portal HTML + dashboard stub
137
150
  backend/src/ Cloudflare Worker (identity routes)
138
- migrations/ D1 schema (+ default \`company\` row)
151
+ migrations/ Portable identity_* schema (+ default identity_companies row)
139
152
 
140
153
  Branding: \`GET /api/company\` (public). Update with \`PATCH /api/company\` when signed in.
141
154
  \`\`\`
142
155
  `;
143
156
 
144
- files['migrations/0001_identity_core.sql'] = migrationSql;
157
+ files['migrations/0001_identity_portable.sql'] = migrationSql;
145
158
 
146
159
  files['app/frontend/auth/login.html'] = loginHtml;
147
160
  files['app/frontend/auth/signup.html'] = signupHtml;
@@ -190,10 +203,31 @@ Branding: \`GET /api/company\` (public). Update with \`PATCH /api/company\` when
190
203
  `;
191
204
 
192
205
  files['backend/src/index.js'] = `import { handleIdentityWorkerRequest } from '@inneranimalmedia/agentsam-sdk/identity/server/worker-router';
206
+ import { IDENTITY_ROUTE_IDS } from '@inneranimalmedia/agentsam-sdk/identity';
207
+ import { createRouteRegistry, defineRouteProjection } from '@inneranimalmedia/agentsam-sdk/identity';
208
+
209
+ const app = { id: '${projectName}' };
210
+ const routeRegistry = createRouteRegistry([
211
+ defineRouteProjection({
212
+ appId: app.id,
213
+ routes: {
214
+ [IDENTITY_ROUTE_IDS.LOGIN]: '/auth/login',
215
+ [IDENTITY_ROUTE_IDS.SIGNUP]: '/auth/signup',
216
+ [IDENTITY_ROUTE_IDS.RESET]: '/auth/reset',
217
+ [IDENTITY_ROUTE_IDS.RECOVERY]: '/auth/reset',
218
+ [IDENTITY_ROUTE_IDS.APP_AUTHENTICATED]: '/dashboard/',
219
+ [IDENTITY_ROUTE_IDS.OAUTH_CALLBACK]: '/api/oauth/:provider/callback',
220
+ },
221
+ }),
222
+ ]);
193
223
 
194
224
  export default {
195
225
  async fetch(request, env, ctx) {
196
- return handleIdentityWorkerRequest(request, env);
226
+ return handleIdentityWorkerRequest(request, env, {
227
+ app,
228
+ routeRegistry,
229
+ identityProfile: 'portable',
230
+ });
197
231
  },
198
232
  };
199
233
  `;
@@ -202,10 +236,15 @@ export default {
202
236
  }
203
237
 
204
238
  function applyBrandTokens(html, { brandName, logoUrl }) {
239
+ // Package HTML ships neutral portable defaults; scaffold stamps the app brand.
205
240
  return html
206
241
  .replace(/Inner Animal Media/g, brandName)
207
242
  .replace(/AgentSam/g, brandName)
243
+ .replace(/<h1 data-company-tagline>Welcome<\/h1>/g, `<h1 data-company-tagline>${brandName}</h1>`)
244
+ .replace(/<span data-company-name>App<\/span>/g, `<span data-company-name>${brandName}</span>`)
245
+ .replace(/alt="Sign in"/g, `alt="${brandName}"`)
208
246
  .replace(/src="\/shared\/agentsam-mark\.svg"/g, `src="${logoUrl}"`)
247
+ .replace(/src="\/shared\/app-icon\.png"/g, `src="${logoUrl}"`)
209
248
  .replace(/src="\/brand\/[^"]*"/g, `src="${logoUrl}"`)
210
249
  .replace(/href="\/brand\/[^"]*"/g, `href="${logoUrl}"`);
211
250
  }
@@ -221,9 +260,9 @@ function sqlLiteral(value) {
221
260
 
222
261
  function buildCompanySeedSql({ brandName, logoUrl }) {
223
262
  const ts = Math.floor(Date.now() / 1000);
224
- return `-- Default company row (branding SSOT for portal + dashboard)
225
- INSERT OR IGNORE INTO company (
226
- id, slug, name, logo_url, auth_bg_color, primary_color, created_at, updated_at
263
+ return `-- Default company row (branding SSOT for portal + dashboard) — portable identity_companies
264
+ INSERT OR IGNORE INTO identity_companies (
265
+ id, slug, name, logo_url, auth_bg_color, primary_color, support_email, created_at, updated_at
227
266
  ) VALUES (
228
267
  'co_default',
229
268
  'default',
@@ -231,6 +270,7 @@ INSERT OR IGNORE INTO company (
231
270
  ${sqlLiteral(logoUrl)},
232
271
  '#050508',
233
272
  '#007AFF',
273
+ ${sqlLiteral('support@example.test')},
234
274
  ${ts},
235
275
  ${ts}
236
276
  );`;
@@ -39,7 +39,7 @@ export const imageRasterTransformCapability = {
39
39
  provider: 'npm',
40
40
  packages: ['sharp'],
41
41
  notes: [
42
- 'Sharp is the portable default (declared dependency of @inneranimalmedia/agentsam-sdk-brand).',
42
+ 'Sharp is the portable default (declared dependency of @inneranimalmedia/agentsam-brand).',
43
43
  'Optional enrichment: Homebrew imagemagick for ICNS / exotic formats.',
44
44
  'Brand packs: agentsam brand promote → pack → preview → optional publish',
45
45
  ' agentsam brand pack --brand acme --asset app-icon --source ./master.png --preset app-icon --out ./acme.zip',
@@ -32,7 +32,7 @@ export const SLASH_COMMANDS = [
32
32
  { cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
33
33
  { cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
34
34
  { cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
35
- { cmd: '/plan', description: 'Composable plans: /plan brand', lane: 'product' },
35
+ { cmd: '/plan', description: 'Durable local plans: /plan [new|list|show|add|start|done|block|complete|brand]', lane: 'product' },
36
36
  { cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
37
37
  { cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
38
38
  { cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
@@ -43,14 +43,36 @@ export function createRuntimeRunId() {
43
43
  export async function startRuntimeRun(value = {}) {
44
44
  const id = clean(value.id) || createRuntimeRunId();
45
45
  await withStore(value.projectRoot || value.cwd, async (db) => {
46
+ const activeStep = (!clean(value.plan_id) || !clean(value.todo_id))
47
+ ? await db.prepare(`
48
+ SELECT t.id AS todo_id, t.plan_id
49
+ FROM agentsam_todo t
50
+ JOIN agentsam_plans p ON p.id = t.plan_id
51
+ WHERE t.status = 'running' AND p.status = 'active'
52
+ ORDER BY t.updated_at_unix DESC, t.created_at_unix DESC
53
+ LIMIT 1
54
+ `).first()
55
+ : null;
56
+ const activePlan = !clean(value.plan_id) && !activeStep?.plan_id
57
+ ? await db.prepare(`
58
+ SELECT id AS plan_id FROM agentsam_plans
59
+ WHERE status = 'active'
60
+ ORDER BY updated_at_unix DESC, created_at_unix DESC
61
+ LIMIT 1
62
+ `).first()
63
+ : null;
64
+ const planId = clean(value.plan_id) || clean(activeStep?.plan_id) || clean(activePlan?.plan_id) || null;
65
+ const todoId = clean(value.todo_id) || clean(activeStep?.todo_id) || null;
46
66
  await db.prepare(`
47
67
  INSERT INTO agentsam_agent_run (
48
- id, account_id, source_client, surface, mode, model_key,
68
+ id, account_id, plan_id, todo_id, source_client, surface, mode, model_key,
49
69
  reasoning_effort, requested_service_tier, status, started_at_unix, updated_at_unix
50
- ) VALUES (?, ?, 'agentsam-cli', 'cli', ?, ?, ?, ?, 'running', unixepoch(), unixepoch())
70
+ ) VALUES (?, ?, ?, ?, 'agentsam-cli', 'cli', ?, ?, ?, ?, 'running', unixepoch(), unixepoch())
51
71
  `).bind(
52
72
  id,
53
73
  clean(value.account_id) || null,
74
+ planId,
75
+ todoId,
54
76
  clean(value.mode) || 'agent',
55
77
  clean(value.model_key) || null,
56
78
  clean(value.reasoning_effort) || null,