@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,46 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import {
4
+ createErrorEnvelope,
5
+ fromHttpError,
6
+ retryDelayMs,
7
+ shouldRetry,
8
+ toHttpError,
9
+ } from '../src/index.js';
10
+
11
+ test('HTTP transport preserves the complete canonical envelope', () => {
12
+ const error = createErrorEnvelope({
13
+ reason: 'provider_rate_limited',
14
+ message: 'Slow down',
15
+ source: { kind: 'provider', name: 'openai' },
16
+ provider: 'openai',
17
+ provider_code: 'slow_down',
18
+ request_id: 'req_1',
19
+ retry_after_ms: 2000,
20
+ domain: 'provider',
21
+ });
22
+ const http = toHttpError(error);
23
+ const decoded = fromHttpError({ status: http.status, body: http.body, headers: http.headers });
24
+ assert.deepEqual(decoded, error);
25
+ });
26
+
27
+ test('fallback HTTP failures still normalize without provider-specific code', () => {
28
+ const error = fromHttpError({ status: 503, body: { message: 'upstream down' }, provider: 'example' });
29
+ assert.equal(error.code, 'UNAVAILABLE');
30
+ assert.equal(error.reason, 'transport_unreachable');
31
+ assert.equal(error.retryable, true);
32
+ });
33
+
34
+ test('retry policy honors provider Retry-After before exponential fallback', () => {
35
+ const explicit = createErrorEnvelope({ reason: 'provider_rate_limited', message: 'wait', retry_after_ms: 2500 });
36
+ const fallback = createErrorEnvelope({ reason: 'provider_unavailable', message: 'down' });
37
+ assert.equal(shouldRetry(explicit), true);
38
+ assert.equal(retryDelayMs(explicit, 4), 2500);
39
+ assert.equal(retryDelayMs(fallback, 3, { baseMs: 500 }), 2000);
40
+ });
41
+
42
+ test('fingerprints exclude volatile request ids and messages', () => {
43
+ const a = createErrorEnvelope({ reason: 'provider_unavailable', message: 'first', source: { kind: 'provider', name: 'openai' }, provider: 'openai', request_id: 'req_a' });
44
+ const b = createErrorEnvelope({ reason: 'provider_unavailable', message: 'different wording', source: { kind: 'provider', name: 'openai' }, provider: 'openai', request_id: 'req_b' });
45
+ assert.equal(a.fingerprint, b.fingerprint);
46
+ });
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@inneranimalmedia/agentsam-knowledge",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "Portable AutoRAG discovery, adapter registries, probes, and company routing contracts for AgentSam.",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": "./src/index.js",
9
+ "./autorag": "./src/autorag/index.js",
10
+ "./providers": "./src/providers/index.js",
11
+ "./backends": "./src/backends/index.js"
12
+ },
13
+ "scripts": { "test": "node --test test/*.test.mjs" },
14
+ "engines": { "node": ">=22 <25" }
15
+ }
@@ -0,0 +1,64 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { createProviderRegistry } from '../providers/index.js';
5
+ import { createBackendRegistry } from '../backends/index.js';
6
+
7
+ const clean = value => String(value || '').trim();
8
+ const unique = values => [...new Set(values.filter(Boolean))];
9
+ function git(root, args) { try { return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || null; } catch { return null; } }
10
+ function findScopes(root) {
11
+ const candidates = ['packages', 'src', 'services', 'apps', 'docs', 'README.md', 'schema', 'migrations'];
12
+ return candidates.filter(candidate => fs.existsSync(path.join(root, candidate)));
13
+ }
14
+ export async function discoverAutoRag({ root = process.cwd(), env = process.env, companyAdapter = null, fetchImpl } = {}) {
15
+ const isGit = Boolean(git(root, ['rev-parse', '--is-inside-work-tree']));
16
+ const providerRegistry = createProviderRegistry({ gemini: { apiKey: env.GEMINI_API_KEY, fetchImpl }, openai: { apiKey: env.OPENAI_API_KEY, fetchImpl }, ollama: { endpoint: env.OLLAMA_HOST || 'http://127.0.0.1:11434', fetchImpl } });
17
+ const providers = await providerRegistry.capabilities();
18
+ const docker = git(root, ['--version']) && (() => { try { return Boolean(execFileSync('docker', ['--version'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] })); } catch { return false; } })();
19
+ const repositoryId = git(root, ['config', '--get', 'remote.origin.url']) || `local:${path.basename(root)}`;
20
+ return Object.freeze({
21
+ repository: { root, name: path.basename(root), identity: repositoryId, branch: git(root, ['branch', '--show-current']), revision: git(root, ['rev-parse', 'HEAD']), git: isGit, merkle: fs.existsSync(path.join(root, '.agentsam', 'merkle.json')), semantic_merkle: fs.existsSync(path.join(root, '.agentsam', 'merkle.json')) },
22
+ scopes: findScopes(root),
23
+ capabilities: { sqlite: true, git: isGit, merkle: isGit, structural_indexing: true, local_knowledge_engine: true, repository_intelligence: fs.existsSync(path.join(root, 'packages', 'agentsam-repository')), docker, providers, backends: createBackendRegistry().capabilities(), company_graph: Boolean(companyAdapter?.discover) ? await companyAdapter.discover() : { available: false } },
24
+ });
25
+ }
26
+ export function recommendAutoRag({ discovery, purpose = 'code', include, provider = 'none', backend = 'local_exact', semantic = false } = {}) {
27
+ const scopes = include?.length ? unique(include) : purpose === 'code' ? discovery.scopes.filter(scope => ['packages', 'src'].includes(scope)).slice(0, 2) : discovery.scopes.filter(scope => /^(docs|README\.md|schema|migrations)$/.test(scope)).slice(0, 3);
28
+ return Object.freeze({ purpose, repositories: [discovery.repository.identity], scope: scopes.length ? scopes : ['.'], evidence: purpose === 'code' ? ['git', 'merkle', 'semantic-metadata', 'ast', 'lexical'] : ['git', 'merkle', 'lexical'], embedding: semantic ? provider : 'none', control_plane: 'local_sqlite', backend, probe: { max_files: 25, max_chunks: 100, max_semantic_queries: 1, paid_embeddings: false }, company_registration: 'disabled' });
29
+ }
30
+ export function safeAutoRagConfig({ existing = {}, recommendation, repositoryId, projectKey } = {}) {
31
+ const config = structuredClone(existing);
32
+ config.version = Math.max(Number(config.version || 1), 2);
33
+ config.repository_id = config.repository_id || repositoryId;
34
+ config.project_key = config.project_key || projectKey || config.repository_id;
35
+ config.scope = { name: config.scope?.name || recommendation.purpose, include: recommendation.scope, exclude: config.scope?.exclude || [] };
36
+ config.chunking = config.chunking || { max_chars: 4000 };
37
+ config.embedding = recommendation.embedding === 'none' ? { provider: 'none', model: 'none', revision: '1', dimensions: 0, parameters: {} } : (config.embedding || { provider: recommendation.embedding, model: recommendation.embedding === 'ollama' ? 'nomic-embed-text' : recommendation.embedding === 'openai' ? 'text-embedding-3-small' : 'gemini-embedding-2', revision: '1', dimensions: 768, parameters: { task: 'code retrieval' } });
38
+ config.storage = config.storage || { driver: 'sqlite' };
39
+ config.lane = { id: config.lane?.id || `${recommendation.purpose}-local`, backend: recommendation.backend, resource: config.lane?.resource || null, binding: config.lane?.binding || null, index: config.lane?.index || null, metric: config.lane?.metric || 'cosine' };
40
+ return config;
41
+ }
42
+ export async function runAutoRagProbe({ root, config, engine, store, embedder = null, semantic = false, maxFiles = 25, maxChunks = 100, query = 'repository overview' } = {}) {
43
+ if (!engine?.planIndex || !engine?.runIndex || !engine?.retrieve) throw new TypeError('autorag_probe_engine_required');
44
+ if (semantic && !embedder) throw new Error('autorag_probe_semantic_adapter_required');
45
+ // Probes are isolated to a dedicated generation scope. A failed or successful
46
+ // probe therefore cannot replace a healthy normal indexing generation.
47
+ const probeConfig = structuredClone(config);
48
+ probeConfig.scope.name = `${config.scope.name}--probe`;
49
+ const plan = await engine.planIndex({ root, config: probeConfig, store, embed: semantic, limits: { maxFiles, maxChunks } });
50
+ if (plan.receipt.files > maxFiles || plan.receipt.chunks > maxChunks) throw new Error('autorag_probe_limits_not_enforced');
51
+ const result = await engine.runIndex({ root, config: probeConfig, store, embed: semantic, embedder, maxInputs: semantic ? maxChunks : 0, maxCharacters: 200000, limits: { maxFiles, maxChunks }, probe: true });
52
+ const contextPack = await engine.retrieve({ store, config: probeConfig, text: query, semantic, embedder, topK: 3, tokenBudget: 1200, generationId: result.generation_id });
53
+ return Object.freeze({ type: 'agentsam_autorag_probe_receipt', stages: ['discovery', 'source_read', 'chunk', 'structural_index', ...(semantic ? ['embed', 'vector_upsert'] : []), 'verify', 'query'], repository: config.repository_id, scope: config.scope, provider: config.embedding.provider, model: config.embedding.model, dimensions: config.embedding.dimensions, backend: config.lane?.backend || 'local_exact', files: result.files, chunks: result.chunks, generation: result.generation_id, git: result.git, merkle_root: result.merkle_root || null, published: result.published, query_result: contextPack.hits.slice(0, 1), paid_embeddings: false });
54
+ }
55
+ export function selectIntentRoute(routes, { repositoryId, accountId, intent } = {}) {
56
+ const matches = (routes || []).filter(route => route?.is_active !== false && route.intent_key === intent);
57
+ return matches.find(route => clean(route.repository_id) === clean(repositoryId) && clean(repositoryId)) || matches.find(route => clean(route.account_id) === clean(accountId) && !clean(route.repository_id)) || matches.find(route => !clean(route.account_id) && !clean(route.repository_id)) || null;
58
+ }
59
+ export async function routeCompanyQuestion({ question, companyAdapter, accountId, repositoryId, intent = 'code_question', limits = { repositories: 5, lanes: 3 } } = {}) {
60
+ if (!companyAdapter?.candidateRepositories) return { mode: 'local', repositories: repositoryId ? [repositoryId] : [], reason: 'company_graph_unavailable' };
61
+ const route = await companyAdapter.route?.({ accountId, repositoryId, intent }) || null;
62
+ const repositories = (await companyAdapter.candidateRepositories({ question, accountId, repositoryId, intent, route })).slice(0, limits.repositories);
63
+ return { mode: 'company_graph', intent, route, repositories, lane_limit: limits.lanes };
64
+ }
@@ -0,0 +1,26 @@
1
+ const clean = value => String(value || '').trim();
2
+ function profileGuard(profile, supported) {
3
+ if (!supported.includes(profile?.backend)) throw new Error(`backend_profile_mismatch:${profile?.backend}`);
4
+ if (!Number.isInteger(profile?.dimensions) || profile.dimensions < 1) throw new Error('backend_dimensions_required');
5
+ }
6
+ function bindingBackend(id, required) {
7
+ return Object.freeze({
8
+ id, capabilities: () => ({ id, explicit_resource_required: true, supported: true }),
9
+ prepare(profile, context = {}) { profileGuard(profile, [id]); for (const key of required) if (!clean(context[key] || profile[key])) throw new Error(`backend_${id}_${key}_required`); return { id, dimensions: profile.dimensions }; },
10
+ async upsert(records, context = {}) { const backend = context.backend; if (!backend?.upsert) throw new Error(`backend_runtime_unavailable:${id}`); return backend.upsert(records); },
11
+ async delete(ids, context = {}) { const backend = context.backend; if (!backend?.delete) throw new Error(`backend_runtime_unavailable:${id}`); return backend.delete(ids); },
12
+ async query(vector, options, context = {}) { const backend = context.backend; if (!backend?.query) throw new Error(`backend_runtime_unavailable:${id}`); return backend.query(vector, options); },
13
+ async verify(ids, context = {}) { const backend = context.backend; if (!backend?.verify) throw new Error(`backend_runtime_unavailable:${id}`); return backend.verify(ids); },
14
+ health: async context => ({ id, operational: Boolean(context?.backend) }),
15
+ });
16
+ }
17
+ export function createBackendRegistry() {
18
+ const local = Object.freeze({
19
+ id: 'local_exact', capabilities: () => ({ id: 'local_exact', exact: true, external_resource_required: false }),
20
+ prepare(profile) { profileGuard(profile, ['local_exact']); return { id: 'local_exact', dimensions: profile.dimensions }; },
21
+ async upsert(records, context = {}) { if (!context.store?.cachePut) throw new Error('backend_runtime_unavailable:local_exact'); for (const record of records) await context.store.cachePut(record.id, record.vector); return { upserted: records.length }; },
22
+ async delete() { return { deleted: 0 }; }, async query() { throw new Error('backend_query_owned_by_knowledge_store'); }, async verify() { return { verified: true }; }, health: async () => ({ id: 'local_exact', operational: true }),
23
+ });
24
+ const adapters = new Map([['local_exact', local], ['postgres_pgvector', bindingBackend('postgres_pgvector', ['resource'])], ['supabase_pgvector', bindingBackend('supabase_pgvector', ['resource'])], ['cloudflare_vectorize', bindingBackend('cloudflare_vectorize', ['binding', 'index'])]]);
25
+ return Object.freeze({ ids: () => [...adapters.keys()], get(id) { const item = adapters.get(clean(id)); if (!item) throw new Error(`backend_unsupported:${id}`); return item; }, capabilities: () => [...adapters.values()].map(adapter => adapter.capabilities()) });
26
+ }
@@ -0,0 +1,3 @@
1
+ export * from './providers/index.js';
2
+ export * from './backends/index.js';
3
+ export * from './autorag/index.js';
@@ -0,0 +1,107 @@
1
+ const clean = value => String(value || '').trim();
2
+ const finiteVector = (vector, dimensions) => {
3
+ if (!Array.isArray(vector) || vector.length !== dimensions || vector.some(value => typeof value !== 'number' || !Number.isFinite(value))) {
4
+ throw new Error(`provider_vector_dimension_mismatch:${Array.isArray(vector) ? vector.length : 'invalid'}!=${dimensions}`);
5
+ }
6
+ return vector;
7
+ };
8
+
9
+ function httpAdapter({ id, env, models, request, credentials = env, allowAnyModel = false }) {
10
+ return Object.freeze({
11
+ id,
12
+ capabilities: () => ({ id, operational: Boolean(credentials()), models, credentials: credentials() ? 'available' : 'missing' }),
13
+ validate(profile) {
14
+ if (clean(profile?.provider) !== id) throw new Error(`provider_profile_mismatch:${id}`);
15
+ if (!allowAnyModel && !models.includes(clean(profile?.model))) throw new Error(`provider_model_unsupported:${id}:${profile?.model}`);
16
+ if (!Number.isInteger(profile?.dimensions) || profile.dimensions < 1) throw new Error('provider_dimensions_required');
17
+ if (!credentials()) throw new Error(`provider_credentials_unavailable:${id}`);
18
+ },
19
+ dimensions: profile => profile?.dimensions,
20
+ async embedDocuments(inputs, profile, context = {}) { this.validate(profile); return Promise.all(inputs.map(input => request(String(input), profile, { ...context, kind: 'document' }))); },
21
+ async embedQuery(input, profile, context = {}) { this.validate(profile); return request(String(input), profile, { ...context, kind: 'query' }); },
22
+ health: async () => ({ id, operational: Boolean(credentials()), models, credentials: credentials() ? 'available' : 'missing' }),
23
+ });
24
+ }
25
+
26
+ export function createFixtureProvider({ dimensions = 3 } = {}) {
27
+ const vector = text => {
28
+ const bytes = Buffer.from(String(text)); const values = Array.from({ length: dimensions }, () => 0);
29
+ for (let i = 0; i < bytes.length; i++) values[i % dimensions] += (bytes[i] % 23) + 1;
30
+ const norm = Math.hypot(...values) || 1;
31
+ return values.map(value => value / norm);
32
+ };
33
+ return Object.freeze({
34
+ id: 'fixture', capabilities: () => ({ id: 'fixture', operational: true, deterministic: true, models: ['deterministic'] }),
35
+ validate(profile) { if (profile?.provider !== 'fixture') throw new Error('provider_profile_mismatch:fixture'); if (profile.dimensions !== dimensions) throw new Error(`provider_vector_dimension_mismatch:${profile.dimensions}!=${dimensions}`); },
36
+ dimensions: profile => profile?.dimensions,
37
+ async embedDocuments(inputs, profile) { this.validate(profile); return inputs.map(vector); },
38
+ async embedQuery(input, profile) { this.validate(profile); return vector(input); },
39
+ health: async () => ({ id: 'fixture', operational: true }),
40
+ });
41
+ }
42
+
43
+ export function createGeminiProvider({ apiKey = process.env.GEMINI_API_KEY, fetchImpl = globalThis.fetch } = {}) {
44
+ return httpAdapter({ id: 'gemini', env: 'GEMINI_API_KEY', models: ['gemini-embedding-2'], credentials: () => apiKey,
45
+ request: async (text, profile, context) => {
46
+ const prefix = context.kind === 'query' ? `task: ${profile.parameters?.task || 'code retrieval'} | query: ` : 'title: none | text: ';
47
+ const response = await fetchImpl(`https://generativelanguage.googleapis.com/v1beta/models/${profile.model}:embedContent`, { method: 'POST', headers: { 'content-type': 'application/json', 'x-goog-api-key': apiKey }, body: JSON.stringify({ model: `models/${profile.model}`, content: { parts: [{ text: prefix + text }] }, outputDimensionality: profile.dimensions }) });
48
+ if (!response.ok) throw new Error(`provider_request_failed:gemini:${response.status}`);
49
+ return finiteVector((await response.json()).embedding?.values, profile.dimensions);
50
+ } });
51
+ }
52
+
53
+ export function createOpenAIProvider({ apiKey = process.env.OPENAI_API_KEY, fetchImpl = globalThis.fetch } = {}) {
54
+ return httpAdapter({ id: 'openai', env: 'OPENAI_API_KEY', models: ['text-embedding-3-small', 'text-embedding-3-large'], credentials: () => apiKey,
55
+ request: async (text, profile) => {
56
+ const response = await fetchImpl('https://api.openai.com/v1/embeddings', { method: 'POST', headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}` }, body: JSON.stringify({ model: profile.model, input: text, dimensions: profile.dimensions }) });
57
+ if (!response.ok) throw new Error(`provider_request_failed:openai:${response.status}`);
58
+ return finiteVector((await response.json()).data?.[0]?.embedding, profile.dimensions);
59
+ } });
60
+ }
61
+
62
+ export function createWorkersAiProvider({ binding } = {}) {
63
+ return Object.freeze({
64
+ id: 'workers-ai', capabilities: () => ({ id: 'workers-ai', operational: Boolean(binding?.run), execution: 'authenticated-runtime' }),
65
+ validate(profile) { if (profile?.provider !== 'workers-ai') throw new Error('provider_profile_mismatch:workers-ai'); if (!binding?.run) throw new Error('provider_credentials_unavailable:workers-ai'); },
66
+ dimensions: profile => profile?.dimensions,
67
+ async embedDocuments(inputs, profile) { this.validate(profile); return Promise.all(inputs.map(input => binding.run(profile.model, { text: [input] }).then(result => finiteVector(result?.data?.[0] || result?.[0], profile.dimensions)))); },
68
+ async embedQuery(input, profile) { return (await this.embedDocuments([input], profile))[0]; },
69
+ health: async () => ({ id: 'workers-ai', operational: Boolean(binding?.run), execution: 'authenticated-runtime' }),
70
+ });
71
+ }
72
+
73
+ export function createOllamaProvider({ endpoint = process.env.OLLAMA_HOST || 'http://127.0.0.1:11434', fetchImpl = globalThis.fetch, models } = {}) {
74
+ // Model allowlist is advisory only — live `ollama list` / tags are authoritative at selection time.
75
+ const known = Array.isArray(models) && models.length ? models : ['mxbai-embed-large', 'nomic-embed-text'];
76
+ return httpAdapter({
77
+ id: 'ollama',
78
+ env: 'OLLAMA_HOST',
79
+ models: known,
80
+ allowAnyModel: true,
81
+ credentials: () => endpoint,
82
+ request: async (text, profile) => {
83
+ const response = await fetchImpl(new URL('/api/embed', endpoint), {
84
+ method: 'POST',
85
+ headers: { 'content-type': 'application/json' },
86
+ body: JSON.stringify({ model: profile.model, input: text }),
87
+ });
88
+ if (!response.ok) throw new Error(`provider_request_failed:ollama:${response.status}`);
89
+ return finiteVector((await response.json()).embeddings?.[0], profile.dimensions);
90
+ },
91
+ });
92
+ }
93
+
94
+ export function createProviderRegistry(options = {}) {
95
+ const adapters = new Map([
96
+ ['fixture', createFixtureProvider(options.fixture)],
97
+ ['gemini', createGeminiProvider(options.gemini)],
98
+ ['openai', createOpenAIProvider(options.openai)],
99
+ ['workers-ai', createWorkersAiProvider(options.workersAi)],
100
+ ['ollama', createOllamaProvider(options.ollama)],
101
+ ]);
102
+ return Object.freeze({
103
+ ids: () => [...adapters.keys()],
104
+ get(id) { const adapter = adapters.get(clean(id)); if (!adapter) throw new Error(`provider_unsupported:${id}`); return adapter; },
105
+ capabilities: async () => Promise.all([...adapters.values()].map(async adapter => adapter.health())),
106
+ });
107
+ }
@@ -0,0 +1,42 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { createFixtureProvider, createProviderRegistry, createBackendRegistry, recommendAutoRag, safeAutoRagConfig, selectIntentRoute, routeCompanyQuestion } from '../src/index.js';
4
+
5
+ test('provider registry is explicit, deterministic, and fails closed', async () => {
6
+ const registry = createProviderRegistry({ fixture: { dimensions: 3 }, gemini: { apiKey: null }, openai: { apiKey: null } });
7
+ assert.deepEqual(registry.ids(), ['fixture', 'gemini', 'openai', 'workers-ai', 'ollama']);
8
+ const fixture = createFixtureProvider({ dimensions: 3 });
9
+ const profile = { provider: 'fixture', model: 'deterministic', dimensions: 3 };
10
+ assert.equal((await fixture.embedQuery('hello', profile)).length, 3);
11
+ assert.throws(() => registry.get('not-a-provider'), /provider_unsupported/);
12
+ assert.equal((await registry.capabilities()).find(item => item.id === 'gemini').operational, false);
13
+ });
14
+
15
+ test('backend registry requires explicit resources and dimensions', () => {
16
+ const registry = createBackendRegistry();
17
+ assert.deepEqual(registry.get('local_exact').prepare({ backend: 'local_exact', dimensions: 3 }), { id: 'local_exact', dimensions: 3 });
18
+ assert.throws(() => registry.get('cloudflare_vectorize').prepare({ backend: 'cloudflare_vectorize', dimensions: 3 }), /binding_required/);
19
+ assert.throws(() => registry.get('unknown'), /backend_unsupported/);
20
+ });
21
+
22
+ test('recommendation preserves local defaults and never serializes credentials', () => {
23
+ const discovery = { repository: { identity: 'local:demo' }, scopes: ['src', 'docs'] };
24
+ const recommendation = recommendAutoRag({ discovery, purpose: 'code' });
25
+ const config = safeAutoRagConfig({ recommendation, repositoryId: 'local:demo' });
26
+ assert.deepEqual(config.scope.include, ['src']);
27
+ assert.equal(config.embedding.provider, 'none');
28
+ assert.equal(config.lane.backend, 'local_exact');
29
+ assert.equal(JSON.stringify(config).includes('API_KEY'), false);
30
+ });
31
+
32
+ test('routing is repository first, then account, then portable default', async () => {
33
+ const routes = [
34
+ { intent_key: 'code_question', account_id: '', repository_id: '', id: 'default' },
35
+ { intent_key: 'code_question', account_id: 'account', repository_id: '', id: 'account' },
36
+ { intent_key: 'code_question', account_id: 'account', repository_id: 'repo', id: 'repository' },
37
+ ];
38
+ assert.equal(selectIntentRoute(routes, { intent: 'code_question', accountId: 'account', repositoryId: 'repo' }).id, 'repository');
39
+ assert.equal(selectIntentRoute(routes, { intent: 'code_question', accountId: 'account', repositoryId: 'other' }).id, 'account');
40
+ const routed = await routeCompanyQuestion({ question: 'where is auth?', repositoryId: 'repo', companyAdapter: { candidateRepositories: async () => ['repo', 'related', 'unrelated'] } });
41
+ assert.deepEqual(routed.repositories, ['repo', 'related', 'unrelated']);
42
+ });
@@ -0,0 +1,40 @@
1
+ # @inneranimalmedia/agentsam-nav
2
+
3
+ One navigation context, two independently mountable surfaces. The package owns navigation presentation and transient interaction state. The host owns routing, accounts, projects, conversations, persistence, and all network access.
4
+
5
+ ```tsx
6
+ import { Nav } from '@inneranimalmedia/agentsam-nav';
7
+ import '@inneranimalmedia/agentsam-nav/theme.css';
8
+
9
+ <Nav.Provider value={navigation} theme="dark" accentColor="#8B5CF6" peekable defaultOpen={false}>
10
+ <Nav.Sidenav />
11
+ <main>
12
+ <Nav.Topbar rightSlot={<YourWorkspaceControls />} />
13
+ {children}
14
+ </main>
15
+ </Nav.Provider>
16
+ ```
17
+
18
+ Either surface can be omitted. `Nav.Topbar` accepts `children` to replace its composition, or `contextSlot`, `modeSlot`, and `rightSlot`. Named parts include `TopbarLogo`, `ProjectContext`, `TopbarSpacer`, `FilesResources`, `ConversationActions`, `ShareButton`, `AccountSwitcher`, `OverflowMenu`, and `ModeSwitcher`. `Nav.Scope` applies the same appearance to a consumer's layout.
19
+
20
+ ## Configuration
21
+
22
+ `value` supplies `brand`, `mode`, `project`, `conversation`, `projects`, `conversations`, `account`, `accounts`, `destinations`, menu action arrays, and callbacks. Every identity has a stable `id`. Routing uses consumer callbacks and has no router dependency. `brand` contains `name`, `logo`, and `home`. Destinations accept an icon node, label, and either `href` or `onSelect`.
23
+
24
+ Menus use accessible keyboard navigation, collision handling, Escape dismissal, and restored trigger focus. Mobile navigation is a modal drawer. Hover expansion also supports focus. Persistence is deliberately external. `useNav()` exposes shell state and actions for custom controls.
25
+
26
+ ## Appearance contract
27
+
28
+ `theme` is `dark`, `light`, or `system`. `accentColor` controls focus and selected control outlines. `tokens` customizes semantic roles rather than arbitrary selectors: `canvas`, `sidebar`, `surface`, `popover`, `text`, `muted`, `border`, `hover`, `selected`, `danger`, `font`, `label-size`, `meta-size`, `row-height`, `radius`, `menu-radius`, `shadow`, `width`, and `rail-width`.
29
+
30
+ Defaults: 56px topbar/rail, 264px expanded sidenav, 14px labels, 12px metadata, 36px rows, 8px controls, 14px menus. Touch controls expand to 44px. Each surface and portal carries its own theme, so a light commerce host can embed a dark AgentSam shell without changing the host document. Supply complete, contrast-checked token sets when changing colorways. Brand identity, theme, accent, and route configuration remain separate.
31
+
32
+ ## Plain JavaScript hosts
33
+
34
+ `mountNav` from the `/browser` export mounts React portals into host elements while retaining one provider. Pass `sidenav` and/or `topbar` DOM elements plus provider options. The return value supplies `update(options)` and `unmount()`. The optional `browser.global.js` bundle exposes `AgentSamNav.mountNav` and includes its own React runtime for non-React hosts. Load `theme.css` once. Do not use the bundled runtime inside an existing React tree; use the normal peer-dependent React exports there.
35
+
36
+ ## Boundaries
37
+
38
+ No composer, model picker, plugin registry, message renderer, upload transport, browser, terminal, editor, or execution runtime is included. Their controls can be supplied as slots. Menu actions are callbacks; the package does not pretend unavailable operations work. The legacy low-level exports remain available; their stylesheet is `/legacy.css`.
39
+
40
+ Build with `npm run build`; validate with `npm test` and `npm pack`. Distribution contains JavaScript, declarations, scoped CSS, and the browser adapter. Registry publication is a separate release action.
@@ -0,0 +1,43 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import { NavCollapsible, NavCollapsibleContent, NavCollapsibleTrigger } from './NavCollapsible.js';
3
+ import { NavContent } from './NavContent.js';
4
+ import { NavFooter } from './NavFooter.js';
5
+ import { NavGroup, NavGroupLabel } from './NavGroup.js';
6
+ import { NavHeader } from './NavHeader.js';
7
+ import { NavMenu, NavMenuButton, NavMenuChevron, NavMenuItem, NavMenuSub, NavMenuSubButton } from './NavMenu.js';
8
+ import { NavProvider } from './NavProvider.js';
9
+ import { NavTrigger } from './NavTrigger.js';
10
+ import { NavScope, NavSidenav, NavTopbar, NavTopbarLogo, NavTopbarSpacer, NavProjectContext, NavAccountSwitcher, NavFilesResources, NavPinnedSummary, NavConversationActions, NavShareButton, NavOverflowMenu, NavModeSwitcher } from './Surfaces.js';
11
+ declare function NavRoot({ className, children, ...props }: HTMLAttributes<HTMLElement>): import("react").JSX.Element;
12
+ export declare const Nav: typeof NavRoot & {
13
+ Scope: typeof NavScope;
14
+ Sidenav: typeof NavSidenav;
15
+ Topbar: typeof NavTopbar;
16
+ TopbarLogo: typeof NavTopbarLogo;
17
+ TopbarSpacer: typeof NavTopbarSpacer;
18
+ ProjectContext: typeof NavProjectContext;
19
+ AccountSwitcher: typeof NavAccountSwitcher;
20
+ FilesResources: typeof NavFilesResources;
21
+ PinnedSummary: typeof NavPinnedSummary;
22
+ ConversationActions: typeof NavConversationActions;
23
+ ShareButton: typeof NavShareButton;
24
+ OverflowMenu: typeof NavOverflowMenu;
25
+ ModeSwitcher: typeof NavModeSwitcher;
26
+ Provider: typeof NavProvider;
27
+ Header: typeof NavHeader;
28
+ Content: typeof NavContent;
29
+ Footer: typeof NavFooter;
30
+ Group: typeof NavGroup;
31
+ GroupLabel: typeof NavGroupLabel;
32
+ Menu: typeof NavMenu;
33
+ MenuItem: typeof NavMenuItem;
34
+ MenuButton: typeof NavMenuButton;
35
+ MenuSub: typeof NavMenuSub;
36
+ MenuSubButton: typeof NavMenuSubButton;
37
+ MenuChevron: typeof NavMenuChevron;
38
+ Collapsible: typeof NavCollapsible;
39
+ CollapsibleTrigger: typeof NavCollapsibleTrigger;
40
+ CollapsibleContent: typeof NavCollapsibleContent;
41
+ Trigger: typeof NavTrigger;
42
+ };
43
+ export {};
@@ -0,0 +1,10 @@
1
+ import { type ButtonHTMLAttributes, type HTMLAttributes, type ReactElement, type ReactNode } from 'react';
2
+ export declare function NavCollapsible({ children, defaultOpen }: {
3
+ children: ReactNode;
4
+ defaultOpen?: boolean;
5
+ }): import("react").JSX.Element;
6
+ export declare function NavCollapsibleTrigger({ render, children, className, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
7
+ render?: ReactElement;
8
+ children?: ReactNode;
9
+ }): import("react").JSX.Element;
10
+ export declare function NavCollapsibleContent({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavContent({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavGroup({ className, ...props }: HTMLAttributes<HTMLElement>): import("react").JSX.Element;
3
+ export declare function NavGroupLabel({ className, ...props }: HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
2
+ export declare function NavMenu({ className, ...props }: HTMLAttributes<HTMLUListElement>): import("react").JSX.Element;
3
+ export declare function NavMenuItem({ className, ...props }: HTMLAttributes<HTMLLIElement>): import("react").JSX.Element;
4
+ export type NavMenuButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
5
+ icon?: unknown;
6
+ active?: boolean;
7
+ itemId?: string;
8
+ children: ReactNode;
9
+ };
10
+ export declare function NavMenuButton({ icon: Icon, active, itemId, className, children, ...props }: NavMenuButtonProps): import("react").JSX.Element;
11
+ export declare function NavMenuSub({ className, ...props }: HTMLAttributes<HTMLUListElement>): import("react").JSX.Element;
12
+ export type NavMenuSubButtonProps = {
13
+ href?: string;
14
+ active?: boolean;
15
+ className?: string;
16
+ children?: unknown;
17
+ onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
18
+ };
19
+ export declare function NavMenuSubButton({ active, className, children, ...props }: NavMenuSubButtonProps): import("react").JSX.Element;
20
+ export declare function NavMenuChevron({ className }: {
21
+ className?: string;
22
+ }): import("react").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { type PropsWithChildren } from 'react';
2
+ import type { NavTheme, NavValue, NavTokens } from './contracts.js';
3
+ export type NavContextValue = {
4
+ data: NavValue;
5
+ tokens: NavTokens;
6
+ theme: NavTheme;
7
+ accentColor: string;
8
+ menu: string | null;
9
+ setMenu: (menu: string | null) => void;
10
+ open: boolean;
11
+ isMobile: boolean;
12
+ isPeeking: boolean;
13
+ peekable: boolean;
14
+ resizable: boolean;
15
+ width: number;
16
+ mobileBreakpoint: number;
17
+ setOpen: (open: boolean) => void;
18
+ toggle: () => void;
19
+ close: () => void;
20
+ setPeeking: (peeking: boolean) => void;
21
+ setWidth: (width: number) => void;
22
+ scrollToItem: (itemId: string) => void;
23
+ };
24
+ export type NavProviderProps = PropsWithChildren<{
25
+ value?: NavValue;
26
+ tokens?: NavTokens;
27
+ theme?: NavTheme;
28
+ accentColor?: string;
29
+ defaultOpen?: boolean;
30
+ mobileBreakpoint?: number;
31
+ peekable?: boolean;
32
+ resizable?: boolean;
33
+ }>;
34
+ export declare function NavProvider({ children, value: data, tokens, theme, accentColor, defaultOpen, mobileBreakpoint, peekable, resizable, }: NavProviderProps): import("react").JSX.Element;
35
+ export declare function useNav(): NavContextValue;
@@ -0,0 +1,2 @@
1
+ import type { ButtonHTMLAttributes } from 'react';
2
+ export declare function NavTrigger({ className, 'aria-label': ariaLabel, ...props }: ButtonHTMLAttributes<HTMLButtonElement>): import("react").JSX.Element;
@@ -0,0 +1,41 @@
1
+ import { type CSSProperties, type HTMLAttributes, type ReactNode } from 'react';
2
+ import type { NavAccount, NavAction } from './contracts.js';
3
+ export declare function useNavStyle(): CSSProperties;
4
+ export declare function NavScope({ className, style, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
5
+ /** The portal carries its own theme, so standalone surfaces never depend on body CSS. */
6
+ export declare function NavOverflowMenu({ label, actions, children, id: suppliedId, align }: {
7
+ label?: string;
8
+ actions?: NavAction[];
9
+ children?: ReactNode;
10
+ id?: string;
11
+ align?: 'start' | 'center' | 'end';
12
+ }): import("react").JSX.Element;
13
+ export declare function NavTopbarLogo({ variant, onClick, toggle }: {
14
+ variant?: 'mark' | 'expanded';
15
+ onClick?: () => void;
16
+ toggle?: boolean;
17
+ }): import("react").JSX.Element;
18
+ export declare function NavProjectContext(): import("react").JSX.Element;
19
+ export declare function NavTopbarSpacer(): import("react").JSX.Element;
20
+ export declare function NavFilesResources(): import("react").JSX.Element;
21
+ export declare function NavPinnedSummary(): import("react").JSX.Element | null;
22
+ export declare function NavConversationActions(): import("react").JSX.Element;
23
+ export declare function NavShareButton(): import("react").JSX.Element | null;
24
+ export declare function NavAccountSwitcher({ accounts, activeAccountId, onAccountChange, expanded }: {
25
+ accounts?: NavAccount[];
26
+ activeAccountId?: string;
27
+ onAccountChange?: (id: string) => void;
28
+ expanded?: boolean;
29
+ }): import("react").JSX.Element;
30
+ export declare function NavModeSwitcher(): import("react").JSX.Element;
31
+ export declare function NavTopbar({ children, rightSlot, modeSlot, contextSlot, startup, className, showNavigationTrigger, showAccount, }: {
32
+ children?: ReactNode;
33
+ rightSlot?: ReactNode;
34
+ modeSlot?: ReactNode;
35
+ contextSlot?: ReactNode;
36
+ startup?: boolean;
37
+ className?: string;
38
+ showNavigationTrigger?: boolean;
39
+ showAccount?: boolean;
40
+ }): import("react").JSX.Element;
41
+ export declare function NavSidenav(): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import type { NavProviderProps } from './NavProvider.js';
2
+ export interface MountNavOptions extends Omit<NavProviderProps, 'children'> {
3
+ sidenav?: HTMLElement;
4
+ topbar?: HTMLElement;
5
+ startup?: boolean;
6
+ }
7
+ /** Plain HTML integration. Both portals are descendants of the same provider. */
8
+ export declare function mountNav(options: MountNavOptions): {
9
+ update(next: Partial<MountNavOptions>): void;
10
+ unmount(): void;
11
+ };