@inneranimalmedia/agentsam-sdk 2.6.3 → 2.6.5

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 (608) hide show
  1. package/AGENTSAM.md +17 -0
  2. package/README.md +31 -10
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam +16 -1
  57. package/bin/agentsam-rapid-rust +36 -0
  58. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  59. package/docs/BRAND_INTELLIGENCE.md +1 -1
  60. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  61. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  62. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  63. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  64. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  65. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  66. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  67. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  68. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  69. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
  70. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  71. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  72. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  73. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  74. package/docs/architecture/SAM_KERNEL.md +181 -0
  75. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  76. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  77. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  78. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  79. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  80. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  81. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  82. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  83. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  84. package/docs/contracts/capability-install-planner.md +67 -0
  85. package/docs/contracts/environment-vocabulary.md +195 -0
  86. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  87. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  88. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  89. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  90. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  91. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  92. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  93. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  94. package/docs/plugins.md +2 -2
  95. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  96. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  97. package/docs/product/README.md +8 -0
  98. package/docs/rapid-rust-wasm.md +35 -0
  99. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  100. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  101. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  102. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  103. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  104. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  105. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  106. package/migrations/d1/0014_auth_event_log.sql +20 -0
  107. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  108. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  109. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  110. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  111. package/package.json +88 -14
  112. package/packages/agentsam-brand/README.md +106 -11
  113. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  114. package/packages/agentsam-brand/package.json +39 -7
  115. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  116. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  117. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  118. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  119. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  120. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  121. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  122. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  123. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  124. package/packages/agentsam-brand/src/core/errors.js +12 -0
  125. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  126. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  127. package/packages/agentsam-brand/src/core/keys.js +83 -0
  128. package/packages/agentsam-brand/src/core/naming.js +142 -0
  129. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  130. package/packages/agentsam-brand/src/core/pack.js +305 -0
  131. package/packages/agentsam-brand/src/core/plan.js +276 -0
  132. package/packages/agentsam-brand/src/core/preview.js +159 -0
  133. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  134. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  135. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  136. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  137. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  138. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  139. package/packages/agentsam-brand/src/core/promote.js +288 -0
  140. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  141. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  142. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  143. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  144. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  145. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  146. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  147. package/packages/agentsam-brand/src/index.js +193 -36
  148. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  149. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  150. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  151. package/packages/agentsam-brand/src/presets/index.js +40 -0
  152. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  153. package/packages/agentsam-brand/src/presets/model.json +8 -0
  154. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  155. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  156. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  157. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  158. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  159. package/packages/agentsam-contracts/src/errors.ts +16 -0
  160. package/packages/agentsam-errors/src/envelope.js +53 -0
  161. package/packages/agentsam-errors/src/index.js +1 -0
  162. package/packages/agentsam-errors/src/recovery.js +301 -0
  163. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  164. package/packages/agentsam-knowledge/src/providers/index.js +20 -6
  165. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  166. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  167. package/packages/agentsam-nav/package.json +2 -2
  168. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  169. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  170. package/packages/agentsam-rapid-rust/README.md +5 -0
  171. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  172. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  173. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  174. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  175. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  176. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  177. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  178. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  179. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  180. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  181. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  182. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  183. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  184. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  185. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  186. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  187. package/packages/agentsam-repository/src/index.js +1 -0
  188. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  189. package/packages/agentsam-repository/src/source-types.js +85 -0
  190. package/packages/agentsam-vault/README.md +96 -0
  191. package/packages/agentsam-vault/package.json +32 -0
  192. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  193. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  194. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  195. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  196. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  197. package/packages/agentsam-vault/src/index.d.ts +9 -0
  198. package/packages/agentsam-vault/src/index.js +27 -0
  199. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  200. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  201. package/packages/agentsam-workbench/README.md +24 -0
  202. package/packages/agentsam-workbench/package.json +38 -0
  203. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  204. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  205. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  206. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  207. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  208. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  209. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  210. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  211. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  212. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  213. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  214. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  215. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  216. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  217. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  218. package/packages/agentsam-workbench/src/index.ts +6 -0
  219. package/packages/agentsam-workbench/src/project-control.css +160 -0
  220. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  221. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  222. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  223. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  224. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  225. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  226. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  227. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  228. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  229. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  230. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  231. package/packages/agentsam-workbench/tsconfig.json +13 -0
  232. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  233. package/packages/connectors/cloudflare/package.json +3 -1
  234. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  235. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  236. package/packages/connectors/cloudflare/src/credential.js +318 -0
  237. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  238. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  239. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  240. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  241. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  242. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  243. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  244. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  245. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  246. package/packages/connectors/cloudflare/src/index.js +102 -265
  247. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  248. package/packages/connectors/cloudflare/src/owner.js +42 -12
  249. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  250. package/packages/connectors/cloudflare/src/routes.js +318 -144
  251. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  252. package/packages/connectors/cloudflare/src/vault.js +2 -2
  253. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  254. package/packages/connectors/cloudflare/tests/connector.test.mjs +51 -30
  255. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  256. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  257. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  258. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  259. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +31 -2
  260. package/packages/identity/README.md +1 -1
  261. package/packages/identity/backend/README.md +1 -1
  262. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  263. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
  264. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  265. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  266. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  267. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  268. package/packages/identity/package.json +3 -2
  269. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  270. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  271. package/packages/identity/src/adapters/cloudflare-d1/index.js +153 -24
  272. package/packages/identity/src/adapters/sqlite/index.js +322 -0
  273. package/packages/identity/src/app/verify-app.js +95 -0
  274. package/packages/identity/src/contracts/auth-config.js +28 -8
  275. package/packages/identity/src/contracts/external-identity.js +1 -1
  276. package/packages/identity/src/contracts/identity-store.js +115 -0
  277. package/packages/identity/src/contracts/provider.js +1 -0
  278. package/packages/identity/src/contracts/route-ids.js +30 -0
  279. package/packages/identity/src/contracts/route-projection.js +218 -0
  280. package/packages/identity/src/contracts/routes.js +11 -0
  281. package/packages/identity/src/core/browser-paths.js +4 -5
  282. package/packages/identity/src/core/constants.js +13 -8
  283. package/packages/identity/src/core/session-policy.js +32 -0
  284. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  285. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
  286. package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
  287. package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
  288. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  289. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  290. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  291. package/packages/identity/src/index.js +41 -0
  292. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  293. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  294. package/packages/identity/src/migrations/README.md +5 -2
  295. package/packages/identity/src/oauth/README.md +19 -8
  296. package/packages/identity/src/oauth/consent-view.js +388 -0
  297. package/packages/identity/src/oauth/credentials.js +46 -19
  298. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  299. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  300. package/packages/identity/src/oauth/iam-platform.js +8 -7
  301. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  302. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  303. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  304. package/packages/identity/src/providers/iam/index.js +27 -5
  305. package/packages/identity/src/server/identity-service.js +61 -15
  306. package/packages/identity/src/server/mount-policy.js +30 -0
  307. package/packages/identity/src/server/post-auth.js +79 -0
  308. package/packages/identity/src/server/worker-router.js +208 -146
  309. package/packages/identity/tests/auth-config.test.mjs +3 -2
  310. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  311. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  312. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  313. package/packages/identity/tests/identity-service.test.mjs +52 -5
  314. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  315. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  316. package/packages/identity/tests/oauth-credentials.test.mjs +20 -5
  317. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  318. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  319. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  320. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  321. package/packages/runtime-protocol/src/index.js +154 -0
  322. package/packages/theme-church-site/package.json +2 -1
  323. package/packages/theme-church-site/src/index.js +1 -0
  324. package/packages/theme-companions-site/package.json +2 -1
  325. package/packages/theme-companions-site/src/index.js +1 -0
  326. package/packages/theme-floors-site/package.json +2 -1
  327. package/packages/theme-floors-site/src/index.js +1 -0
  328. package/packages/theme-fuelnfree-site/package.json +2 -1
  329. package/packages/theme-fuelnfree-site/src/index.js +1 -0
  330. package/packages/theme-handyman-site/package.json +2 -1
  331. package/packages/theme-handyman-site/src/index.js +1 -0
  332. package/packages/theme-insurance-site/package.json +2 -1
  333. package/packages/theme-insurance-site/src/index.js +1 -0
  334. package/packages/theme-scenes/README.md +164 -0
  335. package/packages/theme-scenes/package.json +53 -0
  336. package/packages/theme-scenes/src/blocks/index.js +30 -0
  337. package/packages/theme-scenes/src/contracts/index.js +286 -0
  338. package/packages/theme-scenes/src/demos/index.js +65 -0
  339. package/packages/theme-scenes/src/index.js +75 -0
  340. package/packages/theme-scenes/src/presets/index.js +263 -0
  341. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  342. package/packages/theme-scenes/src/scenes/index.js +146 -0
  343. package/packages/theme-scenes/src/shell/index.js +47 -0
  344. package/packages/theme-scenes/src/themes/index.js +129 -0
  345. package/packages/theme-scenes/src/visuals/index.js +41 -0
  346. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  347. package/packages/theme-shinshu-site/package.json +2 -1
  348. package/packages/theme-shinshu-site/src/index.js +1 -0
  349. package/packages/work-graph/src/index.js +34 -1
  350. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  351. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  352. package/protocol/README.md +15 -7
  353. package/protocol/apps/agentsam.app.v1.schema.json +133 -0
  354. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  355. package/protocol/assets/README.md +9 -0
  356. package/protocol/assets/asset-record.v1.schema.json +64 -0
  357. package/protocol/brand/brandpack.v1.schema.json +43 -0
  358. package/protocol/credentials/issue.v1.schema.json +38 -0
  359. package/protocol/database/connection.v1.schema.json +41 -0
  360. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  361. package/protocol/errors/error-envelope.schema.json +135 -1
  362. package/protocol/errors/recovery.v1.schema.json +50 -0
  363. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  364. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  365. package/protocol/sam/activity.v1.schema.json +48 -0
  366. package/protocol/sam/answer.v1.schema.json +35 -0
  367. package/protocol/sam/calibration.v1.schema.json +21 -0
  368. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  369. package/protocol/sam/evaluation.v1.schema.json +19 -0
  370. package/protocol/sam/operation.schema.json +66 -0
  371. package/protocol/sam/outcome.v1.schema.json +36 -0
  372. package/protocol/sam/question.v1.schema.json +26 -0
  373. package/protocol/sam/registry.seed.json +153 -0
  374. package/protocol/sam/result.schema.json +53 -0
  375. package/protocol/sam/state.v1.schema.json +23 -0
  376. package/protocol/scoring/README.md +10 -0
  377. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  378. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  379. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  380. package/protocol/ui/icon-registry.mjs +227 -0
  381. package/protocol/ui/icon.v1.schema.json +51 -0
  382. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  383. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  384. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  385. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  386. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  387. package/scripts/build_rapid_rust_cli.py +83 -0
  388. package/skills/README.md +22 -9
  389. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  390. package/skills/catalog.json +14 -0
  391. package/src/attachments/index.js +6 -0
  392. package/src/attachments/intake.js +235 -0
  393. package/src/capabilities/repository-snapshot.js +19 -2
  394. package/src/cli/command-catalog.js +138 -0
  395. package/src/cli/dispatch.js +48 -0
  396. package/src/cli.js +225 -27
  397. package/src/commands/account-auth.js +94 -8
  398. package/src/commands/api-key.js +244 -0
  399. package/src/commands/app.js +365 -29
  400. package/src/commands/billing.js +127 -0
  401. package/src/commands/brand.js +86 -74
  402. package/src/commands/cheat-sheet.js +154 -0
  403. package/src/commands/cloudflare-login.js +222 -0
  404. package/src/commands/cloudflare.js +453 -23
  405. package/src/commands/codebaseindex.js +693 -0
  406. package/src/commands/compute.js +4 -0
  407. package/src/commands/connections.js +11 -5
  408. package/src/commands/credentials.js +116 -0
  409. package/src/commands/env.js +152 -25
  410. package/src/commands/gcloud-auth.js +427 -0
  411. package/src/commands/go.js +366 -53
  412. package/src/commands/google-cloud.js +375 -0
  413. package/src/commands/identity-init.js +2 -2
  414. package/src/commands/interaction-clack.js +115 -0
  415. package/src/commands/mcp.js +226 -33
  416. package/src/commands/models.js +1 -1
  417. package/src/commands/ollama.js +3 -2
  418. package/src/commands/plugins.js +7 -2
  419. package/src/commands/product.js +36 -0
  420. package/src/commands/providers.js +62 -14
  421. package/src/commands/runtime-status.js +28 -9
  422. package/src/commands/runtime.js +313 -0
  423. package/src/commands/rust.js +24 -0
  424. package/src/commands/setup.js +279 -0
  425. package/src/commands/shell.js +59 -5
  426. package/src/commands/skill.js +248 -0
  427. package/src/commands/skills.js +1 -1
  428. package/src/commands/start-local.js +6 -2
  429. package/src/commands/terminal.js +171 -0
  430. package/src/commands/update.js +140 -0
  431. package/src/commands/whoami.js +392 -56
  432. package/src/features/resolve.js +1 -0
  433. package/src/go/build.js +229 -39
  434. package/src/go/cloudflare.js +506 -105
  435. package/src/go/container.js +120 -0
  436. package/src/go/contract.js +9 -4
  437. package/src/go/discover.js +149 -33
  438. package/src/go/index.js +15 -3
  439. package/src/go/native-probe-runner.mjs +119 -0
  440. package/src/go/{registry.js → official-registry.js} +64 -7
  441. package/src/go/official-release.js +10 -0
  442. package/src/go/receipts.js +77 -10
  443. package/src/go/verify.js +9 -2
  444. package/src/index.js +31 -0
  445. package/src/indexing/ingest/discover-models.js +298 -0
  446. package/src/indexing/ingest/inventory.js +478 -0
  447. package/src/indexing/ingest/job-graph.js +181 -0
  448. package/src/indexing/ingest/materials.js +204 -0
  449. package/src/indexing/ingest/style-evidence.js +181 -0
  450. package/src/knowledge/source.js +3 -3
  451. package/src/lib/account-session.js +11 -4
  452. package/src/lib/app-authority.js +172 -0
  453. package/src/lib/auth.js +94 -21
  454. package/src/lib/core-client.js +5 -6
  455. package/src/lib/credentials-audit.js +451 -0
  456. package/src/lib/deploy/health.js +24 -6
  457. package/src/lib/detect-context.js +7 -1
  458. package/src/lib/google-cloud-connection.js +270 -0
  459. package/src/lib/google-cloud-inventory.js +385 -0
  460. package/src/lib/google-desktop-oauth.js +372 -0
  461. package/src/lib/google-studio-brokered-oauth.js +158 -0
  462. package/src/lib/identity-scaffold.js +24 -6
  463. package/src/lib/init-options.js +192 -0
  464. package/src/lib/local-scaffold.js +48 -16
  465. package/src/lib/provider-command-remediation.js +308 -0
  466. package/src/lib/provider-credentials.js +71 -21
  467. package/src/lib/scaffold/index.js +8 -2
  468. package/src/lib/scaffold/mcp-server.js +43 -0
  469. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  470. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  471. package/src/lib/scaffold/wizards/cms.js +93 -0
  472. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  473. package/src/lib/setup/contract.js +26 -0
  474. package/src/lib/setup/discover.js +116 -0
  475. package/src/lib/setup/execute.js +205 -0
  476. package/src/lib/setup/planner.js +134 -0
  477. package/src/lib/setup/recipes.js +235 -0
  478. package/src/lib/setup/runtime-persist.js +197 -0
  479. package/src/lib/setup/runtime.js +394 -0
  480. package/src/lib/slash-commands.js +3 -0
  481. package/src/lib/terminal/machine-identity.js +95 -0
  482. package/src/lib/terminal-local.js +164 -0
  483. package/src/lib/terminal-scopes.js +52 -0
  484. package/src/lib/whoami-capabilities.js +184 -0
  485. package/src/local-fs/capability.js +121 -0
  486. package/src/local-fs/freshness.js +75 -0
  487. package/src/local-fs/index.js +385 -0
  488. package/src/local-fs/paths.js +100 -0
  489. package/src/local-pty/server.js +326 -21
  490. package/src/mcp/authority.js +58 -108
  491. package/src/mcp/client-adapters.js +68 -144
  492. package/src/mcp/client.js +142 -122
  493. package/src/mcp/cloudflare-bundles.js +225 -0
  494. package/src/mcp/index.js +12 -0
  495. package/src/models/ai-access-onboarding.js +112 -0
  496. package/src/models/discovery.js +10 -2
  497. package/src/models/inventory-core.js +9 -1
  498. package/src/plugins/cloudflare.js +1 -1
  499. package/src/providers/ollama-chat.js +2 -1
  500. package/src/sam/activity/index.js +183 -0
  501. package/src/sam/client.js +252 -0
  502. package/src/sam/decision/calibration.js +109 -0
  503. package/src/sam/decision/confidence.js +126 -0
  504. package/src/sam/decision/evaluate.js +157 -0
  505. package/src/sam/decision/evaluators/deterministic.js +341 -0
  506. package/src/sam/decision/evaluators/heuristic.js +61 -0
  507. package/src/sam/decision/evaluators/select.js +50 -0
  508. package/src/sam/decision/evaluators/semantic.js +149 -0
  509. package/src/sam/decision/hierarchical.js +61 -0
  510. package/src/sam/decision/index.js +53 -0
  511. package/src/sam/decision/policy.js +86 -0
  512. package/src/sam/decision/questions.js +120 -0
  513. package/src/sam/decision/receipt.js +148 -0
  514. package/src/sam/decision/state.js +117 -0
  515. package/src/sam/decision/types.js +22 -0
  516. package/src/sam/decision/validate.js +200 -0
  517. package/src/sam/define.js +51 -0
  518. package/src/sam/index.js +65 -0
  519. package/src/sam/operations/brand-scan.js +62 -0
  520. package/src/sam/operations/cad-blender-inspect.js +36 -0
  521. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  522. package/src/sam/operations/decision-evaluate.js +59 -0
  523. package/src/sam/operations/planning-astar.js +77 -0
  524. package/src/sam/operations/planning-goap.js +60 -0
  525. package/src/sam/operations/repository-inspect.js +72 -0
  526. package/src/sam/operations/security-scan.js +33 -0
  527. package/src/sam/operations/terminal-exec.js +29 -0
  528. package/src/sam/planning/astar.js +311 -0
  529. package/src/sam/planning/goap.js +177 -0
  530. package/src/sam/planning/index.js +21 -0
  531. package/src/sam/planning/state.js +84 -0
  532. package/src/sam/registry.js +48 -0
  533. package/src/sam/result.js +77 -0
  534. package/src/sam/seed.js +44 -0
  535. package/src/sam/types.js +116 -0
  536. package/src/security/inventory.js +12 -2
  537. package/src/security/local-vault.js +2 -0
  538. package/src/security/scan.js +1 -1
  539. package/src/skills/catalog.js +64 -0
  540. package/src/skills/content-resolver.js +124 -0
  541. package/src/skills/hosted-store.js +37 -0
  542. package/src/skills/index.js +29 -64
  543. package/src/skills/interaction.js +102 -0
  544. package/src/skills/local-store.js +228 -0
  545. package/src/skills/manifest.js +104 -0
  546. package/src/skills/metrics.js +31 -0
  547. package/src/skills/registry.js +184 -0
  548. package/src/skills/runtime.js +287 -0
  549. package/src/skills/slash.js +44 -0
  550. package/src/ui/cli/help.js +94 -101
  551. package/test/account-session.test.mjs +3 -3
  552. package/test/app-authority-context.test.mjs +32 -0
  553. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  554. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  555. package/test/cli/go.test.mjs +62 -5
  556. package/test/cli/mcp-client.test.mjs +21 -10
  557. package/test/cli/runtime-persist.test.mjs +56 -0
  558. package/test/cli/rust-command.test.mjs +21 -0
  559. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  560. package/test/cli/wireframes-go-registry.test.mjs +87 -2
  561. package/test/credentials-audit.test.mjs +113 -0
  562. package/test/deploy-health-scan.test.mjs +29 -1
  563. package/test/gcloud-auth.test.mjs +111 -0
  564. package/test/go/build-source-identity.test.mjs +31 -0
  565. package/test/go/cloudflare-probe.test.mjs +274 -10
  566. package/test/go/distribution.test.mjs +28 -0
  567. package/test/google-cloud-connection.test.mjs +83 -0
  568. package/test/google-cloud-inventory.test.mjs +64 -0
  569. package/test/init-options.test.mjs +35 -0
  570. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  571. package/test/integration/app-command.test.mjs +30 -0
  572. package/test/integration/cad-project.test.mjs +4 -1
  573. package/test/integration/cli-help.test.mjs +1 -1
  574. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  575. package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
  576. package/test/integration/codebaseindex-ingest.test.mjs +214 -0
  577. package/test/integration/features-resolve.test.mjs +30 -11
  578. package/test/integration/icon-registry.test.mjs +67 -0
  579. package/test/integration/ingest-discover-models.test.mjs +30 -0
  580. package/test/integration/inspect-path-cli.test.mjs +46 -0
  581. package/test/integration/install-script.test.mjs +12 -9
  582. package/test/integration/inventory-evidence.test.mjs +125 -0
  583. package/test/integration/local-fs.test.mjs +113 -0
  584. package/test/integration/provider-env-cli.test.mjs +2 -1
  585. package/test/integration/runtime-status.integration.test.mjs +2 -1
  586. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  587. package/test/integration/sam-decision.test.mjs +584 -0
  588. package/test/integration/sam-kernel.test.mjs +99 -0
  589. package/test/integration/sam-planning-astar.test.mjs +279 -0
  590. package/test/integration/skill-runtime.test.mjs +240 -0
  591. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  592. package/test/knowledge.test.mjs +35 -1
  593. package/test/loopback-oauth.test.mjs +53 -0
  594. package/test/models.test.mjs +14 -7
  595. package/test/ollama.test.mjs +22 -0
  596. package/test/security.test.mjs +23 -0
  597. package/test/setup-planner.test.mjs +74 -0
  598. package/test/setup-runtime.test.mjs +51 -0
  599. package/test/shell.test.mjs +4 -4
  600. package/test/terminal/local-pty.mock.test.mjs +3 -1
  601. package/test/terminal-machine-identity.test.mjs +88 -0
  602. package/test/whoami-resume.test.mjs +27 -6
  603. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  604. package/packages/work-graph/prototype/README.md +0 -32
  605. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  606. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  607. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  608. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,225 @@
