@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
@@ -1,7 +1,10 @@
1
- import { newAccountIdentityId, newAuthUserId, newSessionId, nowUnix } from './ids.js';
2
- import { AUTH_SESSION_TTL_SECONDS } from '../../core/constants.js';
1
+ import { SESSION_POLICY } from '../../core/constants.js';
2
+ import { IdentitySchemaError } from '../../contracts/identity-store.js';
3
+ import { IDENTITY_STORE_SCHEMA_VERSION } from '../../contracts/identity-store.js';
4
+ import { newAccountIdentityId, newAuthUserId, newSessionId, newAuthEventId, nowUnix } from './ids.js';
3
5
  import { DEFAULT_COMPANY_ID, DEFAULT_COMPANY_SLUG, normalizeCompanyRow } from '../../contracts/company.js';
4
6
 
7
+
5
8
  /**
6
9
  * @typedef {object} D1Database
7
10
  * @property {(sql: string) => { bind: (...args: unknown[]) => { first: () => Promise<unknown>, run: () => Promise<unknown>, all: () => Promise<{ results?: unknown[] }> } }} prepare
@@ -12,14 +15,103 @@ import { DEFAULT_COMPANY_ID, DEFAULT_COMPANY_SLUG, normalizeCompanyRow } from '.
12
15
  * @param {D1Database} db
13
16
  * @param {{ sessionTtlSeconds?: number }} [options]
14
17
  */
