@inneranimalmedia/agentsam-sdk 2.6.2 → 2.6.4

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 (661) hide show
  1. package/AGENTSAM.md +51 -1
  2. package/README.md +95 -0
  3. package/apps/README.md +34 -0
  4. package/apps/cad-creator/README.md +728 -0
  5. package/apps/cad-creator/shared/cad/package.json +19 -0
  6. package/apps/cad-creator/shared/cad/src/domain/operations.ts +7 -0
  7. package/apps/cad-creator/shared/cad/src/domain/project-contract.d.ts +3 -0
  8. package/apps/cad-creator/shared/cad/src/domain/project-contract.js +75 -0
  9. package/apps/cad-creator/shared/cad/src/domain/project-tools.d.ts +1 -0
  10. package/apps/cad-creator/shared/cad/src/domain/project-tools.js +24 -0
  11. package/apps/cad-creator/shared/cad/src/domain/validation.ts +191 -0
  12. package/apps/cad-creator/shared/cad/src/index.ts +4 -0
  13. package/apps/cad-creator/shared/cad/src/robotics/types.ts +232 -0
  14. package/apps/cad-creator/shared/cad/src/types.ts +507 -0
  15. package/apps/cad-creator/shared/cad/tsconfig.json +14 -0
  16. package/bin/agentsam +16 -1
  17. package/docs/AUTORAG.md +58 -0
  18. package/docs/BRAND_INTELLIGENCE.md +30 -0
  19. package/docs/CLI_SHELL.md +4 -2
  20. package/docs/CMS_CONTEXTUAL_COMPOSER.md +38 -0
  21. package/docs/MERKLE.md +4 -0
  22. package/docs/PROJECT_CONFIG.md +3 -0
  23. package/docs/REPOSITORY_KNOWLEDGE.md +2 -0
  24. package/docs/THEME_REFINERY.md +120 -0
  25. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  26. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  27. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  28. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  29. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  30. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +28 -0
  31. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  32. package/docs/architecture/PROVIDER-TOOLS-AND-COMPACTION.md +60 -0
  33. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  34. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  35. package/docs/architecture/SAM_KERNEL.md +181 -0
  36. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  37. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  38. package/docs/architecture/STORAGE.md +87 -0
  39. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  40. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  41. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  42. package/docs/cad-project-tools.md +69 -0
  43. package/docs/cms-scaffolding-pattern-reference.md +73 -0
  44. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS-codex-tui-20260919.md +113 -0
  45. package/docs/plans/AGENTSAM-INTERACTIVE-UI-REQUIREMENTS.md +85 -0
  46. package/docs/plans/AGENTSAM-MCP-CLIENT-2026-09-19.md +181 -0
  47. package/docs/plans/ASBD-PORTABLE-WORKGRAPH-UI-DEFERRED.md +34 -0
  48. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +258 -0
  49. package/docs/plans/MULTI-AGENT-SPRINTS-2026-09-19.md +373 -0
  50. package/docs/plans/NEXT-AGENT-HANDOFF.md +167 -0
  51. package/docs/plans/RECONCILIATION-2026-09-19.md +178 -0
  52. package/docs/plugins.md +43 -0
  53. package/docs/tools/README.md +57 -0
  54. package/docs/tools/agent-and-orchestration.md +49 -0
  55. package/docs/tools/browser-and-research.md +46 -0
  56. package/docs/tools/cloudflare-platform.md +32 -0
  57. package/docs/tools/cms.md +25 -0
  58. package/docs/tools/communications.md +41 -0
  59. package/docs/tools/database-and-storage.md +62 -0
  60. package/docs/tools/design-and-media.md +64 -0
  61. package/docs/tools/filesystem-and-code.md +55 -0
  62. package/docs/tools/github.md +56 -0
  63. package/docs/tools/integrations-and-misc.md +16 -0
  64. package/docs/tools/memory.md +21 -0
  65. package/docs/tools/terminal-and-execution.md +29 -0
  66. package/docs/tools/tickets-and-platform.md +30 -0
  67. package/migrations/d1/0001_agentsam_plugin_runtime.sql +177 -0
  68. package/migrations/d1/0002_agentsam_ticket_ownership.sql +8 -0
  69. package/migrations/d1/0002_dynamic_model_policies.sql +23 -0
  70. package/migrations/d1/0003_expand_tool_handler_families.sql +18 -0
  71. package/migrations/d1/0004_project_aware_retrieval_lanes.sql +24 -0
  72. package/migrations/d1/0005_portable_knowledge_identity.sql +104 -0
  73. package/migrations/d1/0006_repair_ops_trail_account_scope.sql +14 -0
  74. package/migrations/d1/0007_repair_ops_trail_agent_run_account.sql +13 -0
  75. package/migrations/d1/0008_backfill_knowledge_run_legacy_tenant.sql +14 -0
  76. package/migrations/d1/0009_normalize_cloudflare_plugin_installations.sql +137 -0
  77. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  78. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  79. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  80. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  81. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  82. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  83. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  84. package/migrations/d1/0014_auth_event_log.sql +20 -0
  85. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  86. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  87. package/migrations/runtime/0001_cli_runtime.sql +67 -0
  88. package/migrations/runtime/0002_project_sessions.sql +15 -0
  89. package/migrations/runtime/0003_provider_continuations.sql +8 -0
  90. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  91. package/package.json +107 -12
  92. package/packages/agentsam-brand/README.md +21 -0
  93. package/packages/agentsam-brand/package.json +22 -0
  94. package/packages/agentsam-brand/src/contract.js +59 -0
  95. package/packages/agentsam-brand/src/extract.js +126 -0
  96. package/packages/agentsam-brand/src/goap-actions.js +73 -0
  97. package/packages/agentsam-brand/src/index.js +48 -0
  98. package/packages/agentsam-brand/src/plan.js +115 -0
  99. package/packages/agentsam-brand/src/resolve.js +139 -0
  100. package/packages/agentsam-brand/src/scan.js +250 -0
  101. package/packages/agentsam-brand/test/brand-scan.test.mjs +106 -0
  102. package/packages/agentsam-contracts/README.md +23 -0
  103. package/packages/agentsam-contracts/package.json +32 -0
  104. package/packages/agentsam-contracts/src/adapter.ts +25 -0
  105. package/packages/agentsam-contracts/src/agent.ts +35 -0
  106. package/packages/agentsam-contracts/src/artifacts.ts +33 -0
  107. package/packages/agentsam-contracts/src/authority.ts +29 -0
  108. package/packages/agentsam-contracts/src/context.ts +16 -0
  109. package/packages/agentsam-contracts/src/errors.ts +62 -0
  110. package/packages/agentsam-contracts/src/events.ts +47 -0
  111. package/packages/agentsam-contracts/src/execution.ts +50 -0
  112. package/packages/agentsam-contracts/src/hooks.ts +40 -0
  113. package/packages/agentsam-contracts/src/identity.ts +16 -0
  114. package/packages/agentsam-contracts/src/index.ts +14 -0
  115. package/packages/agentsam-contracts/src/models.ts +9 -0
  116. package/packages/agentsam-contracts/src/providers.ts +33 -0
  117. package/packages/agentsam-contracts/src/repository.ts +64 -0
  118. package/packages/agentsam-contracts/src/tools.ts +98 -0
  119. package/packages/agentsam-contracts/test/contracts.test.mjs +16 -0
  120. package/packages/agentsam-contracts/test/errors-catalog.test.mjs +25 -0
  121. package/packages/agentsam-contracts/test/repository.test.mjs +18 -0
  122. package/packages/agentsam-contracts/tsconfig.json +12 -0
  123. package/packages/agentsam-errors/package.json +17 -0
  124. package/packages/agentsam-errors/src/adapters/anthropic.js +15 -0
  125. package/packages/agentsam-errors/src/adapters/cad.js +109 -0
  126. package/packages/agentsam-errors/src/adapters/cloudflare.js +21 -0
  127. package/packages/agentsam-errors/src/adapters/cursor.js +4 -0
  128. package/packages/agentsam-errors/src/adapters/device.js +38 -0
  129. package/packages/agentsam-errors/src/adapters/docker.js +28 -0
  130. package/packages/agentsam-errors/src/adapters/gcp.js +14 -0
  131. package/packages/agentsam-errors/src/adapters/github.js +22 -0
  132. package/packages/agentsam-errors/src/adapters/google.js +17 -0
  133. package/packages/agentsam-errors/src/adapters/index.js +55 -0
  134. package/packages/agentsam-errors/src/adapters/internal.js +40 -0
  135. package/packages/agentsam-errors/src/adapters/oauth.js +24 -0
  136. package/packages/agentsam-errors/src/adapters/openai.js +17 -0
  137. package/packages/agentsam-errors/src/adapters/process.js +35 -0
  138. package/packages/agentsam-errors/src/adapters/provider.js +114 -0
  139. package/packages/agentsam-errors/src/envelope.js +239 -0
  140. package/packages/agentsam-errors/src/error.js +24 -0
  141. package/packages/agentsam-errors/src/fingerprint.js +35 -0
  142. package/packages/agentsam-errors/src/index.js +11 -0
  143. package/packages/agentsam-errors/src/normalize.js +30 -0
  144. package/packages/agentsam-errors/src/recovery.js +301 -0
  145. package/packages/agentsam-errors/src/redaction.js +52 -0
  146. package/packages/agentsam-errors/src/render.js +16 -0
  147. package/packages/agentsam-errors/src/retry.js +10 -0
  148. package/packages/agentsam-errors/src/transport.js +52 -0
  149. package/packages/agentsam-errors/src/vocabulary.js +320 -0
  150. package/packages/agentsam-errors/test/envelope.test.mjs +70 -0
  151. package/packages/agentsam-errors/test/providers.test.mjs +99 -0
  152. package/packages/agentsam-errors/test/redaction.test.mjs +21 -0
  153. package/packages/agentsam-errors/test/runtime-cad-device.test.mjs +76 -0
  154. package/packages/agentsam-errors/test/transport.test.mjs +46 -0
  155. package/packages/agentsam-knowledge/package.json +15 -0
  156. package/packages/agentsam-knowledge/src/autorag/index.js +64 -0
  157. package/packages/agentsam-knowledge/src/backends/index.js +26 -0
  158. package/packages/agentsam-knowledge/src/index.js +3 -0
  159. package/packages/agentsam-knowledge/src/providers/index.js +107 -0
  160. package/packages/agentsam-knowledge/test/autorag.test.mjs +42 -0
  161. package/packages/agentsam-nav/README.md +40 -0
  162. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  163. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  164. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  165. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  166. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  167. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  168. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  169. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  170. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  171. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  172. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  173. package/packages/agentsam-nav/dist/browser.global.js +132 -0
  174. package/packages/agentsam-nav/dist/browser.js +613 -0
  175. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  176. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  177. package/packages/agentsam-nav/dist/index.js +614 -0
  178. package/packages/agentsam-nav/dist/legacy.css +83 -0
  179. package/packages/agentsam-nav/dist/shell.css +113 -0
  180. package/packages/agentsam-nav/dist/theme.css +113 -0
  181. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  182. package/packages/agentsam-nav/package.json +43 -0
  183. package/packages/agentsam-queue-control/README.md +107 -0
  184. package/packages/agentsam-queue-control/package.json +31 -0
  185. package/packages/agentsam-queue-control/schemas/job-envelope.schema.json +56 -0
  186. package/packages/agentsam-queue-control/src/adapters/cloudflare.js +152 -0
  187. package/packages/agentsam-queue-control/src/adapters/memory.js +38 -0
  188. package/packages/agentsam-queue-control/src/contracts.js +130 -0
  189. package/packages/agentsam-queue-control/src/control-plane.js +141 -0
  190. package/packages/agentsam-queue-control/src/dispatch.js +43 -0
  191. package/packages/agentsam-queue-control/src/index.js +7 -0
  192. package/packages/agentsam-queue-control/src/policy.js +88 -0
  193. package/packages/agentsam-queue-control/src/topology.js +66 -0
  194. package/packages/agentsam-queue-control/test/queue-control.test.mjs +100 -0
  195. package/packages/agentsam-repository/src/goap.js +718 -0
  196. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  197. package/packages/agentsam-repository/src/index.js +5 -0
  198. package/packages/agentsam-repository/src/merkle/cloudflare-persistence.js +2 -2
  199. package/packages/agentsam-repository/src/tickets.js +184 -0
  200. package/packages/agentsam-repository/src/work-tracking.js +199 -0
  201. package/packages/agentsam-repository/src/workspace-state.js +176 -0
  202. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +152 -0
  203. package/packages/connectors/cloudflare/src/index.js +297 -15
  204. package/packages/connectors/cloudflare/src/owner.js +43 -40
  205. package/packages/connectors/cloudflare/src/routes.js +176 -26
  206. package/packages/connectors/cloudflare/tests/connector.test.mjs +137 -2
  207. package/packages/heuristic-theme/README.md +11 -0
  208. package/packages/heuristic-theme/package.json +25 -0
  209. package/packages/heuristic-theme/src/index.js +2 -0
  210. package/packages/heuristic-theme/src/registry.js +36 -0
  211. package/packages/heuristic-theme/src/theme.js +41 -0
  212. package/packages/heuristic-theme/test/theme.test.mjs +26 -0
  213. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +64 -0
  214. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +96 -0
  215. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +47 -0
  216. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +83 -0
  217. package/packages/identity/.agentsam/features/oauth-login-portal/ui.json +35 -0
  218. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  219. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +31 -0
  220. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  221. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  222. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  223. package/packages/identity/package.json +4 -3
  224. package/packages/identity/src/adapters/cloudflare-d1/ids.js +4 -0
  225. package/packages/identity/src/adapters/cloudflare-d1/index.js +156 -18
  226. package/packages/identity/src/adapters/sqlite/index.js +319 -0
  227. package/packages/identity/src/app/verify-app.js +95 -0
  228. package/packages/identity/src/contracts/identity-store.js +115 -0
  229. package/packages/identity/src/contracts/provider.js +3 -2
  230. package/packages/identity/src/contracts/route-ids.js +30 -0
  231. package/packages/identity/src/contracts/route-projection.js +218 -0
  232. package/packages/identity/src/contracts/routes.js +11 -0
  233. package/packages/identity/src/core/browser-paths.js +4 -5
  234. package/packages/identity/src/core/constants.js +13 -8
  235. package/packages/identity/src/core/session-policy.js +32 -0
  236. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -9
  237. package/packages/identity/src/frontend/auth-portal/pages/reset.html +3 -3
  238. package/packages/identity/src/frontend/auth-portal/pages/signup.html +3 -3
  239. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  240. package/packages/identity/src/index.js +27 -0
  241. package/packages/identity/src/oauth/README.md +10 -4
  242. package/packages/identity/src/oauth/credentials.js +31 -11
  243. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  244. package/packages/identity/src/oauth/iam-platform.js +13 -12
  245. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  246. package/packages/identity/src/providers/cloudflare/index.js +19 -0
  247. package/packages/identity/src/providers/cloudflare/mapper.js +21 -0
  248. package/packages/identity/src/providers/cloudflare/oauth.js +48 -0
  249. package/packages/identity/src/providers/cloudflare/profile.js +28 -0
  250. package/packages/identity/src/providers/index.js +18 -2
  251. package/packages/identity/src/server/identity-service.js +35 -8
  252. package/packages/identity/src/server/mount-policy.js +30 -0
  253. package/packages/identity/src/server/post-auth.js +79 -0
  254. package/packages/identity/src/server/worker-router.js +153 -66
  255. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  256. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  257. package/packages/identity/tests/identity-service.test.mjs +47 -1
  258. package/packages/identity/tests/oauth-credentials.test.mjs +3 -1
  259. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  260. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  261. package/packages/providers/completeful/README.md +38 -0
  262. package/packages/providers/completeful/package.json +29 -0
  263. package/packages/providers/completeful/src/client.js +162 -0
  264. package/packages/providers/completeful/src/events.js +49 -0
  265. package/packages/providers/completeful/src/index.js +22 -0
  266. package/packages/providers/completeful/src/tools.js +579 -0
  267. package/packages/providers/completeful/src/webhooks.js +55 -0
  268. package/packages/providers/completeful/test/provider.test.mjs +196 -0
  269. package/packages/theme-church-site/README.md +10 -0
  270. package/packages/theme-church-site/package.json +31 -0
  271. package/packages/theme-church-site/src/harvest.json +14 -0
  272. package/packages/theme-church-site/src/index.js +85 -0
  273. package/packages/theme-church-site/test/theme.test.mjs +19 -0
  274. package/packages/theme-companions-site/README.md +10 -0
  275. package/packages/theme-companions-site/package.json +31 -0
  276. package/packages/theme-companions-site/src/harvest.json +12 -0
  277. package/packages/theme-companions-site/src/index.js +83 -0
  278. package/packages/theme-companions-site/test/theme.test.mjs +19 -0
  279. package/packages/theme-floors-site/README.md +10 -0
  280. package/packages/theme-floors-site/package.json +31 -0
  281. package/packages/theme-floors-site/src/harvest.json +14 -0
  282. package/packages/theme-floors-site/src/index.js +83 -0
  283. package/packages/theme-floors-site/test/theme.test.mjs +19 -0
  284. package/packages/theme-fuelnfree-site/README.md +10 -0
  285. package/packages/theme-fuelnfree-site/package.json +31 -0
  286. package/packages/theme-fuelnfree-site/src/harvest.json +13 -0
  287. package/packages/theme-fuelnfree-site/src/index.js +82 -0
  288. package/packages/theme-fuelnfree-site/test/theme.test.mjs +19 -0
  289. package/packages/theme-handyman-site/README.md +10 -0
  290. package/packages/theme-handyman-site/package.json +31 -0
  291. package/packages/theme-handyman-site/src/harvest.json +10 -0
  292. package/packages/theme-handyman-site/src/index.js +84 -0
  293. package/packages/theme-handyman-site/test/theme.test.mjs +19 -0
  294. package/packages/theme-insurance-site/README.md +10 -0
  295. package/packages/theme-insurance-site/package.json +31 -0
  296. package/packages/theme-insurance-site/src/harvest.json +10 -0
  297. package/packages/theme-insurance-site/src/index.js +84 -0
  298. package/packages/theme-insurance-site/test/theme.test.mjs +19 -0
  299. package/packages/theme-shinshu-site/README.md +10 -0
  300. package/packages/theme-shinshu-site/package.json +31 -0
  301. package/packages/theme-shinshu-site/src/harvest.json +12 -0
  302. package/packages/theme-shinshu-site/src/index.js +84 -0
  303. package/packages/theme-shinshu-site/test/theme.test.mjs +19 -0
  304. package/packages/work-graph/README.md +49 -0
  305. package/packages/work-graph/package.json +19 -0
  306. package/packages/work-graph/prototype/README.md +32 -0
  307. package/packages/work-graph/prototype/data/demo-workgraph.js +47 -0
  308. package/packages/work-graph/prototype/renderers/timeline-model.js +21 -0
  309. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +38 -0
  310. package/packages/work-graph/prototype-gnantt.html +655 -0
  311. package/packages/work-graph/src/adapters/business/projects.js +23 -0
  312. package/packages/work-graph/src/adapters/engineering/git.js +22 -0
  313. package/packages/work-graph/src/adapters/engineering/mcp.js +22 -0
  314. package/packages/work-graph/src/index.js +76 -0
  315. package/packages/work-graph/src/renderers/gantt-model.js +11 -0
  316. package/packages/work-graph/src/renderers/timeline.js +16 -0
  317. package/packages/work-graph/test/work-graph.test.mjs +37 -0
  318. package/protocol/README.md +12 -0
  319. package/protocol/apps/agentsam.app.v1.schema.json +51 -0
  320. package/protocol/brand/brandpack.v1.schema.json +43 -0
  321. package/protocol/capabilities/cloudflare-cpu-audit-input.schema.json +30 -6
  322. package/protocol/capabilities/cloudflare-cpu-profile-input.schema.json +18 -4
  323. package/protocol/capabilities/cloudflare-wrangler-native-input.schema.json +59 -10
  324. package/protocol/capabilities/knowledge-search-input.schema.json +35 -0
  325. package/protocol/capabilities/manifest.json +163 -1
  326. package/protocol/capabilities/repository-audit-input.schema.json +39 -6
  327. package/protocol/capabilities/repository-snapshot-input.schema.json +15 -3
  328. package/protocol/capabilities/terminal-exec-input.schema.json +55 -0
  329. package/protocol/commerce/catalog.v1.json +50 -0
  330. package/protocol/credentials/issue.v1.schema.json +38 -0
  331. package/protocol/database/connection.v1.schema.json +41 -0
  332. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  333. package/protocol/errors/error-catalog.json +164 -0
  334. package/protocol/errors/error-envelope.schema.json +678 -0
  335. package/protocol/errors/recovery.v1.schema.json +50 -0
  336. package/protocol/features/README.md +57 -0
  337. package/protocol/features/agentsam.feature.v1.schema.json +290 -0
  338. package/protocol/features/catalog.json +65 -0
  339. package/protocol/features/examples/provider-resend.feature.json +17 -0
  340. package/protocol/go/agentsam-go-runtime.v1.json +17 -0
  341. package/protocol/knowledge/LIFECYCLE.md +140 -0
  342. package/protocol/knowledge/README.md +4 -0
  343. package/protocol/presets/catalog.json +128 -19
  344. package/protocol/rpc/v1/errors.proto +24 -0
  345. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  346. package/protocol/sam/activity.v1.schema.json +48 -0
  347. package/protocol/sam/answer.v1.schema.json +35 -0
  348. package/protocol/sam/calibration.v1.schema.json +21 -0
  349. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  350. package/protocol/sam/evaluation.v1.schema.json +19 -0
  351. package/protocol/sam/operation.schema.json +66 -0
  352. package/protocol/sam/outcome.v1.schema.json +36 -0
  353. package/protocol/sam/question.v1.schema.json +26 -0
  354. package/protocol/sam/registry.seed.json +153 -0
  355. package/protocol/sam/result.schema.json +53 -0
  356. package/protocol/sam/state.v1.schema.json +23 -0
  357. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  358. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  359. package/protocol/theme-refinery/d1-reconciliation.md +48 -0
  360. package/protocol/theme-refinery/product-metadata.schema.json +27 -0
  361. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +318 -0
  362. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +472 -0
  363. package/protocol/theme-refinery/reconciliation-receipt.schema.json +83 -0
  364. package/protocol/ui/icon-registry.mjs +226 -0
  365. package/protocol/ui/icon.v1.schema.json +51 -0
  366. package/services/cad/server.py +249 -2
  367. package/skills/README.md +22 -9
  368. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  369. package/skills/catalog.json +14 -0
  370. package/src/agent/capability-adapter.js +15 -5
  371. package/src/agent/index.js +2 -1
  372. package/src/agent/model-turn.js +51 -0
  373. package/src/agent/responses-runner.js +304 -38
  374. package/src/capabilities/index.js +1 -0
  375. package/src/capabilities/terminal-exec.js +78 -0
  376. package/src/cli/command-catalog.js +130 -0
  377. package/src/cli/dispatch.js +48 -0
  378. package/src/cli.js +160 -10
  379. package/src/cloudflare/index.js +6 -0
  380. package/src/cloudflare/runtime-status.js +393 -0
  381. package/src/cloudflare/wrangler.js +17 -1
  382. package/src/commands/api-key.js +244 -0
  383. package/src/commands/app.js +138 -0
  384. package/src/commands/autorag.js +77 -0
  385. package/src/commands/brand.js +291 -0
  386. package/src/commands/cad.js +1 -0
  387. package/src/commands/codebaseindex.js +688 -0
  388. package/src/commands/connections.js +126 -29
  389. package/src/commands/context-economics.js +8 -0
  390. package/src/commands/db.js +7 -0
  391. package/src/commands/env.js +155 -27
  392. package/src/commands/eval.js +209 -14
  393. package/src/commands/go.js +678 -0
  394. package/src/commands/goap.js +176 -0
  395. package/src/commands/identity-init.js +27 -3
  396. package/src/commands/identity-protocol.js +195 -0
  397. package/src/commands/interaction-clack.js +115 -0
  398. package/src/commands/knowledge.js +64 -5
  399. package/src/commands/mcp.js +341 -0
  400. package/src/commands/merkle-persist.js +3 -1
  401. package/src/commands/merkle.js +18 -3
  402. package/src/commands/models.js +110 -24
  403. package/src/commands/plugins.js +175 -0
  404. package/src/commands/preferences.js +28 -8
  405. package/src/commands/product.js +53 -10
  406. package/src/commands/providers.js +173 -44
  407. package/src/commands/resume.js +9 -5
  408. package/src/commands/runtime-status.js +154 -0
  409. package/src/commands/shell.js +508 -56
  410. package/src/commands/skill.js +248 -0
  411. package/src/commands/skills.js +1 -1
  412. package/src/commands/start-local.js +4 -0
  413. package/src/commands/status.js +82 -7
  414. package/src/commands/tunnel.js +228 -195
  415. package/src/commands/whoami.js +156 -12
  416. package/src/context/budget.js +6 -0
  417. package/src/context/index.js +2 -1
  418. package/src/context/project-card.js +75 -0
  419. package/src/errors/contract.js +34 -211
  420. package/src/errors/diagnostic.js +95 -51
  421. package/src/errors/index.js +6 -13
  422. package/src/eval/index.js +6 -0
  423. package/src/eval/live.js +439 -0
  424. package/src/features/resolve.js +242 -0
  425. package/src/go/build.js +298 -0
  426. package/src/go/cloudflare.js +608 -0
  427. package/src/go/container.js +120 -0
  428. package/src/go/contract.js +144 -0
  429. package/src/go/discover.js +212 -0
  430. package/src/go/index.js +25 -0
  431. package/src/go/native-probe-runner.mjs +119 -0
  432. package/src/go/official-registry.js +280 -0
  433. package/src/go/official-release.js +10 -0
  434. package/src/go/receipts.js +144 -0
  435. package/src/go/verify.js +38 -0
  436. package/src/index.js +127 -1
  437. package/src/indexing/ingest/discover-models.js +298 -0
  438. package/src/indexing/ingest/inventory.js +243 -0
  439. package/src/indexing/ingest/job-graph.js +181 -0
  440. package/src/indexing/ingest/materials.js +210 -0
  441. package/src/knowledge/config.js +13 -5
  442. package/src/knowledge/engine.js +23 -8
  443. package/src/knowledge/index.js +1 -0
  444. package/src/knowledge/lane-registry.js +46 -0
  445. package/src/knowledge/providers/gemini.js +48 -8
  446. package/src/knowledge/service/client.js +13 -1
  447. package/src/knowledge/service/grpc-codec.js +156 -53
  448. package/src/knowledge/service/job-engine.js +133 -11
  449. package/src/knowledge/service/job-worker.js +34 -5
  450. package/src/knowledge/service/server.js +10 -1
  451. package/src/knowledge/store-discovery.js +77 -0
  452. package/src/lib/account-session.js +8 -2
  453. package/src/lib/agent-instructions.js +3 -0
  454. package/src/lib/auth.js +7 -3
  455. package/src/lib/cad/blender.js +42 -3
  456. package/src/lib/cad/d1-project-store.js +43 -0
  457. package/src/lib/cad/discovery.js +616 -0
  458. package/src/lib/cad/docker-executor.js +352 -0
  459. package/src/lib/cad/freecad.js +253 -0
  460. package/src/lib/cad/index.js +40 -0
  461. package/src/lib/cad/openscad.js +198 -0
  462. package/src/lib/cad/project-cli.d.ts +2 -0
  463. package/src/lib/cad/project-cli.js +21 -0
  464. package/src/lib/cad/project-contract.d.ts +3 -0
  465. package/src/lib/cad/project-contract.js +1 -0
  466. package/src/lib/cad/project-recipe.js +30 -0
  467. package/src/lib/cad/project-runtime.d.ts +2 -0
  468. package/src/lib/cad/project-runtime.js +53 -0
  469. package/src/lib/cad/project-store.js +25 -0
  470. package/src/lib/cad/project-workflows.js +31 -0
  471. package/src/lib/cad-docker.js +21 -2
  472. package/src/lib/cli-preferences.js +17 -2
  473. package/src/lib/core-client.js +37 -18
  474. package/src/lib/deploy/local-studio.js +6 -5
  475. package/src/lib/dockerize.js +3 -0
  476. package/src/lib/execution-approvals.js +1 -0
  477. package/src/lib/identity-scaffold.js +4 -1
  478. package/src/lib/knowledge-docker.js +9 -1
  479. package/src/lib/local-sessions.js +124 -34
  480. package/src/lib/local-status.js +35 -14
  481. package/src/lib/project-config.js +9 -0
  482. package/src/lib/provider-credentials.js +136 -32
  483. package/src/lib/scaffold/resolve-cloudflare-account.js +37 -0
  484. package/src/lib/scaffold/wizards/cms.js +2 -8
  485. package/src/lib/scaffold/wizards/worker-api.js +2 -8
  486. package/src/lib/slash-commands.js +10 -2
  487. package/src/local/migrations.js +109 -1
  488. package/src/local/runtime-store.js +31 -5
  489. package/src/local/sqlite.js +36 -1
  490. package/src/local-fs/capability.js +121 -0
  491. package/src/local-fs/freshness.js +75 -0
  492. package/src/local-fs/index.js +385 -0
  493. package/src/local-fs/paths.js +100 -0
  494. package/src/local-pty/server.js +295 -19
  495. package/src/mcp/authority.js +348 -0
  496. package/src/mcp/client-adapters.js +431 -0
  497. package/src/mcp/client.js +172 -0
  498. package/src/mcp/index.js +47 -0
  499. package/src/mcp/telemetry.js +103 -0
  500. package/src/models/ai-access-onboarding.js +112 -0
  501. package/src/models/catalog.js +329 -51
  502. package/src/models/discovery.js +34 -6
  503. package/src/models/index.js +2 -0
  504. package/src/models/inventory-core.js +190 -0
  505. package/src/models/policy.js +20 -0
  506. package/src/plugins/cloudflare.js +103 -0
  507. package/src/plugins/completeful.js +69 -0
  508. package/src/plugins/contracts.js +86 -0
  509. package/src/plugins/index.js +11 -0
  510. package/src/plugins/registry.js +207 -0
  511. package/src/plugins/resource-scope.js +45 -0
  512. package/src/plugins/runtime.js +118 -0
  513. package/src/plugins/vectorize.js +31 -0
  514. package/src/progression/engine.js +171 -0
  515. package/src/progression/index.js +1 -0
  516. package/src/providers/cloudflare-chat.js +1 -1
  517. package/src/providers/gemini-generate-content.js +2 -1
  518. package/src/providers/openai-responses.js +45 -16
  519. package/src/providers/tool-schema.js +85 -0
  520. package/src/repository/index.js +29 -0
  521. package/src/rpc/generated/errors_pb.js +961 -1
  522. package/src/sam/activity/index.js +183 -0
  523. package/src/sam/client.js +252 -0
  524. package/src/sam/decision/calibration.js +109 -0
  525. package/src/sam/decision/confidence.js +126 -0
  526. package/src/sam/decision/evaluate.js +157 -0
  527. package/src/sam/decision/evaluators/deterministic.js +341 -0
  528. package/src/sam/decision/evaluators/heuristic.js +61 -0
  529. package/src/sam/decision/evaluators/select.js +50 -0
  530. package/src/sam/decision/evaluators/semantic.js +149 -0
  531. package/src/sam/decision/hierarchical.js +61 -0
  532. package/src/sam/decision/index.js +53 -0
  533. package/src/sam/decision/policy.js +86 -0
  534. package/src/sam/decision/questions.js +120 -0
  535. package/src/sam/decision/receipt.js +148 -0
  536. package/src/sam/decision/state.js +117 -0
  537. package/src/sam/decision/types.js +22 -0
  538. package/src/sam/decision/validate.js +200 -0
  539. package/src/sam/define.js +51 -0
  540. package/src/sam/index.js +65 -0
  541. package/src/sam/operations/brand-scan.js +62 -0
  542. package/src/sam/operations/cad-blender-inspect.js +36 -0
  543. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  544. package/src/sam/operations/decision-evaluate.js +59 -0
  545. package/src/sam/operations/planning-astar.js +77 -0
  546. package/src/sam/operations/planning-goap.js +60 -0
  547. package/src/sam/operations/repository-inspect.js +72 -0
  548. package/src/sam/operations/security-scan.js +33 -0
  549. package/src/sam/operations/terminal-exec.js +29 -0
  550. package/src/sam/planning/astar.js +311 -0
  551. package/src/sam/planning/goap.js +177 -0
  552. package/src/sam/planning/index.js +21 -0
  553. package/src/sam/planning/state.js +84 -0
  554. package/src/sam/registry.js +48 -0
  555. package/src/sam/result.js +77 -0
  556. package/src/sam/seed.js +44 -0
  557. package/src/sam/types.js +91 -0
  558. package/src/security/local-vault.js +415 -0
  559. package/src/security/process.js +20 -4
  560. package/src/skills/catalog.js +64 -0
  561. package/src/skills/content-resolver.js +124 -0
  562. package/src/skills/hosted-store.js +37 -0
  563. package/src/skills/index.js +29 -64
  564. package/src/skills/interaction.js +102 -0
  565. package/src/skills/local-store.js +228 -0
  566. package/src/skills/manifest.js +104 -0
  567. package/src/skills/metrics.js +31 -0
  568. package/src/skills/registry.js +184 -0
  569. package/src/skills/runtime.js +287 -0
  570. package/src/skills/slash.js +44 -0
  571. package/src/status/actions.js +192 -0
  572. package/src/tools/hydrate.js +5 -1
  573. package/src/tools/index.js +7 -0
  574. package/src/tools/redact.js +64 -0
  575. package/src/tools/registry.js +83 -0
  576. package/src/tools/runtime.js +257 -0
  577. package/src/tools/search.js +21 -8
  578. package/src/ui/ansi.js +117 -3
  579. package/src/ui/cli/activity.js +76 -7
  580. package/src/ui/cli/footer.js +110 -9
  581. package/src/ui/cli/help.js +96 -96
  582. package/src/ui/wireframes.js +166 -0
  583. package/test/account-session.test.mjs +28 -0
  584. package/test/apps-scaffold-contract.test.mjs +16 -1
  585. package/test/capabilities.test.mjs +1 -1
  586. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  587. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  588. package/test/cli/eval-live.test.mjs +219 -0
  589. package/test/cli/go.test.mjs +128 -0
  590. package/test/cli/local-vault-and-provider-setup.test.mjs +268 -0
  591. package/test/cli/mcp-client.test.mjs +245 -0
  592. package/test/cli/runtime-ui.test.mjs +69 -2
  593. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  594. package/test/cli/status-actions.test.mjs +88 -0
  595. package/test/cli/wireframes-go-registry.test.mjs +139 -0
  596. package/test/cloudflare-connector.test.mjs +3 -6
  597. package/test/cloudflare-runtime.test.mjs +8 -1
  598. package/test/context.test.mjs +15 -0
  599. package/test/error-diagnostics.test.mjs +9 -0
  600. package/test/fixtures/cad/courtyard-house.json +208 -0
  601. package/test/go/build-source-identity.test.mjs +31 -0
  602. package/test/go/cloudflare-probe.test.mjs +317 -0
  603. package/test/go/distribution.test.mjs +28 -0
  604. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  605. package/test/integration/app-command.test.mjs +55 -0
  606. package/test/integration/cad-discovery.test.mjs +158 -0
  607. package/test/integration/cad-docker-executor.test.mjs +249 -0
  608. package/test/integration/cad-execution.test.mjs +184 -0
  609. package/test/integration/cad-project-app.test.mjs +31 -0
  610. package/test/integration/cad-project-d1.test.mjs +25 -0
  611. package/test/integration/cad-project-native.test.mjs +24 -0
  612. package/test/integration/cad-project-workflow.test.mjs +9 -0
  613. package/test/integration/cad-project.test.mjs +82 -0
  614. package/test/integration/cli-help.test.mjs +5 -1
  615. package/test/integration/cms-site-tenancy-contract.test.mjs +256 -0
  616. package/test/integration/codebaseindex-ingest.test.mjs +166 -0
  617. package/test/integration/core-client.integration.test.mjs +55 -0
  618. package/test/integration/error-runtime-rpc.test.mjs +71 -0
  619. package/test/integration/features-resolve.test.mjs +128 -0
  620. package/test/integration/icon-registry.test.mjs +67 -0
  621. package/test/integration/ingest-discover-models.test.mjs +30 -0
  622. package/test/integration/install-script.test.mjs +110 -0
  623. package/test/integration/inventory-core.test.mjs +53 -0
  624. package/test/integration/local-fs.test.mjs +113 -0
  625. package/test/integration/plugins-cloudflare.integration.test.mjs +28 -0
  626. package/test/integration/provider-env-cli.test.mjs +3 -2
  627. package/test/integration/runtime-migrations.test.mjs +6 -1
  628. package/test/integration/runtime-status.integration.test.mjs +211 -0
  629. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  630. package/test/integration/sam-decision.test.mjs +584 -0
  631. package/test/integration/sam-kernel.test.mjs +99 -0
  632. package/test/integration/sam-planning-astar.test.mjs +279 -0
  633. package/test/integration/scaffold-cloudflare.test.mjs +46 -0
  634. package/test/integration/skill-runtime.test.mjs +240 -0
  635. package/test/integration/storage-architecture.test.mjs +154 -0
  636. package/test/integration/store-discovery.test.mjs +44 -0
  637. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  638. package/test/integration/terminal-exec.integration.test.mjs +86 -0
  639. package/test/integration/tool-runtime.test.mjs +124 -0
  640. package/test/integration/tool-schema.test.mjs +59 -0
  641. package/test/knowledge-service.test.mjs +4 -0
  642. package/test/local-sessions.test.mjs +11 -2
  643. package/test/local-studio-deploy.test.mjs +1 -1
  644. package/test/model-catalog.test.mjs +28 -1
  645. package/test/models.test.mjs +172 -11
  646. package/test/openai-responses.test.mjs +60 -0
  647. package/test/provider-credentials.test.mjs +15 -5
  648. package/test/responses-runner.test.mjs +321 -6
  649. package/test/shell.test.mjs +151 -6
  650. package/test/smoke.mjs +2 -2
  651. package/test/tools-search.test.mjs +33 -0
  652. package/test/unit/website-assets-bindings.test.mjs +60 -0
  653. package/test/whoami-resume.test.mjs +82 -3
  654. package/examples/gorilla-shell/README.md +0 -15
  655. package/src/lib/gorilla-template.js +0 -54
  656. package/templates/gorilla-shell/App.tsx +0 -639
  657. package/templates/gorilla-shell/README.md +0 -34
  658. package/templates/gorilla-shell/index.html +0 -15
  659. package/templates/gorilla-shell/main.jsx +0 -9
  660. package/templates/gorilla-shell/package.json +0 -19
  661. package/templates/gorilla-shell/vite.config.js +0 -21
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Shared Cloudflare account resolution for scaffold wizards.
3
+ * Reuses the same detection the CLI's `agentsam env init cloudflare` flow
4
+ * already relies on — never ask the user to hand-paste an account ID that
5
+ * `wrangler whoami` (or an existing env override) can already answer.
6
+ */
7
+ import { detectCloudflareAccounts } from '../../commands/env.js';
8
+
9
+ export async function resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc, detectAccounts = detectCloudflareAccounts }) {
10
+ const detected = detectAccounts();
11
+
12
+ if (detected.accounts.length === 1) {
13
+ const acct = detected.accounts[0];
14
+ note(`Detected Cloudflare account: ${pc.cyan(acct.name || acct.id)}`, 'Cloudflare account');
15
+ return acct.id;
16
+ }
17
+
18
+ if (detected.accounts.length > 1) {
19
+ const choice = await select({
20
+ message: 'Which Cloudflare account?',
21
+ options: detected.accounts.map((a) => ({ value: a.id, label: a.name || a.id, hint: a.id })),
22
+ });
23
+ if (isCancel(choice)) { cancel('Cancelled.'); process.exit(0); }
24
+ return choice;
25
+ }
26
+
27
+ note('Could not auto-detect a Cloudflare account (run `agentsam cloudflare` to check login status).', 'Cloudflare account');
28
+ const cfAccountId = await text({
29
+ message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
30
+ placeholder: 'abc123...',
31
+ validate(val) {
32
+ if (!val || val.trim().length === 0) return 'Required.';
33
+ },
34
+ });
35
+ if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
36
+ return cfAccountId.trim();
37
+ }
@@ -22,6 +22,7 @@ import {
22
22
  import pc from 'picocolors';
23
23
  import { writeFileTree } from '../writer.js';
24
24
  import { cmsTemplates } from '../templates/cms/index.js';
25
+ import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
25
26
 
26
27
  export async function runCmsWizard() {
27
28
  note('A Cloudflare Worker + D1 + R2 CMS site with reusable page templates.', 'CMS Site');
@@ -111,14 +112,7 @@ export async function runCmsWizard() {
111
112
  }
112
113
 
113
114
  // ── Step 7: Cloudflare account details ────────────────────────────────────
114
- const cfAccountId = await text({
115
- message: 'Cloudflare account ID? (from dash.cloudflare.com → right sidebar)',
116
- placeholder: 'abc123...',
117
- validate(val) {
118
- if (!val || val.trim().length === 0) return 'Required for wrangler.toml.';
119
- },
120
- });
121
- if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
115
+ const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
122
116
 
123
117
  // ── Step 8: Confirm before writing ───────────────────────────────────────
124
118
  const summary = [
@@ -16,6 +16,7 @@ import {
16
16
  import pc from 'picocolors';
17
17
  import { writeFileTree } from '../writer.js';
18
18
  import { workerApiTemplates } from '../templates/worker-api/index.js';
19
+ import { resolveCloudflareAccountId } from '../resolve-cloudflare-account.js';
19
20
 
20
21
  export async function runWorkerApiWizard() {
21
22
  note('A typed Cloudflare Worker with route handlers, D1 binding, and CORS ready.', 'Worker API');
@@ -52,14 +53,7 @@ export async function runWorkerApiWizard() {
52
53
  });
53
54
  if (isCancel(dbKind)) { cancel('Cancelled.'); process.exit(0); }
54
55
 
55
- const cfAccountId = await text({
56
- message: 'Cloudflare account ID?',
57
- placeholder: 'abc123...',
58
- validate(val) {
59
- if (!val || val.trim().length === 0) return 'Required.';
60
- },
61
- });
62
- if (isCancel(cfAccountId)) { cancel('Cancelled.'); process.exit(0); }
56
+ const cfAccountId = await resolveCloudflareAccountId({ text, select, isCancel, cancel, note, pc });
63
57
 
64
58
  const confirmed = await confirm({ message: `Write files to ./${projectName.trim()}/?` });
65
59
  if (isCancel(confirmed) || !confirmed) { cancel('Cancelled.'); process.exit(0); }
@@ -8,8 +8,9 @@ export const SLASH_COMMANDS = [
8
8
  { cmd: '/fast', description: 'Use provider Fast processing when the selected model supports it', lane: 'model' },
9
9
  { cmd: '/flex', description: 'Use provider Flex processing when the selected model supports it', lane: 'model' },
10
10
  { cmd: '/standard', description: 'Return to Standard provider processing', lane: 'model' },
11
+ { cmd: '/compact', description: 'Compact active provider context; status shows support, threshold, and receipt', lane: 'context' },
11
12
  { cmd: '/context', description: 'Show model context economics; add repo for Git bridge context', lane: 'context' },
12
- { cmd: '/status', description: 'Local project, DB, Git, and PTY health', lane: 'local' },
13
+ { cmd: '/status', description: 'Honest project awareness: account, models, terminal, live deploy', lane: 'local' },
13
14
  { cmd: '/models', description: 'Probe providers and provider-verified known models', lane: 'model' },
14
15
  { cmd: '/providers', description: 'Configure and verify machine provider credentials', lane: 'model' },
15
16
  { cmd: '/login', description: 'Sign in to Inner Animal Media and save the machine-local Agent Sam session', lane: 'identity' },
@@ -18,16 +19,23 @@ export const SLASH_COMMANDS = [
18
19
  { cmd: '/session', description: 'Show current session usage, cost, and resume receipt', lane: 'observability' },
19
20
  { cmd: '/usage', description: 'Show token usage, spend breakdown, and resume command', lane: 'observability' },
20
21
  { cmd: '/cf', description: 'Cloudflare native reads, Wrangler status, and CPU profile analysis', lane: 'cloudflare' },
22
+ { cmd: '/connections', description: 'Inspect live account, terminal, Worker, and Cloudflare connection evidence', lane: 'cloudflare' },
23
+ { cmd: '/tunnel', description: 'Choose and run a real Cloudflare Tunnel through Wrangler', lane: 'cloudflare' },
21
24
  { cmd: '/settings', description: 'Choose project, runtime, terminal, and model policy' },
22
25
  { cmd: '/pwd', description: 'Print working directory', lane: 'terminal' },
23
26
  { cmd: '/cd', description: 'Change working directory', lane: 'terminal' },
24
27
  { cmd: '/git', description: 'Run an explicit Git subcommand', lane: 'git' },
25
28
  { cmd: '/diff', description: 'Show the current Git diff', lane: 'git' },
26
- { cmd: '/db', description: 'Local SQLite status and query helpers', lane: 'data' },
29
+ { cmd: '/db', description: 'SQLite status; sources discovers stores; select knowledge sqlite|postgres [ENV]', lane: 'data' },
27
30
  { cmd: '/agent', description: 'Send a goal to the configured local Agent Sam runtime', lane: 'agent' },
31
+ { cmd: '/goap', description: 'Inspect and manage GOAP blackboard: /goap [status|goal|why|plan|list|new|switch|close]', lane: 'agent' },
32
+ { cmd: '/brand', description: 'Brand intelligence: /brand [scan|resolve|plan|inspect]', lane: 'product' },
33
+ { cmd: '/plan', description: 'Composable plans: /plan brand', lane: 'product' },
34
+ { cmd: '/next', description: 'Suggested next actions from session progression', lane: 'product' },
28
35
  { cmd: '/logs', description: 'Show local Agent Sam execution events', lane: 'observability' },
29
36
  { cmd: '/deploy', description: 'Add a cloud adapter and deploy intentionally', lane: 'deploy' },
30
37
  { cmd: '/clear', description: 'Clear the terminal display', lane: 'terminal' },
38
+ { cmd: '/skills', description: 'List resolvable slash skill vocabulary', lane: 'agent' },
31
39
  { cmd: '/help', description: 'Show the factual implemented command catalog' },
32
40
  { cmd: '/exit', description: 'Exit Agent Sam shell and return to the host terminal' },
33
41
  ];
@@ -37,6 +37,52 @@ function checksumSource(source) {
37
37
  return 'fnv1a32:' + (hash >>> 0).toString(16).padStart(8, '0');
38
38
  }
39
39
 
40
+ // A naive source.split(';') breaks on ANY semicolon -- including one
41
+ // inside a wrapped comment line's prose ("...available; standalone...")
42
+ // and every semicolon inside a CREATE TRIGGER's BEGIN...END body. Both
43
+ // happen in real migration files (this one has both). Comment-strip first,
44
+ // then split statement-aware: only treat ';' as a terminator outside a
45
+ // BEGIN/END block, so a trigger body survives as one statement instead of
46
+ // fragmenting into pieces that don't individually look like anything.
47
+ function stripSqlComments(source) {
48
+ return source
49
+ .split('\n')
50
+ .map((line) => (line.trim().startsWith('--') ? '' : line))
51
+ .join('\n');
52
+ }
53
+
54
+ function splitSqlStatements(source) {
55
+ const clean = stripSqlComments(source);
56
+ // CASE ... END is also closed by the bare keyword END (no BEGIN of its
57
+ // own) -- a trigger body containing a CASE expression has one more END
58
+ // than BEGIN. Track BEGIN and CASE as the same depth-increasing class so
59
+ // a CASE's END doesn't prematurely close the enclosing trigger's depth.
60
+ const tokens = clean.split(/(\bBEGIN\b|\bCASE\b|\bEND\b|;)/i);
61
+ const statements = [];
62
+ let current = '';
63
+ let depth = 0;
64
+ for (const token of tokens) {
65
+ if (/^(BEGIN|CASE)$/i.test(token)) { depth += 1; current += token; continue; }
66
+ if (/^END$/i.test(token)) { depth = Math.max(0, depth - 1); current += token; continue; }
67
+ if (token === ';' && depth === 0) {
68
+ const trimmed = current.trim();
69
+ if (trimmed) statements.push(trimmed);
70
+ current = '';
71
+ continue;
72
+ }
73
+ current += token;
74
+ }
75
+ const trimmed = current.trim();
76
+ if (trimmed) statements.push(trimmed);
77
+ return statements;
78
+ }
79
+
80
+ function isIdempotentSafe(source) {
81
+ const statements = splitSqlStatements(source);
82
+ const IDEMPOTENT_RE = /^(CREATE\s+TABLE\s+IF\s+NOT\s+EXISTS|CREATE\s+(UNIQUE\s+)?INDEX\s+IF\s+NOT\s+EXISTS|CREATE\s+TRIGGER\s+IF\s+NOT\s+EXISTS|PRAGMA)/i;
83
+ return statements.length > 0 && statements.every((stmt) => IDEMPOTENT_RE.test(stmt.trim()));
84
+ }
85
+
40
86
  export async function listAppliedMigrations(db) {
41
87
  ensureLedger(db);
42
88
  const result = await db.prepare(
@@ -60,7 +106,23 @@ export async function applyRuntimeMigrations(db, options = {}) {
60
106
 
61
107
  if (previous) {
62
108
  if (previous.checksum && previous.checksum !== checksum) {
63
- throw new Error('migration_checksum_mismatch:' + id);
109
+ if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
110
+ // File grew via additive, idempotent statements only (e.g. a new
111
+ // CREATE TABLE IF NOT EXISTS appended for a later feature). Safe to
112
+ // re-run and accept the new checksum rather than hard-lock the CLI.
113
+ db.exec('BEGIN IMMEDIATE');
114
+ try {
115
+ db.exec(source);
116
+ await db.prepare(
117
+ 'UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?'
118
+ ).bind(checksum, id).run();
119
+ db.exec('COMMIT');
120
+ results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
121
+ continue;
122
+ } catch (error) {
123
+ try { db.exec('ROLLBACK'); } catch {}
124
+ throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
125
+ }
64
126
  }
65
127
  results.push({ id, filename, status: 'already_applied', checksum });
66
128
  continue;
@@ -88,6 +150,52 @@ export async function applyRuntimeMigrations(db, options = {}) {
88
150
  });
89
151
  }
90
152
 
153
+ // Synchronous entry point for the interactive shell. Both runners consume the
154
+ // same versioned SQL and checksums; schema ownership stays in migrations/runtime.
155
+ export function applyRuntimeMigrationsSync(db, options = {}) {
156
+ const dir = path.resolve(options.migrationsDir || DEFAULT_MIGRATIONS_DIR);
157
+ ensureLedger(db);
158
+ const applied = new Map(db.prepare(
159
+ 'SELECT id, applied_at_unix, checksum FROM agentsam_schema_migrations ORDER BY id'
160
+ ).all().map((row) => [String(row.id), row]));
161
+ const results = [];
162
+ for (const filename of migrationFiles(dir)) {
163
+ const id = filename.replace(/\.sql$/i, '');
164
+ const source = fs.readFileSync(path.join(dir, filename), 'utf8');
165
+ const checksum = checksumSource(source);
166
+ const previous = applied.get(id);
167
+ if (previous) {
168
+ if (previous.checksum && previous.checksum !== checksum) {
169
+ if (!isIdempotentSafe(source)) throw new Error('migration_checksum_mismatch:' + id);
170
+ db.exec('BEGIN IMMEDIATE');
171
+ try {
172
+ db.exec(source);
173
+ db.prepare('UPDATE agentsam_schema_migrations SET checksum = ? WHERE id = ?').run(checksum, id);
174
+ db.exec('COMMIT');
175
+ results.push({ id, filename, status: 'repaired', checksum, previous_checksum: previous.checksum });
176
+ continue;
177
+ } catch (error) {
178
+ try { db.exec('ROLLBACK'); } catch {}
179
+ throw new Error('migration_repair_failed:' + id + ':' + (error?.message || error));
180
+ }
181
+ }
182
+ results.push({ id, filename, status: 'already_applied', checksum });
183
+ continue;
184
+ }
185
+ db.exec('BEGIN IMMEDIATE');
186
+ try {
187
+ db.exec(source);
188
+ db.prepare('INSERT INTO agentsam_schema_migrations (id, checksum) VALUES (?, ?)').run(id, checksum);
189
+ db.exec('COMMIT');
190
+ results.push({ id, filename, status: 'applied', checksum });
191
+ } catch (error) {
192
+ try { db.exec('ROLLBACK'); } catch {}
193
+ throw new Error('migration_failed:' + id + ':' + (error?.message || error));
194
+ }
195
+ }
196
+ return Object.freeze({ migrationsDir: dir, total: results.length, applied: results.filter((row) => row.status === 'applied').length, results: Object.freeze(results) });
197
+ }
198
+
91
199
  export function runtimeMigrationsDirectory() {
92
200
  return DEFAULT_MIGRATIONS_DIR;
93
201
  }
@@ -2,12 +2,28 @@ import path from 'node:path';
2
2
  import { createHash, randomUUID } from 'node:crypto';
3
3
  import { createLocalSqliteDatabase } from './sqlite.js';
4
4
  import { applyRuntimeMigrations } from './migrations.js';
5
+ import { findCliProjectRoot } from '../lib/cli-preferences.js';
6
+ import { getLocalDatabasePath, tryReadProjectConfig } from '../lib/project-config.js';
5
7
 
6
8
  function clean(value) { return value == null ? '' : String(value).trim(); }
7
9
  function hash(value) { return createHash('sha256').update(String(value || '')).digest('hex'); }
8
10
 
9
- export function runtimeDatabasePath(cwd = process.cwd()) {
10
- return path.join(path.resolve(cwd), '.agentsam', 'data', 'agentsam.sqlite');
11
+ export const SQLITE_RUNTIME_CAPABILITIES = Object.freeze({
12
+ transactions: true,
13
+ relational_queries: true,
14
+ ttl_cleanup: 'application_managed',
15
+ remote_shared_state: false,
16
+ local_only: true,
17
+ concurrent_writers: 'sqlite_serialized',
18
+ migrations: true,
19
+ vector_search: false,
20
+ blob_storage: false,
21
+ distributed_actor_semantics: false,
22
+ });
23
+
24
+ export function runtimeDatabasePath(startDir = process.cwd()) {
25
+ const root = findCliProjectRoot(startDir);
26
+ return path.resolve(root, getLocalDatabasePath(tryReadProjectConfig(root)));
11
27
  }
12
28
 
13
29
  async function withStore(cwd, fn) {
@@ -26,7 +42,7 @@ export function createRuntimeRunId() {
26
42
 
27
43
  export async function startRuntimeRun(value = {}) {
28
44
  const id = clean(value.id) || createRuntimeRunId();
29
- await withStore(value.cwd, async (db) => {
45
+ await withStore(value.projectRoot || value.cwd, async (db) => {
30
46
  await db.prepare(`
31
47
  INSERT INTO agentsam_agent_run (
32
48
  id, account_id, source_client, surface, mode, model_key,
@@ -46,7 +62,7 @@ export async function startRuntimeRun(value = {}) {
46
62
 
47
63
  export async function finishRuntimeRun(value = {}) {
48
64
  if (!clean(value.id)) return;
49
- await withStore(value.cwd, async (db) => {
65
+ await withStore(value.projectRoot || value.cwd, async (db) => {
50
66
  const usage = value.usage || {};
51
67
  await db.prepare(`
52
68
  UPDATE agentsam_agent_run
@@ -87,7 +103,7 @@ export async function recordRuntimeCompaction(value = {}) {
87
103
  const after = Math.max(0, Math.round(Number(value.tokens_after || 0)));
88
104
  const sourceHash = hash(summary || JSON.stringify(value.metadata || {}));
89
105
 
90
- await withStore(value.cwd, async (db) => {
106
+ await withStore(value.projectRoot || value.cwd, async (db) => {
91
107
  await db.prepare(`
92
108
  INSERT INTO agentsam_compaction_events (
93
109
  id, account_id, agent_run_id, compaction_type, compaction_scope,
@@ -139,3 +155,13 @@ export async function recordRuntimeCompaction(value = {}) {
139
155
  });
140
156
  return id;
141
157
  }
158
+
159
+ export async function pruneExpiredRuntimeState(value = {}) {
160
+ const nowUnix = Number.isFinite(Number(value.nowUnix)) ? Math.floor(Number(value.nowUnix)) : Math.floor(Date.now() / 1000);
161
+ return withStore(value.projectRoot || value.cwd, async (db) => {
162
+ const digests = await db.prepare('DELETE FROM agentsam_context_digest WHERE expires_at_unix IS NOT NULL AND expires_at_unix <= ?').bind(nowUnix).run();
163
+ const compactions = await db.prepare('DELETE FROM agentsam_compaction_events WHERE expires_at_epoch IS NOT NULL AND expires_at_epoch <= ?').bind(nowUnix).run();
164
+ const approvals = await db.prepare("UPDATE agentsam_approval_queue SET status = 'expired' WHERE status = 'pending' AND expires_at IS NOT NULL AND expires_at <= ?").bind(nowUnix).run();
165
+ return { digests: Number(digests.changes || 0), compactions: Number(compactions.changes || 0), approvals_expired: Number(approvals.changes || 0) };
166
+ });
167
+ }
@@ -1,7 +1,10 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
+ import { createRequire } from 'node:module';
3
4
  import { applyRuntimeMigrations } from './migrations.js';
4
5
 
6
+ const require = createRequire(import.meta.url);
7
+
5
8
  async function loadSqlite() {
6
9
  try {
7
10
  return await import('node:sqlite');
@@ -18,11 +21,43 @@ function resolveFile(filePath) {
18
21
  return path.resolve(String(filePath || '.agentsam/data/agentsam.sqlite'));
19
22
  }
20
23
 
24
+ function prepareDatabaseFile(resolved) {
25
+ const dir = path.dirname(resolved);
26
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
27
+ if (process.platform !== 'win32') {
28
+ try { fs.chmodSync(dir, 0o700); } catch { /* platform policy may own directory mode */ }
29
+ }
30
+ }
31
+
32
+ function restrictDatabaseFile(resolved) {
33
+ if (process.platform !== 'win32') {
34
+ try { fs.chmodSync(resolved, 0o600); } catch { /* platform policy may own file mode */ }
35
+ }
36
+ }
37
+
38
+ // The shell's session API is synchronous. It uses the same database file and
39
+ // migration directory as the async runtime store, with no second state store.
40
+ export function createLocalSqliteDatabaseSync(filePath = '.agentsam/data/agentsam.sqlite') {
41
+ let DatabaseSync;
42
+ try { ({ DatabaseSync } = require('node:sqlite')); }
43
+ catch (error) {
44
+ const wrapped = new Error('Local SQLite requires Node 22.5+ (node:sqlite). Upgrade Node, then retry.');
45
+ wrapped.cause = error;
46
+ throw wrapped;
47
+ }
48
+ const resolved = resolveFile(filePath);
49
+ prepareDatabaseFile(resolved);
50
+ const db = new DatabaseSync(resolved);
51
+ restrictDatabaseFile(resolved);
52
+ return db;
53
+ }
54
+
21
55
  export async function createLocalSqliteDatabase(filePath = '.agentsam/data/agentsam.sqlite') {
22
56
  const { DatabaseSync } = await loadSqlite();
23
57
  const resolved = resolveFile(filePath);
24
- fs.mkdirSync(path.dirname(resolved), { recursive: true });
58
+ prepareDatabaseFile(resolved);
25
59
  const database = new DatabaseSync(resolved);
60
+ restrictDatabaseFile(resolved);
26
61
 
27
62
  return {
28
63
  filePath: resolved,
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Local runtime workspace capability — short-lived FS/PTY authority for one root.
3
+ *
4
+ * Compatible with later:
5
+ * account → terminal connection → enrolled instance → approved workspace root
6
+ *
7
+ * Local today:
8
+ * start-local binds one root + mints one capability.
9
+ * Browser cannot invent an absolute root to gain authority.
10
+ */
11
+
12
+ import crypto from 'node:crypto';
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+
16
+ export const WORKSPACE_CAPABILITY_HEADER = 'x-agentsam-workspace-capability';
17
+ export const LOCAL_RUNTIME_FILE = 'local-runtime.json';
18
+
19
+ /**
20
+ * @param {{ root: string, port: number, host?: string }} opts
21
+ */
22
+ export function mintWorkspaceCapability(opts) {
23
+ const root = path.resolve(opts.root);
24
+ const workspace_id = `ws_${crypto.randomBytes(10).toString('hex')}`;
25
+ const capability = `awc_${crypto.randomBytes(24).toString('hex')}`;
26
+ const expires_at = new Date(Date.now() + 12 * 60 * 60 * 1000).toISOString();
27
+ return Object.freeze({
28
+ schema: 'agentsam.local-workspace-capability.v1',
29
+ workspace_id,
30
+ capability,
31
+ root,
32
+ host: opts.host || '127.0.0.1',
33
+ port: opts.port,
34
+ runtimeBaseUrl: `http://${opts.host || '127.0.0.1'}:${opts.port}`,
35
+ fsBaseUrl: `http://${opts.host || '127.0.0.1'}:${opts.port}/v1/fs`,
36
+ expires_at,
37
+ purpose: 'local.filesystem+pty',
38
+ });
39
+ }
40
+
41
+ /**
42
+ * Persist capability beside the authorized root (machine-local; not file content authority).
43
+ * @param {object} record
44
+ */
45
+ export function writeLocalRuntimeRecord(record) {
46
+ const dir = path.join(record.root, '.agentsam');
47
+ fs.mkdirSync(dir, { recursive: true });
48
+ const file = path.join(dir, LOCAL_RUNTIME_FILE);
49
+ fs.writeFileSync(file, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
50
+ return file;
51
+ }
52
+
53
+ /**
54
+ * @param {string} root
55
+ */
56
+ export function readLocalRuntimeRecord(root) {
57
+ const file = path.join(path.resolve(root), '.agentsam', LOCAL_RUNTIME_FILE);
58
+ if (!fs.existsSync(file)) return null;
59
+ try {
60
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
61
+ } catch {
62
+ return null;
63
+ }
64
+ }
65
+
66
+ /**
67
+ * @param {import('http').IncomingMessage} req
68
+ * @param {string} expected
69
+ */
70
+ export function extractCapability(req, expected) {
71
+ const header = req.headers[WORKSPACE_CAPABILITY_HEADER]
72
+ || req.headers.authorization
73
+ || '';
74
+ let token = '';
75
+ if (typeof header === 'string') {
76
+ if (header.toLowerCase().startsWith('bearer ')) token = header.slice(7).trim();
77
+ else token = header.trim();
78
+ }
79
+ if (!token && req.url) {
80
+ try {
81
+ const u = new URL(req.url, 'http://127.0.0.1');
82
+ token = u.searchParams.get('capability') || '';
83
+ } catch {
84
+ /* ignore */
85
+ }
86
+ }
87
+ return {
88
+ ok: Boolean(expected && token && token === expected),
89
+ token,
90
+ };
91
+ }
92
+
93
+ /**
94
+ * Loopback + Studio origin allowlist. Never `*`.
95
+ * @param {string|undefined} origin
96
+ * @param {string[]} [extra]
97
+ */
98
+ export function isAllowedStudioOrigin(origin, extra = []) {
99
+ if (!origin || origin === 'null') return true; // non-browser / same-origin tooling
100
+ const allow = [
101
+ 'http://127.0.0.1:8080',
102
+ 'http://localhost:8080',
103
+ 'http://127.0.0.1:5173',
104
+ 'http://localhost:5173',
105
+ 'http://127.0.0.1:3000',
106
+ 'http://localhost:3000',
107
+ ...extra,
108
+ ];
109
+ return allow.includes(origin);
110
+ }
111
+
112
+ /**
113
+ * @param {import('http').IncomingMessage} req
114
+ */
115
+ export function isLoopbackRemote(req) {
116
+ const raw = req.socket?.remoteAddress || '';
117
+ return raw === '127.0.0.1'
118
+ || raw === '::1'
119
+ || raw === '::ffff:127.0.0.1'
120
+ || raw.endsWith('127.0.0.1');
121
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Minimal repository/index freshness bridge.
3
+ * Filesystem writes mark generation stale — do not re-index on every keystroke.
4
+ */
5
+
6
+ /** @type {Map<string, { generation: number, stale_paths: Set<string>, updated_at: string }>} */
7
+ const roots = new Map();
8
+
9
+ /**
10
+ * @param {string} root
11
+ * @param {{ paths?: string[], reason?: string }} [opts]
12
+ */
13
+ export function markRepositoryStale(root, opts = {}) {
14
+ const key = String(root);
15
+ const prev = roots.get(key) || {
16
+ generation: 0,
17
+ stale_paths: new Set(),
18
+ updated_at: null,
19
+ };
20
+ const nextGen = prev.generation + 1;
21
+ const stale_paths = new Set(prev.stale_paths);
22
+ for (const p of opts.paths || []) stale_paths.add(String(p));
23
+ const record = {
24
+ generation: nextGen,
25
+ stale_paths,
26
+ updated_at: new Date().toISOString(),
27
+ reason: opts.reason || 'filesystem_write',
28
+ };
29
+ roots.set(key, record);
30
+ return {
31
+ ok: true,
32
+ schema: 'agentsam.repository-freshness.v1',
33
+ root: key,
34
+ generation: record.generation,
35
+ stale_paths: [...stale_paths].slice(0, 200),
36
+ updated_at: record.updated_at,
37
+ reason: record.reason,
38
+ };
39
+ }
40
+
41
+ /**
42
+ * @param {string} root
43
+ */
44
+ export function getRepositoryFreshness(root) {
45
+ const key = String(root);
46
+ const record = roots.get(key);
47
+ if (!record) {
48
+ return {
49
+ ok: true,
50
+ schema: 'agentsam.repository-freshness.v1',
51
+ root: key,
52
+ generation: 0,
53
+ stale: false,
54
+ stale_paths: [],
55
+ };
56
+ }
57
+ return {
58
+ ok: true,
59
+ schema: 'agentsam.repository-freshness.v1',
60
+ root: key,
61
+ generation: record.generation,
62
+ stale: record.stale_paths.size > 0 || record.generation > 0,
63
+ stale_paths: [...record.stale_paths].slice(0, 200),
64
+ updated_at: record.updated_at,
65
+ reason: record.reason,
66
+ };
67
+ }
68
+
69
+ /**
70
+ * @param {string} root
71
+ */
72
+ export function clearRepositoryFreshness(root) {
73
+ roots.delete(String(root));
74
+ return { ok: true };
75
+ }