1
+ ---
2
+ name: agentsam-codebaseindex
3
+ description: Inventory-first codebase ingest — materials, scope, optional embeddings/storage. Pipeline IDs are not shell commands.
4
+ ---
5
+
6
+ # AgentSam CodebaseIndex
7
+
8
+ `agentsam-codebaseindex` teaches you how to inventory, scope, index, search,
9
+ and migrate code/document knowledge with AgentSam.
10
+
11
+ CodebaseIndex is designed to work **locally first**.
12
+
13
+ You do NOT need an AgentSam account, a paid LLM, a cloud database, embeddings,
14
+ Supabase, or Cloudflare to build a useful codebase index.
15
+
16
+ Minimum useful setup:
17
+
18
+ ```text
19
+ repository/files → deterministic inventory → AST + text index → local SQLite
20
+ → literal / structural retrieval
21
+ ```
22
+
23
+ Embeddings, hosted storage, and model-assisted scope suggestions are upgrades,
24
+ not prerequisites.
25
+
26
+ ---
27
+
28
+ ## Quick start
29
+
30
+ ```sh
31
+ agentsam codebaseindex
32
+ # alias: agentsam ingest
33
+ # tip: use skill agentsam-codebaseindex
34
+ ```
35
+
36
+ Guided flow (inventory-first):
37
+
38
+ 1. Connection
39
+ 2. Materials
40
+ 3. Inventory / file map
41
+ 4. Scope
42
+ 5. Embedding profile
43
+ 6. Vector / data source lane
44
+ 7. Execution
45
+
46
+ AgentSam shows what exists before asking what should be indexed.
47
+
48
+ ---
49
+
50
+ ## Important: "pipeline" is not a shell command
51
+
52
+ You may see:
53
+
54
+ ```text
55
+ Plan complete · pipeline id sam.codebaseindex.index.run
56
+ ```
57
+
58
+ Do **not** type:
59
+
60
+ ```sh
61
+ pipeline sam.codebaseindex.index.run
62
+ sam.codebaseindex.index.run
63
+ agentsam sam.codebaseindex.index.run
64
+ ```
65
+
66
+ `sam.codebaseindex.index.run` is the **canonical SAM pipeline identifier** —
67
+ receipts, job graphs, telemetry, Workbench, machine-to-machine metadata.
68
+
69
+ | Layer | Identity |
70
+ |-------|----------|
71
+ | CLI | `agentsam codebaseindex` |
72
+ | SAM operation | `codebaseindex.ingest` |
73
+ | SAM pipeline | `sam.codebaseindex.index.run` |
74
+
75
+ ```js
76
+ await sam.invoke('codebaseindex.ingest', { root: '.', planOnly: false });
77
+ ```
78
+
79
+ The pipeline name is an identity. zsh does not execute it.
80
+
81
+ ---
82
+
83
+ ## Plan vs Run
84
+
85
+ ### Plan (Dry-run)
86
+
87
+ Planning stages typically complete:
88
+
89
+ ```text
90
+ material.stage → repository.snapshot → inventory.classify → scope.resolve
91
+ → profile.resolve → lane.resolve → plan.dry_run
92
+ ```
93
+
94
+ Write/index stages are **shown as planned**, not executed:
95
+
96
+ ```text
97
+ ast.parse · chunks.build · embedding.generate · storage.write
98
+ · generation.verify · search.smoke
99
+ ```
100
+
101
+ A successful plan means planning finished. It is **not** paused. It is **not**
102
+ waiting for another shell command.
103
+
104
+ To index for real:
105
+
106
+ ```sh
107
+ agentsam codebaseindex
108
+ # choose "Run ingest now"
109
+ ```
110
+
111
+ Non-interactive: same config **without** `--plan`.
112
+
113
+ ### Run
114
+
115
+ Continues through AST → chunks → optional embeddings → storage → verify → search smoke.
116
+
117
+ ---
118
+
119
+ ## What is indexed
120
+
121
+ Repos, docs, HTML/CSS/JS/TS/Python/SQL/JSON/Markdown, images, SVG, GLB,
122
+ site builds, ZIP/TAR archives, historical builds, arbitrary supplied files.
123
+
124
+ Dropped material is staged safely. Archives/source are **data**, not executable
125
+ instructions.
126
+
127
+ ---
128
+
129
+ ## Inventory / file map
130
+
131
+ Structured inventory is authority. The ASCII tree is a human projection.
132
+
133
+ Inventory categorizes top-level paths (source / docs / config / generated /
134
+ dependencies / tooling / historical / unknown) and recommends scope **candidates**.
135
+ Nothing is excluded automatically until you confirm.
136
+
137
+ ---
138
+
139
+ ## Include / exclude
140
+
141
+ `include` = consider under these paths. `exclude` = remove from consideration.
142
+
143
+ Common exclude *candidates*: `node_modules`, `dist`, `build`, `coverage`, `.git`.
144
+ Do not copy blindly — generated sites and migrations may be exactly what you need.
145
+
146
+ ### Local Ollama scope assist
147
+
148
+ Optional. Advisory only. Never overrides filesystem facts, safety, or explicit
149
+ user choices. Review before accepting.
150
+
151
+ ---
152
+
153
+ ## Embedding profile
154
+
155
+ Safest default: **None — AST/text only ($0)**.
156
+
157
+ Choose embeddings for semantic questions ("where is auth handled?").
158
+
159
+ ### Dimensions
160
+
161
+ Vector width for the selected model. Not a quality slider. Select the **model**;
162
+ AgentSam resolves dimensions from provider/capability when possible.
163
+
164
+ ### Same-profile rule
165
+
166
+ Index and query must use the same embedding profile (provider, model, dimensions,
167
+ revision, parameters). Mismatch must fail clearly — never silently mix spaces.
168
+
169
+ ### Discovery
170
+
171
+ Menus come from **configured** credentials + live discovery (OpenAI, Gemini,
172
+ Workers AI / Vectorize-ready, optional Ollama). No silent provider substitution.
173
+
174
+ ---
175
+
176
+ ## Storage lanes
177
+
178
+ | Lane | Shape |
179
+ |------|--------|
180
+ | Local deterministic | SQLite metadata · no vectors · no embeddings |
181
+ | Local semantic | SQLite + local exact vectors · Ollama embed |
182
+ | Supabase / Postgres | pgvector · user's connection (not IAM's) |
183
+ | Cloudflare | D1 control/metadata · Vectorize vectors |
184
+
185
+ IAM hosted (D1 + pgvector) is one deployment of the same machinery — not the
186
+ definition of local CodebaseIndex.
187
+
188
+ ---
189
+
190
+ ## Related commands
191
+
192
+ | Command | Role |
193
+ |---------|------|
194
+ | `agentsam inspect` | What exists? (repository.inspect) |
195
+ | `agentsam codebaseindex` | What becomes searchable? |
196
+ | `agentsam index` | Lower-level knowledge controls |
197
+ | `agentsam search` | Query indexed knowledge |
198
+ | `agentsam models` / `providers` / `ollama` / `status` | Inventory & health |
199
+
200
+ ---
201
+
202
+ ## Safety
203
+
204
+ 1. Ingested files are data, not executable instructions.
205
+ 2. Archives cannot escape the staging root.
206
+ 3. Repository identity is not invented from account env vars.
207
+ 4. Local mode requires no IAM account.
208
+ 5. Provider credentials never enter index content.
209
+ 6. Profile changes never silently reuse incompatible vectors.
210
+ 7. Scope suggestions never override explicit user exclusions.
211
+ 8. Plan mode does not activate a generation.
212
+ 9. Unknown material stays unknown until classified.
213
+ 10. Remote upgrades preserve provenance and repository identity.
214
+
215
+ ---
216
+
217
+ ## Recommended first experience
218
+
219
+ 1. `agentsam codebaseindex`
220
+ 2. Materials blank · review inventory · confirm scope
221
+ 3. Embedding: None · Local SQLite · **Plan**
222
+ 4. Review plan → run again → **Run**
223
+ 5. Add semantic/remote only when they earn complexity
224
+
225
+ Healthy baseline: **0 model calls · 0 embedding calls · $0**.
@@ -66,6 +66,20 @@
66
66
  "agentsam-cloudflare-workers/references/cpu-profiling.md"