18
+ async function hashValue(value) {
19
+ const v = String(value || '').trim();
20
+ if (!v) return null;
21
+ const bytes = new TextEncoder().encode(v);
22
+ const digest = await crypto.subtle.digest('SHA-256', bytes);
23
+ return Array.from(new Uint8Array(digest)).map((b) => b.toString(16).padStart(2, '0')).join('');
24
+ }
25
+
15
26
  export function createCloudflareD1Adapter(db, options = {}) {
16
27
  if (!db?.prepare) {
17
28
  throw new Error('cloudflare_d1_adapter_requires_db_binding');
18
29
  }
19
- const sessionTtlSeconds = options.sessionTtlSeconds ?? AUTH_SESSION_TTL_SECONDS;
30
+ const sessionTtlSeconds = options.sessionTtlSeconds ?? SESSION_POLICY.browser.ttlSeconds;
20
31
 
21
32
  return Object.freeze({
33
+ schemaVersion: IDENTITY_STORE_SCHEMA_VERSION,
22
34
  sessionTtlSeconds,
35
+ backend: 'cloudflare-d1',
36
+
37
+ /**
38
+ * Append-only login/logout/failed-attempt audit trail (auth_event_log).
39
+ * Never throws — an observability write must not break a real auth flow.
40
+ * status remains the event outcome only ('ok' | 'failed').
41
+ * Richer context (session, capabilities, activity, client) goes in metadata_json.
42
+ * ip/userAgent are hashed (SHA-256) — raw values are never persisted.
43
+ */
44
+ async logAuthEvent({
45
+ userId,
46
+ accountId,
47
+ eventType,
48
+ status = 'ok',
49
+ provider,
50
+ session,
51
+ capabilities,
52
+ activity,
53
+ client,
54
+ metadata,
55
+ request,
56
+ }) {
57
+ try {
58
+ const ip = request?.headers?.get?.('cf-connecting-ip') || request?.headers?.get?.('x-forwarded-for') || '';
59
+ const ua = request?.headers?.get?.('user-agent') || '';
60
+ const [ipHash, uaHash] = await Promise.all([hashValue(ip), hashValue(ua)]);
61
+ const envelope = {
62
+ ...(metadata && typeof metadata === 'object' ? metadata : {}),
63
+ ...(accountId ? { accountId } : {}),
64
+ ...(session ? { session } : {}),
65
+ ...(capabilities ? { capabilities } : {}),
66
+ ...(activity ? { activity } : {}),
67
+ ...(client ? { client } : {}),
68
+ };
69
+ await db.prepare(
70
+ `INSERT INTO auth_event_log
71
+ (id, user_id, event_type, status, provider, metadata_json, ip_hash, user_agent_hash)
72
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
73
+ ).bind(
74
+ newAuthEventId(),
75
+ userId || null,
76
+ eventType,
77
+ status,
78
+ provider || null,
79
+ JSON.stringify(envelope),
80
+ ipHash,
81
+ uaHash,
82
+ ).run();
83
+ } catch {
84
+ // Never let audit logging break a real login/OAuth flow.
85
+ }
86
+ },
87
+
88
+ /**
89
+ * Account/session activity snapshot for auth receipts (not event outcome).
90
+ * @param {string} userId
91
+ */
92
+ async countAuthActivity(userId) {
93
+ if (!userId) {
94
+ return { loginCount: 0, activeSessionCount: 0, lastLoginAt: null };
95
+ }
96
+ try {
97
+ const logins = await db.prepare(
98
+ `SELECT COUNT(*) AS c, MAX(created_at) AS last_at
99
+ FROM auth_event_log
100
+ WHERE user_id = ? AND event_type = 'login' AND status = 'ok'`,
101
+ ).bind(userId).first();
102
+ const sessions = await db.prepare(
103
+ `SELECT COUNT(*) AS c FROM auth_sessions
104
+ WHERE user_id = ? AND revoked_at IS NULL AND expires_at > ?`,
105
+ ).bind(userId, nowUnix()).first();
106
+ return {
107
+ loginCount: Number(logins?.c || 0),
108
+ activeSessionCount: Number(sessions?.c || 0),
109
+ lastLoginAt: logins?.last_at != null ? Number(logins.last_at) : null,
110
+ };
111
+ } catch {
112
+ return { loginCount: 0, activeSessionCount: 0, lastLoginAt: null };
113
+ }
114
+ },
23
115
 
24
116
  async findUserByEmail(email) {
25
117
  const row = await db.prepare(
@@ -135,27 +227,73 @@ export function createCloudflareD1Adapter(db, options = {}) {
135
227
  return { ok: true, reason };
136
228
  },
137
229
 
138
- async saveOAuthState({ state, provider, codeVerifier, redirectTo, ttlSeconds = 600 }) {
139
- // Dedicated table, deliberately NOT named `oauth_states` -- that name collides
140
- // with unrelated Stripe Connect state tracking in customer apps that reuse
141
- // their inneranimalmedia D1 instance (id/user_id/provider_id/redirect_uri/
142
- // scope schema, no default on primary key). See AgentSamRemix incident,
143
- // 2026-08-29: D1_ERROR: table oauth_states has no column named state.
230
+ async createOAuthTransaction({ state, provider, codeVerifier, returnTo, redirectTo, appId, ttlSeconds = 600 }) {
231
+ if (!appId) {
232
+ throw new IdentitySchemaError(
233
+ 'OAUTH_TRANSACTION_APP_ID_REQUIRED',
234
+ 'OAuth transactions must include app_id',
235
+ );
236
+ }
144
237
  const ts = nowUnix();
145
- await db.prepare(
146
- `INSERT INTO identity_oauth_states (state, provider, code_verifier, redirect_to, expires_at, created_at)
147
- VALUES (?, ?, ?, ?, ?, ?)`,
148
- ).bind(state, provider, codeVerifier, redirectTo || null, ts + ttlSeconds, ts).run();
238
+ const expiresAt = ts + ttlSeconds;
239
+ try {
240
+ await db.prepare(
241
+ `INSERT INTO identity_oauth_states
242
+ (state, provider, code_verifier, redirect_to, app_id, expires_at, created_at)
243
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
244
+ ).bind(state, provider, codeVerifier, returnTo ?? redirectTo ?? null, appId, expiresAt, ts).run();
245
+ } catch (err) {
246
+ throw new IdentitySchemaError(
247
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
248
+ 'identity_oauth_states.app_id required — apply migration 0015 (no silent pre-app_id fallback)',
249
+ { cause: String(err?.message || err) },
250
+ );
251
+ }
149
252
  },
150
253
 
151
- async consumeOAuthState(state) {
152
- const row = await db.prepare(
153
- `SELECT state, provider, code_verifier, redirect_to, expires_at FROM identity_oauth_states WHERE state = ? LIMIT 1`,
154
- ).bind(state).first();
254
+ /** @deprecated Use createOAuthTransaction */
255
+ async saveOAuthState(input) {
256
+ return this.createOAuthTransaction(input);
257
+ },
258
+
259
+ async consumeOAuthTransaction(state) {
260
+ let row;
261
+ try {
262
+ row = await db.prepare(
263
+ `SELECT state, provider, code_verifier, redirect_to, app_id, expires_at, created_at
264
+ FROM identity_oauth_states WHERE state = ? LIMIT 1`,
265
+ ).bind(state).first();
266
+ } catch (err) {
267
+ throw new IdentitySchemaError(
268
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
269
+ 'identity_oauth_states.app_id column missing — apply migration 0015',
270
+ { cause: String(err?.message || err) },
271
+ );
272
+ }
155
273
  if (!row) return null;
156
274
  await db.prepare(`DELETE FROM identity_oauth_states WHERE state = ?`).bind(state).run();
157
275
  if (row.expires_at <= nowUnix()) return null;
158
- return row;
276
+ if (!row.app_id) {
277
+ throw new IdentitySchemaError(
278
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
279
+ 'OAuth transaction missing app_id — refuse silent pre-app_id semantics',
280
+ );
281
+ }
282
+ return {
283
+ state: row.state,
284
+ provider: row.provider,
285
+ code_verifier: row.code_verifier,
286
+ redirect_to: row.redirect_to,
287
+ return_to: row.redirect_to,
288
+ app_id: row.app_id,
289
+ expires_at: row.expires_at,
290
+ created_at: row.created_at,
291
+ };
292
+ },
293
+
294
+ /** @deprecated Use consumeOAuthTransaction */
295
+ async consumeOAuthState(state) {
296
+ return this.consumeOAuthTransaction(state);
159
297
  },
160
298
 
161
299
  async getCompanyBySlug(slug = DEFAULT_COMPANY_SLUG) {
@@ -0,0 +1,319 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import {
5
+ IDENTITY_STORE_SCHEMA_VERSION,
6
+ IdentitySchemaError,
7
+ } from '../../contracts/identity-store.js';
8
+ import { newAccountIdentityId, newAuthEventId, newAuthUserId, newSessionId, nowUnix } from '../cloudflare-d1/ids.js';
9
+ import { SESSION_POLICY } from '../../core/constants.js';
10
+
11
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
12
+ export const SQLITE_MIGRATIONS_DIR = path.resolve(HERE, '../../../migrations/sqlite');
13
+
14
+ /**
15
+ * Apply identity.core + identity.oauth-client (+ optional oauth-server) to a
16
+ * D1-shaped db ({ prepare().bind().run|first|all }).
17
+ *
18
+ * @param {{ prepare: Function }} db
19
+ * @param {{ includeOAuthServer?: boolean }} [opts]
20
+ */
21
+ export async function applySqliteIdentityMigrations(db, opts = {}) {
22
+ const files = [
23
+ '001_identity_core.sql',
24
+ '002_identity_oauth_client.sql',
25
+ ];
26
+ if (opts.includeOAuthServer) files.push('003_identity_oauth_server.sql');
27
+
28
+ for (const file of files) {
29
+ const sql = fs.readFileSync(path.join(SQLITE_MIGRATIONS_DIR, file), 'utf8');
30
+ if (typeof db.exec === 'function') {
31
+ db.exec(sql);
32
+ continue;
33
+ }
34
+ // D1-shaped: run statement-by-statement (no multi-exec).
35
+ const stripped = sql.replace(/\/\*[\s\S]*?\*\//g, '');
36
+ const statements = stripped
37
+ .split(';')
38
+ .map((s) => s.replace(/--[^\n]*/g, '').trim())
39
+ .filter(Boolean);
40
+ for (const statement of statements) {
41
+ await db.prepare(statement).run();
42
+ }
43
+ }
44
+ }
45
+
46
+ async function hashValue(value) {
47
+ const v = String(value || '').trim();
48
+ if (!v) return null;
49
+ const bytes = new TextEncoder().encode(v);
50
+ const digest = await crypto.subtle.digest('SHA-256', bytes);
51
+ return Array.from(new Uint8Array(digest)).map((b) => b.toString(16).padStart(2, '0')).join('');
52
+ }
53
+
54
+ async function requireSchema(db) {
55
+ let row;
56
+ try {
57
+ row = await db.prepare(
58
+ `SELECT value FROM identity_schema_meta WHERE key = 'schema_version' LIMIT 1`,
59
+ ).bind().first();
60
+ } catch (err) {
61
+ throw new IdentitySchemaError(
62
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
63
+ 'identity.core migrations not applied — run applySqliteIdentityMigrations()',
64
+ { cause: String(err?.message || err) },
65
+ );
66
+ }
67
+ const version = Number(row?.value || 0);
68
+ if (version < IDENTITY_STORE_SCHEMA_VERSION) {
69
+ throw new IdentitySchemaError(
70
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
71
+ `identity schema_version=${version}, required=${IDENTITY_STORE_SCHEMA_VERSION}`,
72
+ { version, required: IDENTITY_STORE_SCHEMA_VERSION },
73
+ );
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Local SQLite IdentityStore — full offline identity, no Cloudflare/IAM.
79
+ * @param {{ prepare: Function }} db D1-shaped binding (see createLocalSqliteDatabase)
80
+ * @param {{ sessionTtlSeconds?: number, skipSchemaCheck?: boolean }} [options]
81
+ */
82
+ export function createSqliteIdentityAdapter(db, options = {}) {
83
+ if (!db?.prepare) throw new Error('sqlite_identity_adapter_requires_db');
84
+ const sessionTtlSeconds = options.sessionTtlSeconds ?? SESSION_POLICY.browser.ttlSeconds;
85
+ let schemaReady = Boolean(options.skipSchemaCheck);
86
+
87
+ async function ensure() {
88
+ if (schemaReady) return;
89
+ await requireSchema(db);
90
+ schemaReady = true;
91
+ }
92
+
93
+ return Object.freeze({
94
+ schemaVersion: IDENTITY_STORE_SCHEMA_VERSION,
95
+ sessionTtlSeconds,
96
+ backend: 'sqlite',
97
+
98
+ async findUserByEmail(email) {
99
+ await ensure();
100
+ const row = await db.prepare(
101
+ `SELECT id, email, display_name, password_hash, salt, status, created_at, updated_at
102
+ FROM identity_users WHERE email = ? COLLATE NOCASE LIMIT 1`,
103
+ ).bind(String(email || '').trim().toLowerCase()).first();
104
+ return row || null;
105
+ },
106
+
107
+ async findUserById(userId) {
108
+ await ensure();
109
+ const row = await db.prepare(
110
+ `SELECT id, email, display_name, password_hash, salt, status, created_at, updated_at
111
+ FROM identity_users WHERE id = ? LIMIT 1`,
112
+ ).bind(userId).first();
113
+ return row || null;
114
+ },
115
+
116
+ async createUser({ email, passwordHash, salt, displayName }) {
117
+ await ensure();
118
+ const id = newAuthUserId();
119
+ const ts = nowUnix();
120
+ const normalizedEmail = String(email || '').trim().toLowerCase();
121
+ await db.prepare(
122
+ `INSERT INTO identity_users (id, email, display_name, password_hash, salt, status, created_at, updated_at)
123
+ VALUES (?, ?, ?, ?, ?, 'active', ?, ?)`,
124
+ ).bind(id, normalizedEmail, displayName || null, passwordHash || null, salt || null, ts, ts).run();
125
+ return this.findUserById(id);
126
+ },
127
+
128
+ async updateUserPassword(userId, passwordHash, salt) {
129
+ await ensure();
130
+ const ts = nowUnix();
131
+ await db.prepare(
132
+ `UPDATE identity_users SET password_hash = ?, salt = ?, updated_at = ? WHERE id = ?`,
133
+ ).bind(passwordHash, salt, ts, userId).run();
134
+ },
135
+
136
+ async findUserByProvider(provider, providerSubject) {
137
+ await ensure();
138
+ const row = await db.prepare(
139
+ `SELECT u.id, u.email, u.display_name, u.password_hash, u.salt, u.status, u.created_at, u.updated_at
140
+ FROM identity_external_accounts ea
141
+ JOIN identity_users u ON u.id = ea.user_id
142
+ WHERE ea.provider = ? AND ea.provider_subject = ?
143
+ LIMIT 1`,
144
+ ).bind(provider, providerSubject).first();
145
+ return row || null;
146
+ },
147
+
148
+ async upsertProviderIdentity({ accountId, provider, providerSubject, email }) {
149
+ await ensure();
150
+ const existing = await db.prepare(
151
+ `SELECT id FROM identity_external_accounts WHERE provider = ? AND provider_subject = ? LIMIT 1`,
152
+ ).bind(provider, providerSubject).first();
153
+ const ts = nowUnix();
154
+ if (existing?.id) {
155
+ await db.prepare(
156
+ `UPDATE identity_external_accounts SET user_id = ?, email = ?, updated_at = ? WHERE id = ?`,
157
+ ).bind(accountId, email || null, ts, existing.id).run();
158
+ return existing.id;
159
+ }
160
+ const id = newAccountIdentityId();
161
+ await db.prepare(
162
+ `INSERT INTO identity_external_accounts (id, user_id, provider, provider_subject, email, created_at, updated_at)
163
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
164
+ ).bind(id, accountId, provider, providerSubject, email || null, ts, ts).run();
165
+ return id;
166
+ },
167
+
168
+ async createSession({ userId, email, provider, providerSubject, displayName }) {
169
+ await ensure();
170
+ const id = newSessionId();
171
+ const ts = nowUnix();
172
+ const expiresAt = ts + sessionTtlSeconds;
173
+ await db.prepare(
174
+ `INSERT INTO identity_sessions
175
+ (id, user_id, email, provider, provider_subject, display_name, expires_at, created_at, last_active_at)
176
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
177
+ ).bind(
178
+ id, userId, email || null, provider || 'email', providerSubject || null,
179
+ displayName || null, expiresAt, ts, ts,
180
+ ).run();
181
+ return {
182
+ id, user_id: userId, email, provider: provider || 'email',
183
+ provider_subject: providerSubject || null, display_name: displayName || null,
184
+ expires_at: expiresAt, created_at: ts,
185
+ };
186
+ },
187
+
188
+ async getSession(sessionId) {
189
+ await ensure();
190
+ const row = await db.prepare(
191
+ `SELECT id, user_id, email, provider, provider_subject, display_name, expires_at, revoked_at, created_at, last_active_at
192
+ FROM identity_sessions WHERE id = ? LIMIT 1`,
193
+ ).bind(sessionId).first();
194
+ if (!row || row.revoked_at || row.expires_at <= nowUnix()) return null;
195
+ return row;
196
+ },
197
+
198
+ async revokeSession(sessionId, reason = 'logout') {
199
+ await ensure();
200
+ const ts = nowUnix();
201
+ await db.prepare(
202
+ `UPDATE identity_sessions SET revoked_at = ?, last_active_at = ? WHERE id = ? AND revoked_at IS NULL`,
203
+ ).bind(ts, ts, sessionId).run();
204
+ return { ok: true, reason };
205
+ },
206
+
207
+ async createOAuthTransaction({ state, provider, codeVerifier, returnTo, appId, ttlSeconds = 600 }) {
208
+ await ensure();
209
+ if (!appId) {
210
+ throw new IdentitySchemaError(
211
+ 'OAUTH_TRANSACTION_APP_ID_REQUIRED',
212
+ 'OAuth transactions must include app_id — refusing to create orphan auth state',
213
+ );
214
+ }
215
+ const ts = nowUnix();
216
+ await db.prepare(
217
+ `INSERT INTO identity_oauth_transactions
218
+ (state, provider, code_verifier, return_to, app_id, expires_at, created_at, consumed_at)
219
+ VALUES (?, ?, ?, ?, ?, ?, ?, NULL)`,
220
+ ).bind(state, provider, codeVerifier, returnTo || null, appId, ts + ttlSeconds, ts).run();
221
+ },
222
+
223
+ /** @deprecated Use createOAuthTransaction */
224
+ async saveOAuthState(input) {
225
+ return this.createOAuthTransaction({
226
+ ...input,
227
+ returnTo: input.redirectTo ?? input.returnTo,
228
+ appId: input.appId,
229
+ });
230
+ },
231
+
232
+ async consumeOAuthTransaction(state) {
233
+ await ensure();
234
+ const row = await db.prepare(
235
+ `SELECT state, provider, code_verifier, return_to, app_id, expires_at, created_at, consumed_at
236
+ FROM identity_oauth_transactions WHERE state = ? LIMIT 1`,
237
+ ).bind(state).first();
238
+ if (!row) return null;
239
+ const ts = nowUnix();
240
+ await db.prepare(
241
+ `UPDATE identity_oauth_transactions SET consumed_at = ? WHERE state = ?`,
242
+ ).bind(ts, state).run();
243
+ await db.prepare(`DELETE FROM identity_oauth_transactions WHERE state = ?`).bind(state).run();
244
+ if (row.consumed_at) return null;
245
+ if (row.expires_at <= ts) return null;
246
+ if (!row.app_id) {
247
+ throw new IdentitySchemaError(
248
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
249
+ 'OAuth transaction missing app_id — refuse silent pre-app_id semantics',
250
+ );
251
+ }
252
+ return {
253
+ state: row.state,
254
+ provider: row.provider,
255
+ code_verifier: row.code_verifier,
256
+ redirect_to: row.return_to,
257
+ return_to: row.return_to,
258
+ app_id: row.app_id,
259
+ expires_at: row.expires_at,
260
+ created_at: row.created_at,
261
+ consumed_at: ts,
262
+ };
263
+ },
264
+
265
+ /** @deprecated Use consumeOAuthTransaction */
266
+ async consumeOAuthState(state) {
267
+ return this.consumeOAuthTransaction(state);
268
+ },
269
+
270
+ async logAuthEvent({
271
+ userId, accountId, eventType, status = 'ok', provider,
272
+ session, capabilities, activity, client, metadata, request,
273
+ }) {
274
+ try {
275
+ await ensure();
276
+ const ip = request?.headers?.get?.('cf-connecting-ip') || request?.headers?.get?.('x-forwarded-for') || '';
277
+ const ua = request?.headers?.get?.('user-agent') || '';
278
+ const [ipHash, uaHash] = await Promise.all([hashValue(ip), hashValue(ua)]);
279
+ const envelope = {
280
+ ...(metadata && typeof metadata === 'object' ? metadata : {}),
281
+ ...(accountId ? { accountId } : {}),
282
+ ...(session ? { session } : {}),
283
+ ...(capabilities ? { capabilities } : {}),
284
+ ...(activity ? { activity } : {}),
285
+ ...(client ? { client } : {}),
286
+ };
287
+ await db.prepare(
288
+ `INSERT INTO identity_auth_events
289
+ (id, user_id, event_type, status, provider, metadata_json, ip_hash, user_agent_hash, created_at)
290
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
291
+ ).bind(
292
+ newAuthEventId(), userId || null, eventType, status, provider || null,
293
+ JSON.stringify(envelope), ipHash, uaHash, nowUnix(),
294
+ ).run();
295
+ } catch {
296
+ /* never break auth on audit failure */
297
+ }
298
+ },
299
+
300
+ async countAuthActivity(userId) {
301
+ await ensure();
302
+ if (!userId) return { loginCount: 0, activeSessionCount: 0, lastLoginAt: null };
303
+ const logins = await db.prepare(
304
+ `SELECT COUNT(*) AS c, MAX(created_at) AS last_at
305
+ FROM identity_auth_events
306
+ WHERE user_id = ? AND event_type = 'login' AND status = 'ok'`,
307
+ ).bind(userId).first();
308
+ const sessions = await db.prepare(
309
+ `SELECT COUNT(*) AS c FROM identity_sessions
310
+ WHERE user_id = ? AND revoked_at IS NULL AND expires_at > ?`,
311
+ ).bind(userId, nowUnix()).first();
312
+ return {
313
+ loginCount: Number(logins?.c || 0),
314
+ activeSessionCount: Number(sessions?.c || 0),
315
+ lastLoginAt: logins?.last_at != null ? Number(logins.last_at) : null,
316
+ };
317
+ },
318
+ });
319
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Verify agentsam.app.v1 auth + route + shell contracts.
3
+ * Fail package verification — never ship unresolved shells/routes.
4
+ */
5
+
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { IDENTITY_ROUTE_IDS, REQUIRED_AUTH_ROUTE_IDS } from '../contracts/route-ids.js';
9
+ import { projectionFromAppManifest, createRouteRegistry } from '../contracts/route-projection.js';
10
+ import { IdentityRoutingError } from '../contracts/identity-store.js';
11
+
12
+ /**
13
+ * @param {object} manifest
14
+ * @param {{ appRoot?: string, requireShellFiles?: boolean }} [opts]
15
+ * @returns {{ ok: true, projection: object } | { ok: false, errors: string[] }}
16
+ */
17
+ export function verifyAppAuthContract(manifest, opts = {}) {
18
+ const errors = [];
19
+ const appId = String(manifest?.id || '').trim();
20
+ if (!appId) errors.push('manifest.id required');
21
+ if (manifest?.schema !== 'agentsam.app.v1') {
22
+ errors.push('manifest.schema must be agentsam.app.v1');
23
+ }
24
+
25
+ if (!manifest?.auth) {
26
+ errors.push('auth-capable apps must declare auth { entry, oauth? }');
27
+ } else {
28
+ if (!manifest.auth.entry?.authenticated && !manifest.routes?.entry) {
29
+ errors.push('auth.entry.authenticated or routes.entry required');
30
+ }
31
+ if (!manifest.auth.entry?.login && !manifest.routes?.paths?.[IDENTITY_ROUTE_IDS.LOGIN]
32
+ && !manifest.routes?.[IDENTITY_ROUTE_IDS.LOGIN]) {
33
+ errors.push('auth.entry.login (→ identity.login) required');
34
+ }
35
+ if (!manifest.auth.entry?.failure && !manifest.auth.entry?.login) {
36
+ errors.push('auth.entry.failure or auth.entry.login required for recovery');
37
+ }
38
+ }
39
+
40
+ let projection = null;
41
+ try {
42
+ projection = projectionFromAppManifest(manifest);
43
+ const registry = createRouteRegistry([projection]);
44
+ registry.assertAuthCapable(appId);
45
+ } catch (err) {
46
+ errors.push(err?.message || String(err));
47
+ }
48
+
49
+ if (opts.requireShellFiles !== false && opts.appRoot && projection) {
50
+ for (const [, entry] of projection.routes) {
51
+ if (!entry.shell) continue;
52
+ const shellPath = path.resolve(opts.appRoot, entry.shell);
53
+ if (!fs.existsSync(shellPath)) {
54
+ errors.push(`declared shell missing: ${entry.shell}`);
55
+ }
56
+ }
57
+ const runtimeShell = manifest.runtime?.shell;
58
+ const assetRoot = manifest.runtime?.assetRoot || 'dist';
59
+ if (runtimeShell) {
60
+ const shellPath = path.resolve(opts.appRoot, assetRoot, runtimeShell);
61
+ // Only enforce when dist exists (post-build). Pre-build: skip if assetRoot absent.
62
+ if (fs.existsSync(path.resolve(opts.appRoot, assetRoot)) && !fs.existsSync(shellPath)) {
63
+ errors.push(`runtime.shell missing after build: ${assetRoot}/${runtimeShell}`);
64
+ }
65
+ }
66
+ }
67
+
68
+ for (const mount of manifest.routes?.mounts || []) {
69
+ if (!mount.path?.startsWith('/')) {
70
+ errors.push(`invalid mount path: ${mount.path}`);
71
+ }
72
+ }
73
+
74
+ if (errors.length) return { ok: false, errors };
75
+ return { ok: true, projection, requiredRouteIds: [...REQUIRED_AUTH_ROUTE_IDS] };
76
+ }
77
+
78
+ /**
79
+ * @param {string} appRoot directory containing agentsam.app.json
80
+ */
81
+ export function verifyAppPackage(appRoot, opts = {}) {
82
+ const manifestPath = path.join(appRoot, 'agentsam.app.json');
83
+ if (!fs.existsSync(manifestPath)) {
84
+ return { ok: false, errors: [`missing ${manifestPath}`] };
85
+ }
86
+ let manifest;
87
+ try {
88
+ manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
89
+ } catch (err) {
90
+ return { ok: false, errors: [`invalid JSON: ${err.message}`] };
91
+ }
92
+ return verifyAppAuthContract(manifest, { ...opts, appRoot });
93
+ }
94
+
95
+ export { IdentityRoutingError };