@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,688 @@
1
+ /**
2
+ * agentsam codebaseindex | ingest — guided SAM primitive for indexing materials.
3
+ * Pipeline authority: sam.codebaseindex.index.run (IAM host) · local: knowledge index run.
4
+ */
5
+
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import {
9
+ cancel, confirm, intro, isCancel, note, outro, select, text,
10
+ } from '@clack/prompts';
11
+ import pc from 'picocolors';
12
+ import {
13
+ CONFIG_PATH, repositoryRoot, readConfig, defaultConfig, validateConfig,
14
+ } from '../knowledge/config.js';
15
+ import { openSqliteStore } from '../knowledge/stores/sqlite.js';
16
+ import { openPostgresStore } from '../knowledge/stores/postgres.js';
17
+ import { planIndex, retrieve, runIndex } from '../knowledge/engine.js';
18
+ import { createProviderRegistry } from '../../packages/agentsam-knowledge/src/providers/index.js';
19
+ import { ensureProjectManifest, getRepositoryId, portableRepositoryIdFromGit, tryReadProjectConfig } from '../lib/project-config.js';
20
+ import { parsePastedPaths, stageMaterials } from '../indexing/ingest/materials.js';
21
+ import {
22
+ discoverIngestModelOptions,
23
+ parseEmbeddingChoice,
24
+ suggestScopeWithLocalModel,
25
+ } from '../indexing/ingest/discover-models.js';
26
+ import {
27
+ assessAiAccess,
28
+ formatAiAccessOnboarding,
29
+ LOCAL_STUDIO_LOGIN,
30
+ CF_OAUTH_LOGIN_START,
31
+ } from '../models/ai-access-onboarding.js';
32
+ import { buildInventory, formatInventoryTree } from '../indexing/ingest/inventory.js';
33
+ import {
34
+ createCodebaseindexJobGraph,
35
+ advanceJobGraph,
36
+ freezePlanJobGraph,
37
+ skipJobGraphNode,
38
+ formatJobGraphHuman,
39
+ } from '../indexing/ingest/job-graph.js';
40
+
41
+ function pick(value, label = 'Cancelled') {
42
+ if (isCancel(value)) {
43
+ cancel(label);
44
+ const err = new Error('codebaseindex_cancelled');
45
+ err.code = 'AGENTSAM_CODEBASEINDEX_CANCELLED';
46
+ throw err;
47
+ }
48
+ return value;
49
+ }
50
+
51
+ function splitList(value) {
52
+ return String(value || '')
53
+ .split(',')
54
+ .map((s) => s.trim())
55
+ .filter(Boolean);
56
+ }
57
+
58
+ function localSqlitePath(root) {
59
+ return path.join(root, '.agentsam', 'knowledge', 'index.sqlite');
60
+ }
61
+
62
+ async function openStore(root, config, readOnly = false) {
63
+ if (config.storage.driver === 'sqlite') {
64
+ return openSqliteStore(localSqlitePath(root), { readOnly });
65
+ }
66
+ return openPostgresStore(process.env[config.storage.connection_env]);
67
+ }
68
+
69
+ function writeKnowledgeConfig(root, config) {
70
+ const validated = validateConfig(config);
71
+ const target = path.join(root, CONFIG_PATH);
72
+ fs.mkdirSync(path.dirname(target), { recursive: true });
73
+ fs.writeFileSync(target, `${JSON.stringify(validated, null, 2)}\n`, { mode: 0o600 });
74
+ return validated;
75
+ }
76
+
77
+ function loadOrBuildConfig(root, preferences) {
78
+ const project = tryReadProjectConfig(root) || ensureProjectManifest(root, {});
79
+ const repositoryId = getRepositoryId(project) || portableRepositoryIdFromGit(root) || preferences.repositoryId;
80
+ const filename = path.join(root, CONFIG_PATH);
81
+ const base = fs.existsSync(filename)
82
+ ? readConfig(root)
83
+ : defaultConfig({
84
+ include: preferences.include,
85
+ exclude: preferences.exclude,
86
+ scope: preferences.scopeName || 'default',
87
+ target: preferences.storage === 'postgres' ? 'production' : 'local',
88
+ dimensions: preferences.embedding.dimensions || 768,
89
+ repositoryId,
90
+ });
91
+
92
+ return writeKnowledgeConfig(root, {
93
+ ...base,
94
+ repository_id: base.repository_id || repositoryId,
95
+ scope: {
96
+ name: preferences.scopeName || base.scope?.name || 'default',
97
+ include: preferences.include,
98
+ exclude: preferences.exclude,
99
+ },
100
+ embedding: preferences.embedding.provider === 'none'
101
+ ? { provider: 'none', model: 'none', revision: '1', dimensions: 0, parameters: {} }
102
+ : { ...base.embedding, ...preferences.embedding },
103
+ storage: preferences.storage === 'postgres'
104
+ ? { driver: 'postgres', connection_env: preferences.connectionEnv || 'AGENTSAM_DATABASE_URL' }
105
+ : { driver: 'sqlite' },
106
+ lane: {
107
+ id: `${preferences.scopeName || 'default'}-ingest`,
108
+ backend: preferences.storage === 'postgres' ? 'postgres_pgvector' : 'local_exact',
109
+ resource: null,
110
+ binding: null,
111
+ index: null,
112
+ metric: 'cosine',
113
+ },
114
+ });
115
+ }
116
+
117
+ function providerAdapter(profile) {
118
+ if (profile?.provider === 'none') {
119
+ return {
120
+ validate: () => {},
121
+ embed: async () => {
122
+ throw new Error('embedding_disabled');
123
+ },
124
+ };
125
+ }
126
+ const adapter = createProviderRegistry().get(profile.provider);
127
+ return {
128
+ validate: (input) => adapter.validate(input),
129
+ async embed(text, input, context) {
130
+ return context?.kind === 'query'
131
+ ? adapter.embedQuery(text, input, context)
132
+ : (await adapter.embedDocuments([text], input, context))[0];
133
+ },
134
+ };
135
+ }
136
+
137
+ /**
138
+ * Non-interactive / SAM handler entry.
139
+ * @param {object} input
140
+ * @param {object} [ctx]
141
+ */
142
+ export async function runCodebaseindexIngest(input = {}, ctx = {}) {
143
+ const root = path.resolve(input.root || input.cwd || ctx.cwd || process.cwd());
144
+ const materials = Array.isArray(input.materials)
145
+ ? input.materials
146
+ : parsePastedPaths(input.paste || input.paths || '');
147
+ let include = Array.isArray(input.include) && input.include.length ? [...input.include] : ['.'];
148
+ // Exclude is user-authored — never invent a product denylist.
149
+ let exclude = Array.isArray(input.exclude) ? [...input.exclude] : [];
150
+ /** @type {object|null} */
151
+ let staged = null;
152
+ let jobGraph = createCodebaseindexJobGraph({
153
+ status: 'planned',
154
+ current: 'material.stage',
155
+ });
156
+
157
+ if (materials.length) {
158
+ staged = stageMaterials({ root, materials });
159
+ include = [...new Set([...include.filter((x) => x !== '.'), ...staged.include])];
160
+ if (!include.length) include = staged.include.length ? staged.include : ['.'];
161
+ jobGraph = advanceJobGraph(jobGraph, 'material.stage');
162
+ }
163
+
164
+ const inventory = input.inventory || buildInventory({ root, materials: staged });
165
+ jobGraph = advanceJobGraph({ ...jobGraph, current: 'inventory.classify' }, 'inventory.classify');
166
+
167
+ const embedding = input.embedding && typeof input.embedding === 'object'
168
+ ? input.embedding
169
+ : parseEmbeddingChoice(input.embeddingChoice || 'none');
170
+
171
+ const storage = input.storage === 'postgres' ? 'postgres' : 'sqlite';
172
+ const vectors = input.vectors || (embedding.provider === 'none' ? 'none'
173
+ : storage === 'postgres' ? 'pgvector' : 'sqlite_exact');
174
+
175
+ const config = loadOrBuildConfig(root, {
176
+ include,
177
+ exclude,
178
+ embedding,
179
+ storage,
180
+ scopeName: input.scope || 'ingest',
181
+ connectionEnv: input.connectionEnv,
182
+ });
183
+ jobGraph = advanceJobGraph(jobGraph, 'scope.resolve');
184
+ jobGraph = advanceJobGraph(jobGraph, 'profile.resolve');
185
+ jobGraph = advanceJobGraph(jobGraph, 'lane.resolve');
186
+
187
+ const embed = Boolean(input.embed) && embedding.provider !== 'none';
188
+ const store = await openStore(root, config, false);
189
+ try {
190
+ if (input.planOnly) {
191
+ const plan = await planIndex({ root, config, store, embed });
192
+ jobGraph = advanceJobGraph(jobGraph, 'plan.dry_run');
193
+ jobGraph = freezePlanJobGraph(jobGraph, { skipEmbedding: !embed });
194
+ return {
195
+ pipeline: 'sam.codebaseindex.index.run',
196
+ operation: 'codebaseindex.ingest',
197
+ mode: 'plan',
198
+ root: '.',
199
+ config_path: CONFIG_PATH,
200
+ staged,
201
+ inventory: { ...inventory, root: '.' },
202
+ storage_lanes: { metadata: storage, vectors },
203
+ job_graph: jobGraph,
204
+ plan: plan.receipt,
205
+ embedding: config.embedding,
206
+ storage: config.storage,
207
+ include: config.scope.include,
208
+ exclude: config.scope.exclude,
209
+ };
210
+ }
211
+
212
+ let adapter;
213
+ const embedder = {
214
+ validate: (...args) => (adapter ??= providerAdapter(config.embedding)).validate(...args),
215
+ embed: (...args) => (adapter ??= providerAdapter(config.embedding)).embed(...args),
216
+ };
217
+ const result = await runIndex({
218
+ root,
219
+ config,
220
+ store,
221
+ embed,
222
+ embedder,
223
+ maxInputs: Number(input.maxInputs ?? 200),
224
+ maxCharacters: Number(input.maxCharacters ?? 400000),
225
+ });
226
+ jobGraph = advanceJobGraph(jobGraph, 'plan.dry_run');
227
+ jobGraph = advanceJobGraph(jobGraph, 'ast.parse');
228
+ jobGraph = advanceJobGraph(jobGraph, 'chunks.build');
229
+
230
+ if (embed) {
231
+ jobGraph = advanceJobGraph(jobGraph, 'embedding.generate');
232
+ } else {
233
+ jobGraph = skipJobGraphNode(
234
+ jobGraph,
235
+ 'embedding.generate',
236
+ 'embedding_disabled',
237
+ );
238
+ }
239
+
240
+ jobGraph = advanceJobGraph(jobGraph, 'storage.write');
241
+ jobGraph = advanceJobGraph(jobGraph, 'generation.verify');
242
+
243
+ const smokeQuery =
244
+ String(input.smokeQuery || config.scope.include?.[0] || 'source').trim()
245
+ || 'source';
246
+
247
+ const smoke = await retrieve({
248
+ store,
249
+ config,
250
+ text: smokeQuery,
251
+ semantic: false,
252
+ topK: 1,
253
+ tokenBudget: 512,
254
+ generationId: result.generation_id,
255
+ });
256
+
257
+ jobGraph = advanceJobGraph(jobGraph, 'search.smoke');
258
+
259
+ return {
260
+ pipeline: 'sam.codebaseindex.index.run',
261
+ operation: 'codebaseindex.ingest',
262
+ mode: 'run',
263
+ root: '.',
264
+ config_path: CONFIG_PATH,
265
+ staged,
266
+ inventory: { ...inventory, root: '.' },
267
+ storage_lanes: { metadata: storage, vectors },
268
+ job_graph: jobGraph,
269
+ index: result,
270
+ search_smoke: {
271
+ query: smokeQuery,
272
+ generation_id: smoke.diagnostics?.generation_id || result.generation_id,
273
+ sources_included: smoke.receipt?.sources_included ?? smoke.hits?.length ?? 0,
274
+ },
275
+ embedding: config.embedding,
276
+ storage: config.storage,
277
+ include: config.scope.include,
278
+ exclude: config.scope.exclude,
279
+ assets: staged?.assets || [],
280
+ };
281
+ } finally {
282
+ await store?.close();
283
+ }
284
+ }
285
+
286
+ function helpText() {
287
+ return [
288
+ 'Agent Sam · codebaseindex (ingest)',
289
+ '',
290
+ ' Guided SAM primitive for indexing a repo and/or dropped materials.',
291
+ ' CLI: agentsam codebaseindex',
292
+ ' Operation: codebaseindex.ingest',
293
+ ' Pipeline id (receipts/telemetry — NOT a shell command): sam.codebaseindex.index.run',
294
+ '',
295
+ ' After a dry-run plan, rerun and choose "Run ingest now" — do not type the pipeline id.',
296
+ '',
297
+ ' Embedding models are discovered from your configured provider credentials',
298
+ ' (OpenAI, Gemini, Cloudflare Workers AI for Vectorize). Ollama is optional.',
299
+ ' Include/exclude paths are prompted — AgentSam does not invent a denylist.',
300
+ '',
301
+ ' agentsam codebaseindex interactive wizard (clack)',
302
+ ' agentsam ingest alias',
303
+ ' agentsam codebaseindex --paths … materials',
304
+ ' agentsam codebaseindex --include src --exclude node_modules,.git',
305
+ ' agentsam codebaseindex --plan plan only',
306
+ ' agentsam codebaseindex --embed enable embedding pass after you pick a model',
307
+ '',
308
+ ' tip: use skill agentsam-codebaseindex',
309
+ '',
310
+ ].join('\n');
311
+ }
312
+
313
+ function parseArgv(argv = []) {
314
+ const out = {
315
+ help: false,
316
+ json: false,
317
+ plan: false,
318
+ embed: false,
319
+ yes: false,
320
+ interactive: null,
321
+ paths: [],
322
+ include: '',
323
+ exclude: '',
324
+ storage: '',
325
+ embedding: '',
326
+ cwd: '',
327
+ };
328
+ for (let i = 0; i < argv.length; i += 1) {
329
+ const arg = argv[i];
330
+ if (arg === '--help' || arg === '-h') out.help = true;
331
+ else if (arg === '--json') out.json = true;
332
+ else if (arg === '--plan') out.plan = true;
333
+ else if (arg === '--embed') out.embed = true;
334
+ else if (arg === '--yes' || arg === '-y') out.yes = true;
335
+ else if (arg === '--interactive' || arg === '-i') out.interactive = true;
336
+ else if (arg === '--no-interactive') out.interactive = false;
337
+ else if (arg === '--cwd') out.cwd = argv[++i] || '';
338
+ else if (arg === '--paths' || arg === '--materials') out.paths.push(...splitList(argv[++i] || ''));
339
+ else if (arg === '--include') out.include = argv[++i] || '';
340
+ else if (arg === '--exclude') out.exclude = argv[++i] || '';
341
+ else if (arg === '--storage') out.storage = argv[++i] || '';
342
+ else if (arg === '--embedding') out.embedding = argv[++i] || '';
343
+ else if (!arg.startsWith('-')) out.paths.push(arg);
344
+ else throw new Error(`Unknown codebaseindex option: ${arg}`);
345
+ }
346
+ return out;
347
+ }
348
+
349
+ async function runWizard(root, opts) {
350
+ intro('AgentSam · codebaseindex (inventory-first)');
351
+
352
+ // ① Providers (informational — discovery only) + onboarding if empty
353
+ const discovered = await discoverIngestModelOptions();
354
+ const access = assessAiAccess(discovered);
355
+ const providerLines = [
356
+ discovered.ollama?.online
357
+ ? `ollama online · ${(discovered.ollama.models || []).map((m) => m.name).join(', ')}`
358
+ : 'ollama offline (optional local embed/assist)',
359
+ ...(discovered.inventory?.providers || [])
360
+ .filter((p) => p.configured)
361
+ .map((p) => `${p.id} credential configured`),
362
+ ];
363
+ if (!access.ready) {
364
+ note(
365
+ formatAiAccessOnboarding(access, { wantCloudAi: true }),
366
+ '① Connection · AI access needed for model options',
367
+ );
368
+ const setup = pick(await select({
369
+ message: 'How do you want to unlock AI models?',
370
+ initialValue: 'continue_ast',
371
+ options: [
372
+ {
373
+ value: 'continue_ast',
374
+ label: 'Continue with AST/text only ($0 · no models)',
375
+ hint: 'embeddings stay none',
376
+ },
377
+ {
378
+ value: 'providers',
379
+ label: 'I will add a provider API key',
380
+ hint: 'run: agentsam providers (then rerun codebaseindex)',
381
+ },
382
+ {
383
+ value: 'ollama',
384
+ label: 'I will install Ollama locally',
385
+ hint: 'https://ollama.com/download',
386
+ },
387
+ {
388
+ value: 'studio_cf',
389
+ label: 'Sign in / approve Cloudflare for Local Studio',
390
+ hint: 'identity + Workers AI / MCP',
391
+ },
392
+ ],
393
+ }));
394
+ if (setup === 'providers') {
395
+ note('Run: agentsam providers\nThen: agentsam codebaseindex', 'Next');
396
+ outro('Paused — configure a provider key, then rerun.');
397
+ return { mode: 'needs_ai_access', reason: 'provider_key', pipeline: 'sam.codebaseindex.index.run' };
398
+ }
399
+ if (setup === 'ollama') {
400
+ note(
401
+ [
402
+ '1. Install: https://ollama.com/download',
403
+ '2. ollama pull mxbai-embed-large',
404
+ '3. ollama pull qwen2.5-coder',
405
+ '4. agentsam ollama status',
406
+ '5. agentsam codebaseindex',
407
+ ].join('\n'),
408
+ 'Ollama setup',
409
+ );
410
+ outro('Paused — install local models, then rerun.');
411
+ return { mode: 'needs_ai_access', reason: 'ollama', pipeline: 'sam.codebaseindex.index.run' };
412
+ }
413
+ if (setup === 'studio_cf') {
414
+ note(
415
+ [
416
+ `Login portal: ${LOCAL_STUDIO_LOGIN}`,
417
+ `CF sign-in: ${CF_OAUTH_LOGIN_START}`,
418
+ '',
419
+ 'After Cloudflare approves, return here and rerun:',
420
+ ' agentsam codebaseindex',
421
+ '',
422
+ 'Dashboard OAuth client must include redirect:',
423
+ ' https://agentsam.inneranimalmedia.com/api/oauth/cloudflare/callback',
424
+ '(in addition to /api/connections/cloudflare/callback)',
425
+ ].join('\n'),
426
+ 'Local Studio · Cloudflare OAuth',
427
+ );
428
+ outro('Paused — complete OAuth approval, then rerun.');
429
+ return { mode: 'needs_ai_access', reason: 'cloudflare_oauth', pipeline: 'sam.codebaseindex.index.run' };
430
+ }
431
+ note(providerLines.join('\n') || 'Continuing without remote/local models.', '① Connection');
432
+ } else {
433
+ note(providerLines.join('\n') || 'No remote credentials — AST/text-only remains valid.', '① Connection');
434
+ }
435
+
436
+ // ② Materials
437
+ note(
438
+ [
439
+ 'Paste or drag-drop archives, site builds, HTML, images, GLB, or folders.',
440
+ 'Leave blank to inventory the repository only.',
441
+ ].join('\n'),
442
+ '② Materials',
443
+ );
444
+ const paste = pick(await text({
445
+ message: 'Paths to ingest (paste/drop; blank = repo inventory)',
446
+ placeholder: '/path/to/build.tar.gz ./dist screenshot.png',
447
+ }), 'Ingest cancelled');
448
+ const materials = [...new Set([...(opts.paths || []), ...parsePastedPaths(paste)])];
449
+
450
+ let staged = null;
451
+ if (materials.length) {
452
+ staged = stageMaterials({ root, materials });
453
+ }
454
+
455
+ // ③ Inventory / file map BEFORE scope
456
+ const inventory = buildInventory({ root, materials: staged });
457
+ note(formatInventoryTree(inventory), '③ Inventory / file map');
458
+ const continueAfterInventory = pick(await confirm({
459
+ message: 'Continue to include/exclude using this inventory?',
460
+ initialValue: true,
461
+ }));
462
+ if (!continueAfterInventory) {
463
+ cancel('Stopped after inventory');
464
+ return { mode: 'inventory_only', inventory, staged, pipeline: 'sam.codebaseindex.index.run' };
465
+ }
466
+
467
+ // Default scope from categorized inventory (not "include everything")
468
+ let include = opts.include ? splitList(opts.include) : [...(inventory.suggested.include || [])];
469
+ let exclude = opts.exclude ? splitList(opts.exclude) : [...(inventory.suggested.exclude || [])];
470
+
471
+ if (discovered.assistModels.length) {
472
+ const assistChoice = pick(await select({
473
+ message: '④ Scope — how to set include/exclude?',
474
+ initialValue: 'from_inventory',
475
+ options: [
476
+ { value: 'from_inventory', label: 'Start from inventory categories', hint: 'source+docs in · usually-exclude out · you still edit' },
477
+ { value: 'manual', label: 'Enter include/exclude myself', hint: 'blank exclude = exclude nothing' },
478
+ { value: 'assist', label: 'Suggest with local Ollama (optional)', hint: 'advisory only — inventory still owns categories' },
479
+ ],
480
+ }));
481
+ if (assistChoice === 'manual') {
482
+ include = [];
483
+ exclude = [];
484
+ } else if (assistChoice === 'assist') {
485
+ const modelPick = pick(await select({
486
+ message: 'Local chat model for scope suggestions',
487
+ options: discovered.assistModels.map((row) => ({
488
+ value: row.model,
489
+ label: row.label,
490
+ hint: row.hint,
491
+ })),
492
+ }));
493
+ try {
494
+ const suggestion = await suggestScopeWithLocalModel({
495
+ root,
496
+ model: modelPick,
497
+ topLevel: inventory.top_level,
498
+ categories: inventory.categories,
499
+ });
500
+ note(
501
+ [
502
+ suggestion.rationale || 'Local model suggestion (advisory)',
503
+ `include: ${(suggestion.include || []).join(', ') || '(none)'}`,
504
+ `exclude: ${(suggestion.exclude || []).join(', ') || '(none)'}`,
505
+ ].join('\n'),
506
+ `Suggested by ${modelPick}`,
507
+ );
508
+ if (pick(await confirm({ message: 'Use as starting include/exclude?', initialValue: true }))) {
509
+ include = suggestion.include;
510
+ exclude = suggestion.exclude;
511
+ }
512
+ } catch (error) {
513
+ note(error?.message || String(error), 'Local assist unavailable');
514
+ }
515
+ }
516
+ }
517
+
518
+ include = splitList(pick(await text({
519
+ message: 'Include paths (comma-separated)',
520
+ initialValue: include.join(',') || (materials.length ? '' : '.'),
521
+ placeholder: 'src,packages,apps,docs',
522
+ })));
523
+ if (!include.length && !materials.length) include = ['.'];
524
+
525
+ exclude = splitList(pick(await text({
526
+ message: 'Exclude paths (blank = exclude nothing)',
527
+ initialValue: exclude.join(','),
528
+ placeholder: 'node_modules,.git,dist — only if you want them out',
529
+ })));
530
+
531
+ // ⑤ Embedding profile (discovered)
532
+ note(
533
+ discovered.options.length > 1
534
+ ? `Discovered embed options from credentials (OpenAI/Gemini/Workers AI) + optional Ollama (${discovered.options.length - 1}).`
535
+ : 'No embed providers discovered — AST/text-only is available. Configure CF/OpenAI/Gemini to unlock Vectorize-ready models.',
536
+ '⑤ Embedding profile',
537
+ );
538
+ const embeddingChoice = pick(await select({
539
+ message: 'Embedding model',
540
+ initialValue: 'none',
541
+ options: discovered.options.map((row) => ({
542
+ value: row.value,
543
+ label: row.label,
544
+ hint: row.hint,
545
+ })),
546
+ }));
547
+ const runEmbed = embeddingChoice !== 'none' && pick(await confirm({
548
+ message: embeddingChoice.startsWith('ollama|')
549
+ ? 'Run local embedding pass?'
550
+ : 'Run embedding pass (may cost provider tokens)?',
551
+ initialValue: embeddingChoice.startsWith('ollama|'),
552
+ }));
553
+
554
+ // ⑥ Storage lanes
555
+ const lane = pick(await select({
556
+ message: '⑥ Vector / data source lane',
557
+ initialValue: 'local',
558
+ options: [
559
+ { value: 'local', label: 'Local SQLite', hint: 'metadata + optional exact vectors · $0 cloud' },
560
+ { value: 'supabase', label: 'Supabase + node-api / Hyperdrive', hint: 'pgvector ANN · BYO edge template' },
561
+ { value: 'vectorize', label: 'Cloudflare Vectorize', hint: 'customer CF lane · not IAM host SSOT' },
562
+ ],
563
+ }));
564
+ const storage = lane === 'supabase' ? 'postgres' : 'sqlite';
565
+ if (lane === 'vectorize') {
566
+ note('Vectorize lane recorded for plan/receipt; full CF adapter wiring is a follow-up slice.', 'Lane note');
567
+ }
568
+ if (lane === 'supabase') {
569
+ note('Uses AGENTSAM_DATABASE_URL / Hyperdrive-style postgres. Owner IAM already has node-api.', 'Lane note');
570
+ }
571
+
572
+ // ⑦ Dry-run vs execute
573
+ const planOnly = pick(await select({
574
+ message: '⑦ Execution',
575
+ initialValue: opts.plan ? 'plan' : 'run',
576
+ options: [
577
+ { value: 'plan', label: 'Dry-run / plan (writes config + plan receipt, no generation activate)', hint: 'recommended first' },
578
+ { value: 'run', label: 'Execute ingest now', hint: 'writes knowledge store' },
579
+ ],
580
+ })) === 'plan';
581
+
582
+ const summary = [
583
+ `root: ${root}`,
584
+ `materials: ${materials.length || 'none'}`,
585
+ `inventory files: ${inventory.counts.files}`,
586
+ `include: ${include.join(', ') || '(from materials)'}`,
587
+ `exclude: ${exclude.join(', ') || '(none)'}`,
588
+ `embedding: ${embeddingChoice}`,
589
+ `lane: ${lane} (metadata=${storage})`,
590
+ `mode: ${planOnly ? 'plan' : 'run'}`,
591
+ ].join('\n');
592
+ note(summary, 'Confirm');
593
+ if (!pick(await confirm({ message: 'Proceed with codebaseindex.ingest?', initialValue: true }))) {
594
+ cancel('Ingest aborted');
595
+ return null;
596
+ }
597
+
598
+ const result = await runCodebaseindexIngest({
599
+ root,
600
+ materials,
601
+ include: include.length ? include : undefined,
602
+ exclude,
603
+ storage,
604
+ vectors: lane === 'vectorize' ? 'vectorize' : lane === 'supabase' ? 'pgvector' : (runEmbed ? 'sqlite_exact' : 'none'),
605
+ embeddingChoice,
606
+ embed: runEmbed,
607
+ planOnly,
608
+ inventory,
609
+ });
610
+
611
+ if (result?.job_graph) {
612
+ note(
613
+ formatJobGraphHuman(result.job_graph, { planOnly }),
614
+ 'Job graph',
615
+ );
616
+ }
617
+
618
+ if (planOnly) {
619
+ outro([
620
+ 'Plan complete',
621
+ '',
622
+ 'No index was written because you selected Dry-run / plan.',
623
+ '',
624
+ 'Pipeline ID (not a shell command)',
625
+ ` ${result.pipeline}`,
626
+ '',
627
+ 'Next',
628
+ ' agentsam codebaseindex',
629
+ ' → choose "Run ingest now"',
630
+ '',
631
+ 'Script/API',
632
+ ' sam.invoke("codebaseindex.ingest", { ..., planOnly: false })',
633
+ '',
634
+ 'tip: use skill agentsam-codebaseindex',
635
+ ].join('\n'));
636
+ } else {
637
+ outro(`Ingest complete · pipeline id ${result.pipeline} (not a shell command)`);
638
+ }
639
+ return result;
640
+ }
641
+
642
+ /**
643
+ * CLI entry: agentsam codebaseindex | ingest
644
+ */
645
+ export async function runCodebaseindex(argv = []) {
646
+ const opts = parseArgv(argv);
647
+ if (opts.help) {
648
+ process.stdout.write(helpText());
649
+ return { ok: true, help: true };
650
+ }
651
+
652
+ const root = repositoryRoot(opts.cwd || process.cwd());
653
+ ensureProjectManifest(root, {});
654
+ const tty = Boolean(process.stdin.isTTY && process.stdout.isTTY);
655
+ const wantInteractive = opts.interactive === true || (opts.interactive !== false && tty && !opts.yes && !opts.paths.length && !opts.include);
656
+
657
+ let result;
658
+ if (wantInteractive) {
659
+ result = await runWizard(root, opts);
660
+ } else {
661
+ result = await runCodebaseindexIngest({
662
+ root,
663
+ materials: opts.paths,
664
+ include: opts.include ? splitList(opts.include) : undefined,
665
+ exclude: opts.exclude ? splitList(opts.exclude) : [],
666
+ storage: opts.storage || 'sqlite',
667
+ embeddingChoice: opts.embedding || 'none',
668
+ embed: opts.embed,
669
+ planOnly: opts.plan,
670
+ });
671
+ }
672
+
673
+ if (!result) return null;
674
+ if (opts.json || !tty) {
675
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
676
+ } else if (!wantInteractive) {
677
+ process.stdout.write(`${pc.green('✓')} codebaseindex.ingest ${result.mode}\n`);
678
+ process.stdout.write(` pipeline ${result.pipeline}\n`);
679
+ process.stdout.write(` include ${(result.include || []).join(', ')}\n`);
680
+ process.stdout.write(` storage ${result.storage?.driver}\n`);
681
+ process.stdout.write(` embedding ${result.embedding?.provider}/${result.embedding?.model}\n`);
682
+ if (result.staged?.assets?.length) {
683
+ process.stdout.write(` assets ${result.staged.assets.length} staged\n`);
684
+ }
685
+ process.stdout.write(` tip: use skill agentsam-codebaseindex\n`);
686
+ }
687
+ return result;
688
+ }