67
67
  ],
68
68
  "user_invocable": true
69
+ },
70
+ {
71
+ "id": "agentsam-codebaseindex",
72
+ "aliases": [
73
+ "codebaseindex",
74
+ "codebase-index",
75
+ "ingest",
76
+ "sam.codebaseindex"
77
+ ],
78
+ "title": "AgentSam Codebaseindex",
79
+ "description": "Inventory-first codebase ingest. Pipeline IDs are not shell commands — use agentsam codebaseindex / codebaseindex.ingest.",
80
+ "entry": "agentsam-codebaseindex/SKILL.md",
81
+ "references": [],
82
+ "user_invocable": true
69
83
  }
70
84
  ]
71
85
  }
@@ -0,0 +1,6 @@
1
+ export {
2
+ intakeLocalPath,
3
+ extractAttachmentPathsFromText,
4
+ validateAttachmentModalities,
5
+ formatAttachmentChip,
6
+ } from './intake.js';
@@ -0,0 +1,235 @@
1
+ /**
2
+ * Portable multimodal attachment intake (CLI + Local Studio).
3
+ * Authority: AgentAttachment references — never base64 in AgentInput.
4
+ */
5
+ import crypto from 'node:crypto';
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import os from 'node:os';
9
+ import { createRequire } from 'node:module';
10
+
11
+ const require = createRequire(import.meta.url);
12
+
13
+ const IMAGE_EXT = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.avif', '.heic', '.heif', '.svg']);
14
+
15
+ function trySharp() {
16
+ try {
17
+ return require('sharp');
18
+ } catch {
19
+ return null;
20
+ }
21
+ }
22
+
23
+ function sha256Buffer(buf) {
24
+ return `sha256:${crypto.createHash('sha256').update(buf).digest('hex')}`;
25
+ }
26
+
27
+ function sniffMime(buf, filePath = '') {
28
+ if (buf?.length >= 8 && buf[0] === 0x89 && buf[1] === 0x50) return 'image/png';
29
+ if (buf?.length >= 3 && buf[0] === 0xff && buf[1] === 0xd8 && buf[2] === 0xff) return 'image/jpeg';
30
+ if (buf?.length >= 12 && buf.toString('ascii', 0, 4) === 'RIFF' && buf.toString('ascii', 8, 12) === 'WEBP') {
31
+ return 'image/webp';
32
+ }
33
+ if (buf?.length >= 12 && buf.toString('ascii', 4, 8) === 'ftyp') return 'image/avif';
34
+ const ext = path.extname(filePath).toLowerCase();
35
+ if (ext === '.svg' || (buf && /<svg[\s>]/i.test(buf.toString('utf8', 0, 256)))) return 'image/svg+xml';
36
+ if (ext === '.gif') return 'image/gif';
37
+ if (ext === '.png') return 'image/png';
38
+ if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg';
39
+ if (ext === '.webp') return 'image/webp';
40
+ return 'application/octet-stream';
41
+ }
42
+
43
+ function kindFromMime(mime) {
44
+ if (String(mime).startsWith('image/')) return 'image';
45
+ if (String(mime).startsWith('audio/')) return 'audio';
46
+ if (String(mime).startsWith('video/')) return 'video';
47
+ if (String(mime).startsWith('text/')) return 'text';
48
+ return 'binary';
49
+ }
50
+
51
+ function nextTokenLabel(index) {
52
+ return `[Image #${index}]`;
53
+ }
54
+
55
+ /**
56
+ * Intake a local filesystem path into a structured AgentAttachment.
57
+ * Local-first: no Cloudflare required.
58
+ */
59
+ export async function intakeLocalPath(filePath, {
60
+ lifetime = 'ephemeral',
61
+ workDir = path.join(os.tmpdir(), 'agentsam-attachments'),
62
+ maxPixels = 40_000_000,
63
+ inferenceLongEdge = 2048,
64
+ index = 1,
65
+ } = {}) {
66
+ const abs = path.resolve(String(filePath).replace(/^@/, '').replace(/^['"]|['"]$/g, ''));
67
+ if (!fs.existsSync(abs)) {
68
+ const err = new Error(`attachment_missing:${abs}`);
69
+ err.code = 'attachment_missing';
70
+ throw err;
71
+ }
72
+ const buf = fs.readFileSync(abs);
73
+ const mimeType = sniffMime(buf, abs);
74
+ const kind = kindFromMime(mimeType);
75
+ const id = `att_${crypto.randomBytes(8).toString('hex')}`;
76
+ const sha256 = sha256Buffer(buf);
77
+ const name = path.basename(abs);
78
+
79
+ /** @type {import('../../agentsam-contracts/src/artifacts.ts').AgentAttachment} */
80
+ const attachment = {
81
+ id,
82
+ name,
83
+ mimeType,
84
+ size: buf.length,
85
+ kind,
86
+ source: { type: 'local_path', path: abs },
87
+ sha256,
88
+ lifetime,
89
+ metadata: {
90
+ token: kind === 'image' ? nextTokenLabel(index) : `[File #${index}]`,
91
+ },
92
+ };
93
+
94
+ if (kind === 'image' && mimeType !== 'image/svg+xml') {
95
+ const sharp = trySharp();
96
+ if (sharp) {
97
+ const meta = await sharp(buf, { failOn: 'none' }).metadata();
98
+ const width = meta.width || 0;
99
+ const height = meta.height || 0;
100
+ if (width * height > maxPixels) {
101
+ const err = new Error(`attachment_pixel_guard:${width}x${height}`);
102
+ err.code = 'attachment_pixel_guard';
103
+ throw err;
104
+ }
105
+ attachment.image = {
106
+ width,
107
+ height,
108
+ alpha: Boolean(meta.hasAlpha),
109
+ orientation: meta.orientation,
110
+ };
111
+
112
+ // Inference derivative — preserve original path as source
113
+ fs.mkdirSync(workDir, { recursive: true });
114
+ const inferPath = path.join(workDir, `${id}-inference.png`);
115
+ let pipeline = sharp(buf, { failOn: 'none' }).rotate();
116
+ const longEdge = Math.max(width, height);
117
+ if (longEdge > inferenceLongEdge) {
118
+ pipeline = pipeline.resize({
119
+ width: width >= height ? inferenceLongEdge : undefined,
120
+ height: height > width ? inferenceLongEdge : undefined,
121
+ fit: 'inside',
122
+ withoutEnlargement: true,
123
+ });
124
+ }
125
+ // Flatten transparent marks onto neutral for vision (keep original intact)
126
+ if (meta.hasAlpha) {
127
+ pipeline = pipeline.flatten({ background: { r: 32, g: 36, b: 44 } });
128
+ }
129
+ await pipeline.png().toFile(inferPath);
130
+ const inferStat = fs.statSync(inferPath);
131
+ const inferMeta = await sharp(inferPath).metadata();
132
+ attachment.inference = {
133
+ mimeType: 'image/png',
134
+ source: { type: 'local_path', path: inferPath },
135
+ width: inferMeta.width,
136
+ height: inferMeta.height,
137
+ bytes: inferStat.size,
138
+ };
139
+ attachment.preview = { localPath: inferPath };
140
+ } else {
141
+ attachment.metadata.capability_warning = {
142
+ status: 'blocked',
143
+ reason: 'capability_missing',
144
+ capability_id: 'image.raster.transform',
145
+ acceptable_backends: ['sharp', 'imagemagick'],
146
+ };
147
+ }
148
+ }
149
+
150
+ return attachment;
151
+ }
152
+
153
+ /**
154
+ * Parse CLI tokens for @path / absolute image paths dropped into the prompt.
155
+ * Returns { text, attachmentPaths }.
156
+ */
157
+ export function extractAttachmentPathsFromText(text = '') {
158
+ const paths = [];
159
+ let cleaned = String(text || '');
160
+ // @./file or @/abs or @~/rel
161
+ cleaned = cleaned.replace(/(^|\s)@([^\s]+)/g, (full, lead, p) => {
162
+ const candidate = p.replace(/^['"]|['"]$/g, '');
163
+ const expanded = candidate.startsWith('~/')
164
+ ? path.join(os.homedir(), candidate.slice(2))
165
+ : path.resolve(candidate);
166
+ if (fs.existsSync(expanded) && IMAGE_EXT.has(path.extname(expanded).toLowerCase())) {
167
+ paths.push(expanded);
168
+ return `${lead}`;
169
+ }
170
+ return full;
171
+ });
172
+ // bare absolute/relative image path as sole token
173
+ cleaned = cleaned.replace(/(^|\s)(\/?[^\s]+\.(?:png|jpe?g|webp|gif|avif|heic|svg))\b/gi, (full, lead, p) => {
174
+ const expanded = p.startsWith('~/')
175
+ ? path.join(os.homedir(), p.slice(2))
176
+ : path.isAbsolute(p)
177
+ ? p
178
+ : path.resolve(p);
179
+ if (fs.existsSync(expanded)) {
180
+ paths.push(expanded);
181
+ return lead;
182
+ }
183
+ return full;
184
+ });
185
+ return {
186
+ text: cleaned.replace(/\s+/g, ' ').trim(),
187
+ attachmentPaths: [...new Set(paths)],
188
+ };
189
+ }
190
+
191
+ /**
192
+ * Validate selected model modalities against attachments.
193
+ * Fail closed — never silently swap models.
194
+ */
195
+ export function validateAttachmentModalities({ attachments = [], model = {} } = {}) {
196
+ const modalities = new Set(model.input_modalities || model.inputModalities || ['text']);
197
+ const accepted = new Set(
198
+ model.attachment_policy?.accepted_mime_types
199
+ || model.acceptedMimeTypes
200
+ || (modalities.has('image') ? ['image/png', 'image/jpeg', 'image/webp', 'image/gif'] : []),
201
+ );
202
+ const images = attachments.filter((a) => a.kind === 'image' || String(a.mimeType || '').startsWith('image/'));
203
+ if (!images.length) return { ok: true, images: [] };
204
+ if (!modalities.has('image')) {
205
+ return {
206
+ ok: false,
207
+ code: 'model_rejects_image',
208
+ message: `${model.id || model.name || 'Selected model'} does not accept image input.`,
209
+ images,
210
+ };
211
+ }
212
+ for (const img of images) {
213
+ const mime = String(img.inference?.mimeType || img.mimeType || '');
214
+ if (accepted.size && mime && !accepted.has(mime) && !accepted.has(img.mimeType)) {
215
+ return {
216
+ ok: false,
217
+ code: 'mime_not_accepted',
218
+ message: `${model.id || 'Model'} does not accept ${mime || img.mimeType}.`,
219
+ images,
220
+ };
221
+ }
222
+ }
223
+ return { ok: true, images };
224
+ }
225
+
226
+ export function formatAttachmentChip(attachment) {
227
+ const token = attachment.metadata?.token || attachment.name;
228
+ const dims = attachment.image
229
+ ? `${attachment.image.width}×${attachment.image.height}`
230
+ : '—';
231
+ const kb = attachment.size < 1024
232
+ ? `${attachment.size} B`
233
+ : `${(attachment.size / 1024).toFixed(attachment.size >= 10240 ? 0 : 1)} KB`;
234
+ return `${token} ${attachment.mimeType || 'unknown'} · ${dims} · ${kb}`;
235
+ }
@@ -4,7 +4,7 @@ import { execFile } from 'node:child_process';
4
4
  import { promisify } from 'node:util';
5
5
  import { fileURLToPath } from 'node:url';
6
6
  import { createHash } from 'node:crypto';
7
- import { resolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
7
+ import { tryResolveGitContext } from '../../packages/agentsam-repository/src/git-context.js';
8
8
  import { getRepositoryId, tryReadProjectConfig } from '../lib/project-config.js';
9
9
  import { buildMerkleTree } from '../../packages/agentsam-repository/src/merkle/index.js';
10
10
  import { gitIgnoredPaths } from '../../packages/agentsam-repository/src/merkle/git-ignore.js';
@@ -111,7 +111,23 @@ export async function repositorySnapshot({ cwd = process.cwd(), churnDays = 30 }
111
111
  if (!Number.isInteger(churnDays) || churnDays < 1 || churnDays > 3650) {
112
112
  throw new RangeError('churnDays must be an integer from 1..3650');
113
113
  }
114
- const git = resolveGitContext({ cwd });
114
+ const requestedRoot = path.resolve(cwd);
115
+ if (!fs.existsSync(requestedRoot) || !fs.statSync(requestedRoot).isDirectory()) {
116
+ throw new Error(`repository_root_not_found:${requestedRoot}`);
117
+ }
118
+ const resolvedGit = tryResolveGitContext({ cwd: requestedRoot });
119
+ const git = resolvedGit || {
120
+ root: requestedRoot,
121
+ remoteUrl: '',
122
+ remoteHost: null,
123
+ repoFullName: null,
124
+ owner: null,
125
+ repo: null,
126
+ revisionSha: null,
127
+ branch: null,
128
+ detached: false,
129
+ dirty: null,
130
+ };
115
131
  const root = git.root;
116
132
  const ignored = await gitIgnoredPaths(root);
117
133
  const projectConfig = tryReadProjectConfig(root);
@@ -137,6 +153,7 @@ export async function repositorySnapshot({ cwd = process.cwd(), churnDays = 30 }
137
153
  repository: {
138
154
  repository_id: repositoryId,
139
155
  identity_source: projectRepositoryId ? 'project-config' : knowledge.repository_id ? 'knowledge-config' : portableRepositoryId ? 'git-remote' : 'unresolved',
156
+ source_kind: resolvedGit ? 'git' : 'filesystem',
140
157
  provider,
141
158
  full_name: git.repoFullName,
142
159
  remote_url: git.remoteUrl || null,
@@ -0,0 +1,138 @@
1
+ /**
2
+ * CLI command catalog — machine-readable authority for help, assist tips, and dispatch hints.
3
+ * Alias ≠ authority: skill tips and SAM operation ids live here so help is not a prose-only dump.
4
+ */
5
+
6
+ /** @typedef {{ id: string, aliases?: string[], summary: string, topic: string, skill?: string, operation?: string, common?: boolean }} CliCommandEntry */
7
+
8
+ /** @type {CliCommandEntry[]} */
9
+ export const CLI_COMMAND_CATALOG = Object.freeze([
10
+ { id: 'help', aliases: ['-h', '--help'], summary: 'Interactive or topic help from this catalog', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
11
+ { id: 'create', summary: 'Scaffold a new AgentSam project from a preset', topic: 'create', skill: 'agentsam-app-fundamentals', common: false },
12
+ { id: 'add', summary: 'Add an explicit feature/capability selection', topic: 'create', skill: 'agentsam-app-fundamentals' },
13
+ { id: 'plugins', summary: 'Install and manage AgentSam plugins', topic: 'create', skill: 'agentsam-app-fundamentals' },
14
+ { id: 'dev', summary: 'Run this project’s npm dev script', topic: 'work', skill: 'agentsam-app-fundamentals' },
15
+ { id: 'inspect', summary: 'Bounded repository inspect / authority view', topic: 'work', skill: 'agentsam-app-fundamentals', operation: 'repository.inspect', common: true },
16
+ { id: 'capabilities', summary: 'Inspect capability contracts', topic: 'create', skill: 'agentsam-app-fundamentals' },
17
+ { id: 'setup', summary: 'Discover → plan → approve → install capabilities (Homebrew-style)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
18
+ { id: 'skills', aliases: ['skill'], summary: 'List or load portable skill instructions', topic: 'create', skill: 'agentsam-app-fundamentals', common: true },
19
+ { id: 'context', summary: 'Git + bridge context from any repo', topic: 'work', skill: 'agentsam-app-fundamentals' },
20
+ { id: 'status', summary: 'Account, models, terminal, and live deploy awareness', topic: 'runtime', skill: 'agentsam-progression-guard', common: true },
21
+ { id: 'db', summary: 'Project-local SQLite status/init', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
22
+ { id: 'models', summary: 'Probe hosted/local model availability', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
23
+ { id: 'providers', summary: 'Configure machine provider credentials', topic: 'start', skill: 'agentsam-app-fundamentals' },
24
+ { id: 'credentials', aliases: ['credential'], summary: 'Audit credentials, drift, and failure remediation (never prints secrets)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
25
+ { id: 'cheat-sheet', aliases: ['cheatsheet'], summary: 'Organized command groups (gcloud-like)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
26
+ { id: 'env', summary: 'Provider profile / shell loader helpers', topic: 'start', skill: 'agentsam-app-fundamentals' },
27
+ { id: 'api-key', aliases: ['apikey', 'api-keys'], summary: 'Create/list/rotate AgentSam API keys (aak_*)', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
28
+ { id: 'login', summary: 'Sign in and persist machine-local session', topic: 'start', skill: 'agentsam-app-fundamentals' },
29
+ { id: 'logout', summary: 'Sign out locally', topic: 'start', skill: 'agentsam-app-fundamentals' },
30
+ { id: 'whoami', summary: 'Authenticated account + tokenPermissions', topic: 'start', skill: 'agentsam-app-fundamentals', common: true },
31
+ { id: 'resume', summary: 'Resume a saved AgentSam session', topic: 'start', skill: 'agentsam-app-fundamentals' },
32
+ { id: 'shell', summary: 'Interactive slash-command shell', topic: 'inside', skill: 'agentsam-app-fundamentals' },
33
+ { id: 'start-local', summary: 'Local PTY WebSocket service', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
34
+ { id: 'ollama', summary: 'Local Ollama setup/status/models', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
35
+ { id: 'tunnel', summary: 'Cloudflare Tunnel via Wrangler', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
36
+ { id: 'connections', aliases: ['connection'], summary: 'Inspect execution connections', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
37
+ { id: 'compute', summary: 'Alias for google-cloud compute/iam helpers', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
38
+ { id: 'google-cloud', aliases: ['gcp', 'gcloud'], summary: 'Google Cloud auth, projects, compute, IAM SAs, billing, doctor', topic: 'runtime', skill: 'agentsam-app-fundamentals', common: true },
39
+ { id: 'billing', aliases: ['costs'], summary: 'Billing account relationships (not --billing-project)', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
40
+ { id: 'update', summary: 'Component update preview (gcloud-like)', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
41
+ { id: 'deploy', summary: 'Graduate intentionally to cloud', topic: 'runtime', skill: 'agentsam-progression-guard', common: true },
42
+ { id: 'deploy-receipt', summary: 'Merkle deploy/checkpoint receipts', topic: 'runtime', skill: 'agentsam-progression-guard' },
43
+ { id: 'cloudflare', aliases: ['cf'], summary: 'Wrangler reads + Worker CPU profiles', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
44
+ { id: 'go', summary: 'Go product discover/build/deploy', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
45
+ { id: 'rust', aliases: ['wasm', 'rapid-rust'], summary: 'Rust/Wasm scaffold, doctor, check, build, dev, explicit deploy', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
46
+ { id: 'mcp', summary: 'MCP server catalog and client adapters', topic: 'runtime', skill: 'agentsam-cloudflare-workers' },
47
+ { id: 'eval', summary: 'Context fixtures and live eval telemetry', topic: 'runtime', skill: 'agentsam-app-fundamentals' },
48
+ { id: 'index', summary: 'Plan/run incremental AST (+ optional embeddings)', topic: 'work', skill: 'agentsam-codebaseindex', operation: 'codebaseindex.ingest' },
49
+ { id: 'search', summary: 'Retrieve indexed code/text', topic: 'work', skill: 'agentsam-codebaseindex' },
50
+ { id: 'repo', summary: 'Repository snapshot / observations', topic: 'work', skill: 'agentsam-app-fundamentals', operation: 'repository.inspect' },
51
+ { id: 'init', summary: 'Knowledge setup or local scaffold', topic: 'create', skill: 'agentsam-app-fundamentals' },
52
+ { id: 'codebaseindex', aliases: ['ingest', 'codebase-index'], summary: 'Guided codebase ingest: materials, allowlist, embeddings, storage', topic: 'work', skill: 'agentsam-codebaseindex', operation: 'codebaseindex.ingest', common: true },
53
+ { id: 'brand', summary: 'Deterministic brand intelligence', topic: 'work', skill: 'agentsam-app-fundamentals', operation: 'brand.scan' },
54
+ { id: 'plan', summary: 'Composable plans (e.g. brand)', topic: 'work', skill: 'agentsam-app-fundamentals' },
55
+ { id: 'security', aliases: ['sca'], summary: 'Dependency + trust-boundary scan', topic: 'work', skill: 'agentsam-progression-guard', operation: 'security.scan', common: true },
56
+ { id: 'merkle', summary: 'File integrity snapshots and explorer', topic: 'work', skill: 'agentsam-app-fundamentals' },
57
+ { id: 'cad', summary: 'Blender/OpenSCAD/FreeCAD CAD tools', topic: 'work', skill: 'agentsam-app-fundamentals', operation: 'cad.blender.inspect' },
58
+ { id: 'dockerize', summary: 'Build/run supported containers', topic: 'create', skill: 'agentsam-app-fundamentals' },
59
+ { id: 'mini', summary: 'Create a small local gadget', topic: 'create', skill: 'agentsam-jr-dev' },
60
+ { id: 'recon', summary: 'Bounded-worker packets + finding reports', topic: 'work', skill: 'agentsam-app-fundamentals' },
61
+ { id: 'autorag', summary: 'AutoRAG configure/probe helpers', topic: 'work', skill: 'agentsam-codebaseindex' },
62
+ { id: 'identity', summary: 'Identity portal, providers, protocol surfaces', topic: 'create', skill: 'agentsam-app-fundamentals' },
63
+ { id: 'scaffold', summary: 'Generate CMS or worker-api starter', topic: 'create', skill: 'agentsam-jr-dev' },
64
+ { id: 'goap', summary: 'GOAP blackboard status/plan', topic: 'inside', skill: 'agentsam-app-fundamentals' },
65
+ { id: 'app', aliases: ['apps'], summary: 'Bundled AgentSam apps launcher', topic: 'create', skill: 'agentsam-app-fundamentals' },
66
+ ]);
67
+
68
+ const byId = new Map();
69
+ for (const entry of CLI_COMMAND_CATALOG) {
70
+ byId.set(entry.id, entry);
71
+ for (const alias of entry.aliases || []) byId.set(alias, entry);
72
+ }
73
+
74
+ /**
75
+ * @param {string} name
76
+ * @returns {CliCommandEntry|null}
77
+ */
78
+ export function getCliCommand(name) {
79
+ const key = String(name || '').trim().toLowerCase();
80
+ if (!key) return null;
81
+ return byId.get(key) || null;
82
+ }
83
+
84
+ export function listCliCommands(options = {}) {
85
+ let rows = [...CLI_COMMAND_CATALOG];
86
+ if (options.topic) rows = rows.filter((r) => r.topic === options.topic);
87
+ if (options.common) rows = rows.filter((r) => r.common);
88
+ return rows;
89
+ }
90
+
91
+ /**
92
+ * Machine baseline: every command surfaces how to load its skill from inside the CLI.
93
+ * @param {CliCommandEntry|string} entryOrId
94
+ * @param {{ write?: (s: string) => void, quiet?: boolean }} [options]
95
+ */
96
+ export function printAssistTip(entryOrId, options = {}) {
97
+ if (options.quiet) return;
98
+ // Never contaminate machine JSON streams.
99
+ if (options.json || process.argv.includes('--json') || process.argv.includes('--format=json')) return;
100
+ const entry = typeof entryOrId === 'string' ? getCliCommand(entryOrId) : entryOrId;
101
+ if (!entry?.skill) return;
102
+ const write = options.write || ((s) => process.stderr.write(s));
103
+ const op = entry.operation ? ` · sam.invoke("${entry.operation}")` : '';
104
+ write(` tip: use skill ${entry.skill} (agentsam skills ${entry.skill})${op}\n`);
105
+ }
106
+
107
+ /**
108
+ * Suggest close command ids for unknown input.
109
+ * @param {string} name
110
+ * @param {number} [limit]
111
+ */
112
+ export function suggestCliCommands(name, limit = 5) {
113
+ const q = String(name || '').toLowerCase();
114
+ if (!q) return listCliCommands({ common: true }).slice(0, limit);
115
+ return CLI_COMMAND_CATALOG
116
+ .map((entry) => {
117
+ const hay = [entry.id, ...(entry.aliases || []), entry.summary].join(' ').toLowerCase();
118
+ let score = 0;
119
+ if (entry.id.startsWith(q) || (entry.aliases || []).some((a) => a.startsWith(q))) score += 3;
120
+ if (hay.includes(q)) score += 1;
121
+ for (const t of q.split(/[^a-z0-9]+/).filter(Boolean)) {
122
+ if (hay.includes(t)) score += 1;
123
+ }
124
+ return { entry, score };
125
+ })
126
+ .filter((x) => x.score > 0)
127
+ .sort((a, b) => b.score - a.score || a.entry.id.localeCompare(b.entry.id))
128
+ .slice(0, limit)
129
+ .map((x) => x.entry);
130
+ }
131
+
132
+ export const CLI_HELP_TOPICS = Object.freeze([
133
+ { id: 'start', label: 'Start / resume', summary: 'Enter AgentSam, resume work, identity, models.' },
134
+ { id: 'work', label: 'Build / inspect', summary: 'Repository intelligence, ingest, security, brand.' },
135
+ { id: 'runtime', label: 'Runtime / terminal', summary: 'Local, remote, sandbox, and deployment controls.' },
136
+ { id: 'inside', label: 'Inside AgentSam', summary: 'Shell and GOAP surfaces.' },
137
+ { id: 'create', label: 'Create / extend', summary: 'Scaffold, add capabilities, identity, skills.' },
138
+ ]);