@inneranimalmedia/agentsam-sdk 2.6.3 → 2.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (608) hide show
  1. package/AGENTSAM.md +17 -0
  2. package/README.md +31 -10
  3. package/apps/client-cms-editor/AGENTS.md +12 -0
  4. package/apps/client-cms-editor/IMPORT_PROVENANCE.json +8 -0
  5. package/apps/client-cms-editor/README.md +72 -0
  6. package/apps/client-cms-editor/agentsam.app.json +57 -0
  7. package/apps/client-cms-editor/backend/README.md +5 -0
  8. package/apps/client-cms-editor/backend/package.json +22 -0
  9. package/apps/client-cms-editor/backend/src/api/client.ts +200 -0
  10. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +145 -0
  11. package/apps/client-cms-editor/backend/src/index.ts +6 -0
  12. package/apps/client-cms-editor/backend/src/model.ts +115 -0
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +79 -0
  14. package/apps/client-cms-editor/backend/src/preview/urls.ts +55 -0
  15. package/apps/client-cms-editor/backend/src/routing/cms-route.js +293 -0
  16. package/apps/client-cms-editor/backend/src/routing/index.js +10 -0
  17. package/apps/client-cms-editor/backend/src/storefront.ts +52 -0
  18. package/apps/client-cms-editor/backend/tsconfig.json +15 -0
  19. package/apps/client-cms-editor/backend/worker/index.js +34 -0
  20. package/apps/client-cms-editor/backend/wrangler.jsonc +11 -0
  21. package/apps/client-cms-editor/bin/agentsam-cms.mjs +229 -0
  22. package/apps/client-cms-editor/frontend/index.html +12 -0
  23. package/apps/client-cms-editor/frontend/package.json +33 -0
  24. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +188 -0
  25. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +191 -0
  26. package/apps/client-cms-editor/frontend/src/CmsEditor.tsx +1345 -0
  27. package/apps/client-cms-editor/frontend/src/env.d.ts +14 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +8 -0
  29. package/apps/client-cms-editor/frontend/src/lib/content-safety.ts +63 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +17 -0
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +51 -0
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +214 -0
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +1739 -0
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +106 -0
  35. package/apps/client-cms-editor/frontend/src/surfaces/CmsDashboard.tsx +313 -0
  36. package/apps/client-cms-editor/frontend/src/surfaces/CmsGuidedChatHero.tsx +121 -0
  37. package/apps/client-cms-editor/frontend/src/surfaces/CmsHubPage.tsx +132 -0
  38. package/apps/client-cms-editor/frontend/src/surfaces/CmsSiteSwitcher.tsx +176 -0
  39. package/apps/client-cms-editor/frontend/src/surfaces/index.ts +5 -0
  40. package/apps/client-cms-editor/frontend/src/surfaces/types.ts +48 -0
  41. package/apps/client-cms-editor/frontend/tsconfig.json +25 -0
  42. package/apps/client-cms-editor/frontend/vite.config.ts +13 -0
  43. package/apps/client-cms-editor/package-lock.json +3832 -0
  44. package/apps/client-cms-editor/package.json +23 -0
  45. package/apps/client-cms-editor/reference/DONOR_README.md +52 -0
  46. package/apps/client-cms-editor/reference/DONOR_package-lock.json +1253 -0
  47. package/apps/client-cms-editor/reference/DONOR_tsconfig.json +15 -0
  48. package/apps/client-cms-editor/shared/cms/package.json +21 -0
  49. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +35 -0
  50. package/apps/client-cms-editor/shared/cms/src/cloudflare-bindings.ts +51 -0
  51. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +58 -0
  52. package/apps/client-cms-editor/shared/cms/src/index.ts +5 -0
  53. package/apps/client-cms-editor/shared/cms/src/publication.ts +24 -0
  54. package/apps/client-cms-editor/shared/cms/src/routes.ts +11 -0
  55. package/apps/client-cms-editor/shared/cms/tsconfig.json +12 -0
  56. package/bin/agentsam +16 -1
  57. package/bin/agentsam-rapid-rust +36 -0
  58. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  59. package/docs/BRAND_INTELLIGENCE.md +1 -1
  60. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  61. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  62. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  63. package/docs/architecture/AGENTSAM_DISTRIBUTION_OWNERSHIP.md +176 -0
  64. package/docs/architecture/AGENTSAM_GO_RUNTIME.md +282 -0
  65. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  66. package/docs/architecture/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  67. package/docs/architecture/FS_E2E_CLOSURE_RECEIPT.md +59 -0
  68. package/docs/architecture/LOCAL_FS_AUTHORITY.md +38 -0
  69. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +36 -0
  70. package/docs/architecture/PLAN_CLI_AND_LOCAL_STUDIO_DESKTOP.md +96 -0
  71. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  72. package/docs/architecture/SAM_ACTIVITY_RECOVERY_RECEIPT.md +39 -0
  73. package/docs/architecture/SAM_DECISION_WORK_RECEIPT.md +54 -0
  74. package/docs/architecture/SAM_KERNEL.md +181 -0
  75. package/docs/architecture/SAM_MACHINE_NORMALIZATION_PRECOMMIT_REPORT.md +208 -0
  76. package/docs/architecture/SLASH_SKILLS_PORTABLE.md +116 -0
  77. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  78. package/docs/architecture/fs-e2e-receipt.latest.json +42 -0
  79. package/docs/architecture/previews/codebaseindex-guided-path/CODEBASEINDEX_GUIDED_PATH.md +202 -0
  80. package/docs/architecture/previews/codebaseindex-guided-path/index.html +321 -0
  81. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  82. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  83. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  84. package/docs/contracts/capability-install-planner.md +67 -0
  85. package/docs/contracts/environment-vocabulary.md +195 -0
  86. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  87. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  88. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  89. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  90. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  91. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  92. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  93. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  94. package/docs/plugins.md +2 -2
  95. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  96. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  97. package/docs/product/README.md +8 -0
  98. package/docs/rapid-rust-wasm.md +35 -0
  99. package/migrations/d1/0010_portable_tickets_memory.sql +140 -0
  100. package/migrations/d1/0011_agentsam_skill_v2.sql +185 -0
  101. package/migrations/d1/0011b_agentsam_skill_v2_cutover.sql +22 -0
  102. package/migrations/d1/0011c_agentsam_skill_v2_backfill.sql +76 -0
  103. package/migrations/d1/0011d_agentsam_skill_v2_retrieval_revisions.sql +50 -0
  104. package/migrations/d1/0012_agentsam_tools_required_seed.sql +67 -0
  105. package/migrations/d1/0013_identity_oauth_states.sql +15 -0
  106. package/migrations/d1/0014_auth_event_log.sql +20 -0
  107. package/migrations/d1/0015_identity_oauth_state_app_id.sql +3 -0
  108. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  109. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +16 -0
  110. package/migrations/sqlite/agentsam_skill_retrieval.portable.sql +42 -0
  111. package/package.json +88 -14
  112. package/packages/agentsam-brand/README.md +106 -11
  113. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  114. package/packages/agentsam-brand/package.json +39 -7
  115. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  116. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  117. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  118. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  119. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  120. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  121. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  122. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  123. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  124. package/packages/agentsam-brand/src/core/errors.js +12 -0
  125. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  126. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  127. package/packages/agentsam-brand/src/core/keys.js +83 -0
  128. package/packages/agentsam-brand/src/core/naming.js +142 -0
  129. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  130. package/packages/agentsam-brand/src/core/pack.js +305 -0
  131. package/packages/agentsam-brand/src/core/plan.js +276 -0
  132. package/packages/agentsam-brand/src/core/preview.js +159 -0
  133. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  134. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  135. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  136. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  137. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  138. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  139. package/packages/agentsam-brand/src/core/promote.js +288 -0
  140. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  141. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  142. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  143. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  144. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  145. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  146. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  147. package/packages/agentsam-brand/src/index.js +193 -36
  148. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  149. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  150. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  151. package/packages/agentsam-brand/src/presets/index.js +40 -0
  152. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  153. package/packages/agentsam-brand/src/presets/model.json +8 -0
  154. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  155. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  156. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  157. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  158. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  159. package/packages/agentsam-contracts/src/errors.ts +16 -0
  160. package/packages/agentsam-errors/src/envelope.js +53 -0
  161. package/packages/agentsam-errors/src/index.js +1 -0
  162. package/packages/agentsam-errors/src/recovery.js +301 -0
  163. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  164. package/packages/agentsam-knowledge/src/providers/index.js +20 -6
  165. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  166. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  167. package/packages/agentsam-nav/package.json +2 -2
  168. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  169. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  170. package/packages/agentsam-rapid-rust/README.md +5 -0
  171. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  172. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  173. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  174. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  175. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  176. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  177. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  178. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  179. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  180. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  181. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  182. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  183. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  184. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  185. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  186. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  187. package/packages/agentsam-repository/src/index.js +1 -0
  188. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  189. package/packages/agentsam-repository/src/source-types.js +85 -0
  190. package/packages/agentsam-vault/README.md +96 -0
  191. package/packages/agentsam-vault/package.json +32 -0
  192. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  193. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  194. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  195. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  196. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  197. package/packages/agentsam-vault/src/index.d.ts +9 -0
  198. package/packages/agentsam-vault/src/index.js +27 -0
  199. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  200. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  201. package/packages/agentsam-workbench/README.md +24 -0
  202. package/packages/agentsam-workbench/package.json +38 -0
  203. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  204. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  205. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  206. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  207. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  208. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  209. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  210. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  211. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  212. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  213. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  214. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  215. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  216. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  217. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  218. package/packages/agentsam-workbench/src/index.ts +6 -0
  219. package/packages/agentsam-workbench/src/project-control.css +160 -0
  220. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  221. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  222. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  223. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  224. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  225. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  226. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  227. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  228. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  229. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  230. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  231. package/packages/agentsam-workbench/tsconfig.json +13 -0
  232. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  233. package/packages/connectors/cloudflare/package.json +3 -1
  234. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  235. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  236. package/packages/connectors/cloudflare/src/credential.js +318 -0
  237. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  238. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  239. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  240. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  241. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  242. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  243. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  244. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  245. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  246. package/packages/connectors/cloudflare/src/index.js +102 -265
  247. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  248. package/packages/connectors/cloudflare/src/owner.js +42 -12
  249. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  250. package/packages/connectors/cloudflare/src/routes.js +318 -144
  251. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  252. package/packages/connectors/cloudflare/src/vault.js +2 -2
  253. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  254. package/packages/connectors/cloudflare/tests/connector.test.mjs +51 -30
  255. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  256. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  257. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  258. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  259. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +31 -2
  260. package/packages/identity/README.md +1 -1
  261. package/packages/identity/backend/README.md +1 -1
  262. package/packages/identity/docs/PORTABLE_IDENTITY_ARCHITECTURE.md +50 -0
  263. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +32 -0
  264. package/packages/identity/migrations/sqlite/001_identity_core.sql +99 -0
  265. package/packages/identity/migrations/sqlite/002_identity_oauth_client.sql +38 -0
  266. package/packages/identity/migrations/sqlite/003_identity_oauth_server.sql +64 -0
  267. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  268. package/packages/identity/package.json +3 -2
  269. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  270. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  271. package/packages/identity/src/adapters/cloudflare-d1/index.js +153 -24
  272. package/packages/identity/src/adapters/sqlite/index.js +322 -0
  273. package/packages/identity/src/app/verify-app.js +95 -0
  274. package/packages/identity/src/contracts/auth-config.js +28 -8
  275. package/packages/identity/src/contracts/external-identity.js +1 -1
  276. package/packages/identity/src/contracts/identity-store.js +115 -0
  277. package/packages/identity/src/contracts/provider.js +1 -0
  278. package/packages/identity/src/contracts/route-ids.js +30 -0
  279. package/packages/identity/src/contracts/route-projection.js +218 -0
  280. package/packages/identity/src/contracts/routes.js +11 -0
  281. package/packages/identity/src/core/browser-paths.js +4 -5
  282. package/packages/identity/src/core/constants.js +13 -8
  283. package/packages/identity/src/core/session-policy.js +32 -0
  284. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  285. package/packages/identity/src/frontend/auth-portal/pages/login.html +16 -15
  286. package/packages/identity/src/frontend/auth-portal/pages/reset.html +9 -8
  287. package/packages/identity/src/frontend/auth-portal/pages/signup.html +9 -8
  288. package/packages/identity/src/frontend/auth-portal/preview/dashboard-stub.html +1 -1
  289. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  290. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  291. package/packages/identity/src/index.js +41 -0
  292. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  293. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  294. package/packages/identity/src/migrations/README.md +5 -2
  295. package/packages/identity/src/oauth/README.md +19 -8
  296. package/packages/identity/src/oauth/consent-view.js +388 -0
  297. package/packages/identity/src/oauth/credentials.js +46 -19
  298. package/packages/identity/src/oauth/finalize-inbound.js +1 -1
  299. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  300. package/packages/identity/src/oauth/iam-platform.js +8 -7
  301. package/packages/identity/src/oauth/redirect-paths.js +27 -36
  302. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  303. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  304. package/packages/identity/src/providers/iam/index.js +27 -5
  305. package/packages/identity/src/server/identity-service.js +61 -15
  306. package/packages/identity/src/server/mount-policy.js +30 -0
  307. package/packages/identity/src/server/post-auth.js +79 -0
  308. package/packages/identity/src/server/worker-router.js +208 -146
  309. package/packages/identity/tests/auth-config.test.mjs +3 -2
  310. package/packages/identity/tests/finalize-inbound-oauth.test.mjs +6 -6
  311. package/packages/identity/tests/iam-provider.test.mjs +1 -1
  312. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  313. package/packages/identity/tests/identity-service.test.mjs +52 -5
  314. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  315. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  316. package/packages/identity/tests/oauth-credentials.test.mjs +20 -5
  317. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  318. package/packages/identity/tests/portable-identity-architecture.test.mjs +157 -0
  319. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  320. package/packages/identity/tests/session-routes-policy.test.mjs +21 -0
  321. package/packages/runtime-protocol/src/index.js +154 -0
  322. package/packages/theme-church-site/package.json +2 -1
  323. package/packages/theme-church-site/src/index.js +1 -0
  324. package/packages/theme-companions-site/package.json +2 -1
  325. package/packages/theme-companions-site/src/index.js +1 -0
  326. package/packages/theme-floors-site/package.json +2 -1
  327. package/packages/theme-floors-site/src/index.js +1 -0
  328. package/packages/theme-fuelnfree-site/package.json +2 -1
  329. package/packages/theme-fuelnfree-site/src/index.js +1 -0
  330. package/packages/theme-handyman-site/package.json +2 -1
  331. package/packages/theme-handyman-site/src/index.js +1 -0
  332. package/packages/theme-insurance-site/package.json +2 -1
  333. package/packages/theme-insurance-site/src/index.js +1 -0
  334. package/packages/theme-scenes/README.md +164 -0
  335. package/packages/theme-scenes/package.json +53 -0
  336. package/packages/theme-scenes/src/blocks/index.js +30 -0
  337. package/packages/theme-scenes/src/contracts/index.js +286 -0
  338. package/packages/theme-scenes/src/demos/index.js +65 -0
  339. package/packages/theme-scenes/src/index.js +75 -0
  340. package/packages/theme-scenes/src/presets/index.js +263 -0
  341. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  342. package/packages/theme-scenes/src/scenes/index.js +146 -0
  343. package/packages/theme-scenes/src/shell/index.js +47 -0
  344. package/packages/theme-scenes/src/themes/index.js +129 -0
  345. package/packages/theme-scenes/src/visuals/index.js +41 -0
  346. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  347. package/packages/theme-shinshu-site/package.json +2 -1
  348. package/packages/theme-shinshu-site/src/index.js +1 -0
  349. package/packages/work-graph/src/index.js +34 -1
  350. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  351. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  352. package/protocol/README.md +15 -7
  353. package/protocol/apps/agentsam.app.v1.schema.json +133 -0
  354. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  355. package/protocol/assets/README.md +9 -0
  356. package/protocol/assets/asset-record.v1.schema.json +64 -0
  357. package/protocol/brand/brandpack.v1.schema.json +43 -0
  358. package/protocol/credentials/issue.v1.schema.json +38 -0
  359. package/protocol/database/connection.v1.schema.json +41 -0
  360. package/protocol/embeddings/embedding-profile.v1.schema.json +20 -0
  361. package/protocol/errors/error-envelope.schema.json +135 -1
  362. package/protocol/errors/recovery.v1.schema.json +50 -0
  363. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  364. package/protocol/runtime/workspace-fs.v1.schema.json +71 -0
  365. package/protocol/sam/activity.v1.schema.json +48 -0
  366. package/protocol/sam/answer.v1.schema.json +35 -0
  367. package/protocol/sam/calibration.v1.schema.json +21 -0
  368. package/protocol/sam/decision-receipt.v1.schema.json +29 -0
  369. package/protocol/sam/evaluation.v1.schema.json +19 -0
  370. package/protocol/sam/operation.schema.json +66 -0
  371. package/protocol/sam/outcome.v1.schema.json +36 -0
  372. package/protocol/sam/question.v1.schema.json +26 -0
  373. package/protocol/sam/registry.seed.json +153 -0
  374. package/protocol/sam/result.schema.json +53 -0
  375. package/protocol/sam/state.v1.schema.json +23 -0
  376. package/protocol/scoring/README.md +10 -0
  377. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  378. package/protocol/skills/agentsam.interaction.v1.schema.json +50 -0
  379. package/protocol/skills/agentsam.skill.v1.schema.json +57 -0
  380. package/protocol/ui/icon-registry.mjs +227 -0
  381. package/protocol/ui/icon.v1.schema.json +51 -0
  382. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  383. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  384. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  385. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  386. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  387. package/scripts/build_rapid_rust_cli.py +83 -0
  388. package/skills/README.md +22 -9
  389. package/skills/agentsam-codebaseindex/SKILL.md +225 -0
  390. package/skills/catalog.json +14 -0
  391. package/src/attachments/index.js +6 -0
  392. package/src/attachments/intake.js +235 -0
  393. package/src/capabilities/repository-snapshot.js +19 -2
  394. package/src/cli/command-catalog.js +138 -0
  395. package/src/cli/dispatch.js +48 -0
  396. package/src/cli.js +225 -27
  397. package/src/commands/account-auth.js +94 -8
  398. package/src/commands/api-key.js +244 -0
  399. package/src/commands/app.js +365 -29
  400. package/src/commands/billing.js +127 -0
  401. package/src/commands/brand.js +86 -74
  402. package/src/commands/cheat-sheet.js +154 -0
  403. package/src/commands/cloudflare-login.js +222 -0
  404. package/src/commands/cloudflare.js +453 -23
  405. package/src/commands/codebaseindex.js +693 -0
  406. package/src/commands/compute.js +4 -0
  407. package/src/commands/connections.js +11 -5
  408. package/src/commands/credentials.js +116 -0
  409. package/src/commands/env.js +152 -25
  410. package/src/commands/gcloud-auth.js +427 -0
  411. package/src/commands/go.js +366 -53
  412. package/src/commands/google-cloud.js +375 -0
  413. package/src/commands/identity-init.js +2 -2
  414. package/src/commands/interaction-clack.js +115 -0
  415. package/src/commands/mcp.js +226 -33
  416. package/src/commands/models.js +1 -1
  417. package/src/commands/ollama.js +3 -2
  418. package/src/commands/plugins.js +7 -2
  419. package/src/commands/product.js +36 -0
  420. package/src/commands/providers.js +62 -14
  421. package/src/commands/runtime-status.js +28 -9
  422. package/src/commands/runtime.js +313 -0
  423. package/src/commands/rust.js +24 -0
  424. package/src/commands/setup.js +279 -0
  425. package/src/commands/shell.js +59 -5
  426. package/src/commands/skill.js +248 -0
  427. package/src/commands/skills.js +1 -1
  428. package/src/commands/start-local.js +6 -2
  429. package/src/commands/terminal.js +171 -0
  430. package/src/commands/update.js +140 -0
  431. package/src/commands/whoami.js +392 -56
  432. package/src/features/resolve.js +1 -0
  433. package/src/go/build.js +229 -39
  434. package/src/go/cloudflare.js +506 -105
  435. package/src/go/container.js +120 -0
  436. package/src/go/contract.js +9 -4
  437. package/src/go/discover.js +149 -33
  438. package/src/go/index.js +15 -3
  439. package/src/go/native-probe-runner.mjs +119 -0
  440. package/src/go/{registry.js → official-registry.js} +64 -7
  441. package/src/go/official-release.js +10 -0
  442. package/src/go/receipts.js +77 -10
  443. package/src/go/verify.js +9 -2
  444. package/src/index.js +31 -0
  445. package/src/indexing/ingest/discover-models.js +298 -0
  446. package/src/indexing/ingest/inventory.js +478 -0
  447. package/src/indexing/ingest/job-graph.js +181 -0
  448. package/src/indexing/ingest/materials.js +204 -0
  449. package/src/indexing/ingest/style-evidence.js +181 -0
  450. package/src/knowledge/source.js +3 -3
  451. package/src/lib/account-session.js +11 -4
  452. package/src/lib/app-authority.js +172 -0
  453. package/src/lib/auth.js +94 -21
  454. package/src/lib/core-client.js +5 -6
  455. package/src/lib/credentials-audit.js +451 -0
  456. package/src/lib/deploy/health.js +24 -6
  457. package/src/lib/detect-context.js +7 -1
  458. package/src/lib/google-cloud-connection.js +270 -0
  459. package/src/lib/google-cloud-inventory.js +385 -0
  460. package/src/lib/google-desktop-oauth.js +372 -0
  461. package/src/lib/google-studio-brokered-oauth.js +158 -0
  462. package/src/lib/identity-scaffold.js +24 -6
  463. package/src/lib/init-options.js +192 -0
  464. package/src/lib/local-scaffold.js +48 -16
  465. package/src/lib/provider-command-remediation.js +308 -0
  466. package/src/lib/provider-credentials.js +71 -21
  467. package/src/lib/scaffold/index.js +8 -2
  468. package/src/lib/scaffold/mcp-server.js +43 -0
  469. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  470. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  471. package/src/lib/scaffold/wizards/cms.js +93 -0
  472. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  473. package/src/lib/setup/contract.js +26 -0
  474. package/src/lib/setup/discover.js +116 -0
  475. package/src/lib/setup/execute.js +205 -0
  476. package/src/lib/setup/planner.js +134 -0
  477. package/src/lib/setup/recipes.js +235 -0
  478. package/src/lib/setup/runtime-persist.js +197 -0
  479. package/src/lib/setup/runtime.js +394 -0
  480. package/src/lib/slash-commands.js +3 -0
  481. package/src/lib/terminal/machine-identity.js +95 -0
  482. package/src/lib/terminal-local.js +164 -0
  483. package/src/lib/terminal-scopes.js +52 -0
  484. package/src/lib/whoami-capabilities.js +184 -0
  485. package/src/local-fs/capability.js +121 -0
  486. package/src/local-fs/freshness.js +75 -0
  487. package/src/local-fs/index.js +385 -0
  488. package/src/local-fs/paths.js +100 -0
  489. package/src/local-pty/server.js +326 -21
  490. package/src/mcp/authority.js +58 -108
  491. package/src/mcp/client-adapters.js +68 -144
  492. package/src/mcp/client.js +142 -122
  493. package/src/mcp/cloudflare-bundles.js +225 -0
  494. package/src/mcp/index.js +12 -0
  495. package/src/models/ai-access-onboarding.js +112 -0
  496. package/src/models/discovery.js +10 -2
  497. package/src/models/inventory-core.js +9 -1
  498. package/src/plugins/cloudflare.js +1 -1
  499. package/src/providers/ollama-chat.js +2 -1
  500. package/src/sam/activity/index.js +183 -0
  501. package/src/sam/client.js +252 -0
  502. package/src/sam/decision/calibration.js +109 -0
  503. package/src/sam/decision/confidence.js +126 -0
  504. package/src/sam/decision/evaluate.js +157 -0
  505. package/src/sam/decision/evaluators/deterministic.js +341 -0
  506. package/src/sam/decision/evaluators/heuristic.js +61 -0
  507. package/src/sam/decision/evaluators/select.js +50 -0
  508. package/src/sam/decision/evaluators/semantic.js +149 -0
  509. package/src/sam/decision/hierarchical.js +61 -0
  510. package/src/sam/decision/index.js +53 -0
  511. package/src/sam/decision/policy.js +86 -0
  512. package/src/sam/decision/questions.js +120 -0
  513. package/src/sam/decision/receipt.js +148 -0
  514. package/src/sam/decision/state.js +117 -0
  515. package/src/sam/decision/types.js +22 -0
  516. package/src/sam/decision/validate.js +200 -0
  517. package/src/sam/define.js +51 -0
  518. package/src/sam/index.js +65 -0
  519. package/src/sam/operations/brand-scan.js +62 -0
  520. package/src/sam/operations/cad-blender-inspect.js +36 -0
  521. package/src/sam/operations/codebaseindex-ingest.js +49 -0
  522. package/src/sam/operations/decision-evaluate.js +59 -0
  523. package/src/sam/operations/planning-astar.js +77 -0
  524. package/src/sam/operations/planning-goap.js +60 -0
  525. package/src/sam/operations/repository-inspect.js +72 -0
  526. package/src/sam/operations/security-scan.js +33 -0
  527. package/src/sam/operations/terminal-exec.js +29 -0
  528. package/src/sam/planning/astar.js +311 -0
  529. package/src/sam/planning/goap.js +177 -0
  530. package/src/sam/planning/index.js +21 -0
  531. package/src/sam/planning/state.js +84 -0
  532. package/src/sam/registry.js +48 -0
  533. package/src/sam/result.js +77 -0
  534. package/src/sam/seed.js +44 -0
  535. package/src/sam/types.js +116 -0
  536. package/src/security/inventory.js +12 -2
  537. package/src/security/local-vault.js +2 -0
  538. package/src/security/scan.js +1 -1
  539. package/src/skills/catalog.js +64 -0
  540. package/src/skills/content-resolver.js +124 -0
  541. package/src/skills/hosted-store.js +37 -0
  542. package/src/skills/index.js +29 -64
  543. package/src/skills/interaction.js +102 -0
  544. package/src/skills/local-store.js +228 -0
  545. package/src/skills/manifest.js +104 -0
  546. package/src/skills/metrics.js +31 -0
  547. package/src/skills/registry.js +184 -0
  548. package/src/skills/runtime.js +287 -0
  549. package/src/skills/slash.js +44 -0
  550. package/src/ui/cli/help.js +94 -101
  551. package/test/account-session.test.mjs +3 -3
  552. package/test/app-authority-context.test.mjs +32 -0
  553. package/test/cli/api-key-env-whoami.test.mjs +129 -0
  554. package/test/cli/codebaseindex-plan-ux.test.mjs +37 -0
  555. package/test/cli/go.test.mjs +62 -5
  556. package/test/cli/mcp-client.test.mjs +21 -10
  557. package/test/cli/runtime-persist.test.mjs +56 -0
  558. package/test/cli/rust-command.test.mjs +21 -0
  559. package/test/cli/skill-npm-and-env.test.mjs +52 -0
  560. package/test/cli/wireframes-go-registry.test.mjs +87 -2
  561. package/test/credentials-audit.test.mjs +113 -0
  562. package/test/deploy-health-scan.test.mjs +29 -1
  563. package/test/gcloud-auth.test.mjs +111 -0
  564. package/test/go/build-source-identity.test.mjs +31 -0
  565. package/test/go/cloudflare-probe.test.mjs +274 -10
  566. package/test/go/distribution.test.mjs +28 -0
  567. package/test/google-cloud-connection.test.mjs +83 -0
  568. package/test/google-cloud-inventory.test.mjs +64 -0
  569. package/test/init-options.test.mjs +35 -0
  570. package/test/integration/ai-access-onboarding.test.mjs +47 -0
  571. package/test/integration/app-command.test.mjs +30 -0
  572. package/test/integration/cad-project.test.mjs +4 -1
  573. package/test/integration/cli-help.test.mjs +1 -1
  574. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  575. package/test/integration/cms-site-tenancy-contract.test.mjs +9 -8
  576. package/test/integration/codebaseindex-ingest.test.mjs +214 -0
  577. package/test/integration/features-resolve.test.mjs +30 -11
  578. package/test/integration/icon-registry.test.mjs +67 -0
  579. package/test/integration/ingest-discover-models.test.mjs +30 -0
  580. package/test/integration/inspect-path-cli.test.mjs +46 -0
  581. package/test/integration/install-script.test.mjs +12 -9
  582. package/test/integration/inventory-evidence.test.mjs +125 -0
  583. package/test/integration/local-fs.test.mjs +113 -0
  584. package/test/integration/provider-env-cli.test.mjs +2 -1
  585. package/test/integration/runtime-status.integration.test.mjs +2 -1
  586. package/test/integration/sam-activity-recovery.test.mjs +147 -0
  587. package/test/integration/sam-decision.test.mjs +584 -0
  588. package/test/integration/sam-kernel.test.mjs +99 -0
  589. package/test/integration/sam-planning-astar.test.mjs +279 -0
  590. package/test/integration/skill-runtime.test.mjs +240 -0
  591. package/test/integration/studio-fs-pty-e2e.test.mjs +294 -0
  592. package/test/knowledge.test.mjs +35 -1
  593. package/test/loopback-oauth.test.mjs +53 -0
  594. package/test/models.test.mjs +14 -7
  595. package/test/ollama.test.mjs +22 -0
  596. package/test/security.test.mjs +23 -0
  597. package/test/setup-planner.test.mjs +74 -0
  598. package/test/setup-runtime.test.mjs +51 -0
  599. package/test/shell.test.mjs +4 -4
  600. package/test/terminal/local-pty.mock.test.mjs +3 -1
  601. package/test/terminal-machine-identity.test.mjs +88 -0
  602. package/test/whoami-resume.test.mjs +27 -6
  603. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  604. package/packages/work-graph/prototype/README.md +0 -32
  605. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  606. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  607. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  608. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -0,0 +1,64 @@
1
+ -- identity.oauth-server — OPTIONAL pack for products that issue their own
2
+ -- client IDs, authorization codes, access tokens, and refresh tokens.
3
+ -- Do not apply unless the installed product is an OAuth authorization server.
4
+
5
+ INSERT OR IGNORE INTO identity_schema_meta (key, value)
6
+ VALUES ('pack_oauth_server', '1');
7
+
8
+ CREATE TABLE IF NOT EXISTS identity_oauth_clients (
9
+ id TEXT PRIMARY KEY NOT NULL,
10
+ client_id TEXT NOT NULL UNIQUE,
11
+ client_secret_hash TEXT,
12
+ name TEXT NOT NULL,
13
+ redirect_uris_json TEXT NOT NULL DEFAULT '[]',
14
+ grant_types_json TEXT NOT NULL DEFAULT '["authorization_code"]',
15
+ token_endpoint_auth_method TEXT NOT NULL DEFAULT 'none',
16
+ created_at INTEGER NOT NULL,
17
+ updated_at INTEGER NOT NULL
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS identity_oauth_authorization_codes (
21
+ code_hash TEXT PRIMARY KEY NOT NULL,
22
+ client_id TEXT NOT NULL,
23
+ user_id TEXT NOT NULL,
24
+ redirect_uri TEXT NOT NULL,
25
+ scopes_json TEXT NOT NULL DEFAULT '[]',
26
+ code_challenge TEXT,
27
+ code_challenge_method TEXT,
28
+ expires_at INTEGER NOT NULL,
29
+ consumed_at INTEGER,
30
+ created_at INTEGER NOT NULL,
31
+ FOREIGN KEY (user_id) REFERENCES identity_users(id)
32
+ );
33
+
34
+ CREATE TABLE IF NOT EXISTS identity_oauth_access_tokens (
35
+ token_hash TEXT PRIMARY KEY NOT NULL,
36
+ client_id TEXT NOT NULL,
37
+ user_id TEXT NOT NULL,
38
+ scopes_json TEXT NOT NULL DEFAULT '[]',
39
+ expires_at INTEGER NOT NULL,
40
+ revoked_at INTEGER,
41
+ created_at INTEGER NOT NULL,
42
+ FOREIGN KEY (user_id) REFERENCES identity_users(id)
43
+ );
44
+
45
+ CREATE TABLE IF NOT EXISTS identity_oauth_refresh_tokens (
46
+ token_hash TEXT PRIMARY KEY NOT NULL,
47
+ client_id TEXT NOT NULL,
48
+ user_id TEXT NOT NULL,
49
+ scopes_json TEXT NOT NULL DEFAULT '[]',
50
+ expires_at INTEGER NOT NULL,
51
+ revoked_at INTEGER,
52
+ created_at INTEGER NOT NULL,
53
+ FOREIGN KEY (user_id) REFERENCES identity_users(id)
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS identity_oauth_grants (
57
+ id TEXT PRIMARY KEY NOT NULL,
58
+ client_id TEXT NOT NULL,
59
+ user_id TEXT NOT NULL,
60
+ scopes_json TEXT NOT NULL DEFAULT '[]',
61
+ created_at INTEGER NOT NULL,
62
+ revoked_at INTEGER,
63
+ FOREIGN KEY (user_id) REFERENCES identity_users(id)
64
+ );
@@ -0,0 +1,48 @@
1
+ -- identity.oauth-server consent catalog.
2
+ -- Issuer branding remains owned by the portable company table.
3
+
4
+ INSERT OR IGNORE INTO identity_schema_meta (key, value)
5
+ VALUES ('pack_oauth_consent_catalog', '1');
6
+
7
+ CREATE TABLE IF NOT EXISTS identity_oauth_resources (
8
+ id TEXT PRIMARY KEY NOT NULL,
9
+ audience TEXT NOT NULL UNIQUE,
10
+ resource_type TEXT NOT NULL DEFAULT 'mcp',
11
+ display_name TEXT NOT NULL,
12
+ description TEXT,
13
+ logo_url TEXT,
14
+ homepage_url TEXT,
15
+ metadata_json TEXT NOT NULL DEFAULT '{}',
16
+ is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
17
+ created_at INTEGER NOT NULL,
18
+ updated_at INTEGER NOT NULL
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS identity_oauth_scopes (
22
+ scope TEXT PRIMARY KEY NOT NULL,
23
+ label TEXT NOT NULL,
24
+ description TEXT NOT NULL,
25
+ category TEXT NOT NULL DEFAULT 'general',
26
+ sensitivity TEXT NOT NULL DEFAULT 'normal'
27
+ CHECK (sensitivity IN ('normal','elevated','sensitive')),
28
+ is_active INTEGER NOT NULL DEFAULT 1 CHECK (is_active IN (0,1)),
29
+ sort_order INTEGER NOT NULL DEFAULT 50,
30
+ created_at INTEGER NOT NULL,
31
+ updated_at INTEGER NOT NULL
32
+ );
33
+
34
+ CREATE TABLE IF NOT EXISTS identity_oauth_resource_scopes (
35
+ resource_id TEXT NOT NULL,
36
+ scope TEXT NOT NULL,
37
+ required INTEGER NOT NULL DEFAULT 0 CHECK (required IN (0,1)),
38
+ sort_order INTEGER NOT NULL DEFAULT 50,
39
+ PRIMARY KEY (resource_id, scope),
40
+ FOREIGN KEY (resource_id) REFERENCES identity_oauth_resources(id) ON DELETE CASCADE,
41
+ FOREIGN KEY (scope) REFERENCES identity_oauth_scopes(scope) ON DELETE CASCADE
42
+ );
43
+
44
+ CREATE INDEX IF NOT EXISTS idx_identity_oauth_resources_active
45
+ ON identity_oauth_resources(is_active, resource_type);
46
+
47
+ CREATE INDEX IF NOT EXISTS idx_identity_oauth_resource_scopes_sort
48
+ ON identity_oauth_resource_scopes(resource_id, sort_order, scope);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inneranimalmedia/agentsam-sdk-identity",
3
- "version": "2.6.3",
3
+ "version": "2.6.5",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "description": "Identity module for @inneranimalmedia/agentsam-sdk (workspace \u2014 publish via root SDK)",
@@ -29,7 +29,8 @@
29
29
  "./contracts/auth-config": "./src/contracts/auth-config.js",
30
30
  "./oauth/callback": "./src/oauth/callback.js",
31
31
  "./frontend/auth-portal/*": "./src/frontend/auth-portal/*",
32
- "./providers/cloudflare": "./src/providers/cloudflare/index.js"
32
+ "./providers/cloudflare": "./src/providers/cloudflare/index.js",
33
+ "./oauth/consent-view": "./src/oauth/consent-view.js"
33
34
  },
34
35
  "scripts": {
35
36
  "test": "node --test tests/*.test.mjs",
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import process from 'node:process';
5
+ import { DatabaseSync } from 'node:sqlite';
6
+ import {
7
+ applySqliteIdentityMigrations,
8
+ createSqliteIdentityAdapter,
9
+ } from '../src/adapters/sqlite/index.js';
10
+ import {
11
+ createRouteRegistry,
12
+ projectionFromAppManifest,
13
+ } from '../src/contracts/route-projection.js';
14
+ import { createIdentityService } from '../src/server/identity-service.js';
15
+ import { hashPassword } from '../src/core/password-crypto.js';
16
+
17
+ function readStdin() {
18
+ return new Promise((resolve, reject) => {
19
+ let body = '';
20
+ process.stdin.setEncoding('utf8');
21
+ process.stdin.on('data', (chunk) => { body += chunk; });
22
+ process.stdin.on('end', () => {
23
+ try { resolve(body.trim() ? JSON.parse(body) : {}); }
24
+ catch (error) { reject(error); }
25
+ });
26
+ process.stdin.on('error', reject);
27
+ });
28
+ }
29
+
30
+ function wrapDatabase(database, filePath) {
31
+ return {
32
+ filePath,
33
+ prepare(sql) {
34
+ const statement = database.prepare(sql);
35
+ const bound = (values = []) => ({
36
+ async run() { return statement.run(...values); },
37
+ async first() { return statement.get(...values) ?? null; },
38
+ async all() { return { results: statement.all(...values) }; },
39
+ });
40
+ return {
41
+ bind(...values) { return bound(values); },
42
+ async run() { return statement.run(); },
43
+ async first() { return statement.get() ?? null; },
44
+ async all() { return { results: statement.all() }; },
45
+ };
46
+ },
47
+ exec(sql) { database.exec(sql); },
48
+ close() { database.close(); },
49
+ };
50
+ }
51
+
52
+ function sanitizeUser(user) {
53
+ if (!user) return null;
54
+ return {
55
+ id: user.id,
56
+ email: user.email,
57
+ display_name: user.display_name ?? null,
58
+ status: user.status ?? null,
59
+ };
60
+ }
61
+
62
+ const request = await readStdin();
63
+ const dbPath = path.resolve(
64
+ process.env.AGENTSAM_IDENTITY_DB || '.agentsam/data/local-studio-identity.sqlite',
65
+ );
66
+ const manifestPath = path.resolve(
67
+ process.env.AGENTSAM_IDENTITY_APP_MANIFEST
68
+ || new URL('../../../apps/local-studio/agentsam.app.json', import.meta.url).pathname,
69
+ );
70
+
71
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true, mode: 0o700 });
72
+ const nativeDb = new DatabaseSync(dbPath);
73
+ try {
74
+ if (process.platform !== 'win32') {
75
+ try { fs.chmodSync(dbPath, 0o600); } catch {}
76
+ }
77
+ const db = wrapDatabase(nativeDb, dbPath);
78
+ await applySqliteIdentityMigrations(db);
79
+ const adapter = createSqliteIdentityAdapter(db);
80
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
81
+ const routeRegistry = createRouteRegistry([projectionFromAppManifest(manifest)]);
82
+ const identity = createIdentityService({
83
+ adapter,
84
+ app: { id: manifest.id },
85
+ routeRegistry,
86
+ });
87
+
88
+ let result;
89
+ switch (request.op) {
90
+ case 'status': {
91
+ const sessionId = String(request.session_id || '').trim();
92
+ if (!sessionId) {
93
+ result = { ok: true, authenticated: false, user: null };
94
+ break;
95
+ }
96
+ const session = await identity.sessionFromRequest(new Request('http://local.identity/session', {
97
+ headers: { Authorization: `Bearer ${sessionId}` },
98
+ }));
99
+ result = {
100
+ ok: true,
101
+ authenticated: Boolean(session),
102
+ user: sanitizeUser(session?.user),
103
+ };
104
+ break;
105
+ }
106
+
107
+ case 'login': {
108
+ const login = await identity.loginWithPassword({
109
+ email: request.email,
110
+ password: request.password,
111
+ });
112
+ result = login.ok
113
+ ? {
114
+ ok: true,
115
+ authenticated: true,
116
+ session_id: login.sessionId,
117
+ user: sanitizeUser(login.user),
118
+ redirect: identity.resolvePostLoginPath(request.next || null),
119
+ }
120
+ : login;
121
+ break;
122
+ }
123
+
124
+ case 'signup': {
125
+ const signup = await identity.signup({
126
+ email: request.email,
127
+ password: request.password,
128
+ displayName: request.display_name,
129
+ });
130
+ result = signup.ok
131
+ ? {
132
+ ok: true,
133
+ authenticated: true,
134
+ session_id: signup.sessionId,
135
+ user: sanitizeUser(signup.user),
136
+ redirect: identity.resolvePostLoginPath(request.next || null),
137
+ }
138
+ : signup;
139
+ break;
140
+ }
141
+
142
+ case 'logout': {
143
+ const sessionId = String(request.session_id || '').trim();
144
+ if (sessionId) {
145
+ await identity.logout(new Request('http://local.identity/logout', {
146
+ headers: { Authorization: `Bearer ${sessionId}` },
147
+ }));
148
+ }
149
+ result = { ok: true };
150
+ break;
151
+ }
152
+
153
+ case 'reset_password': {
154
+ const email = String(request.email || '').trim().toLowerCase();
155
+ const password = String(request.password || '');
156
+ if (!email || password.length < 8) {
157
+ result = { ok: false, error: 'email_and_valid_password_required' };
158
+ break;
159
+ }
160
+ const user = await adapter.findUserByEmail(email);
161
+ if (!user) {
162
+ result = { ok: false, error: 'account_not_found' };
163
+ break;
164
+ }
165
+ const { saltHex, hashHex } = await hashPassword(password);
166
+ await adapter.updateUserPassword(user.id, hashHex, saltHex);
167
+ result = { ok: true };
168
+ break;
169
+ }
170
+
171
+ default:
172
+ result = { ok: false, error: 'unsupported_identity_operation' };
173
+ }
174
+
175
+ process.stdout.write(JSON.stringify(result));
176
+ } catch (error) {
177
+ process.stdout.write(JSON.stringify({
178
+ ok: false,
179
+ error: error?.message || String(error),
180
+ }));
181
+ process.exitCode = 1;
182
+ } finally {
183
+ try { nativeDb.close(); } catch {}
184
+ }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Local static preview for IAM auth portal HTML (1:1 paths: /auth/login, /auth/signup, /auth/reset).
3
+ * Local static preview for the portable AgentSam auth portal HTML (1:1 paths: /auth/login, /auth/signup, /auth/reset).
4
4
  * API routes are stubbed so forms and globe-exit transitions work without a Worker.
5
5
  */
6
6
  import http from 'node:http';
@@ -119,14 +119,14 @@ function hubHtml(baseUrl) {
119
119
  const PREVIEW_COMPANY = {
120
120
  id: 'co_default',
121
121
  slug: 'default',
122
- name: 'Inner Animal Media',
123
- legalName: 'Inner Animals LLC',
124
- logoUrl: 'https://imagedelivery.net/g7wf09fCONpnidkRnR_5vw/527ab85a-01bb-4125-57bb-694fe8be8700/public',
125
- faviconUrl: 'https://inneranimalmedia.com/favicon.ico',
122
+ name: 'AgentSam',
123
+ legalName: 'AgentSam',
124
+ logoUrl: '/shared/agentsam-mark.svg',
125
+ faviconUrl: null,
126
126
  primaryColor: '#007AFF',
127
127
  authBgColor: '#050508',
128
- supportEmail: 'hey@inneranimalmedia.com',
129
- websiteUrl: 'https://inneranimalmedia.com',
128
+ supportEmail: 'support@agentsam.dev',
129
+ websiteUrl: 'https://agentsam.dev',
130
130
  tagline: 'Instant Access',
131
131
  meta: {
132
132
  privacyUrl: '/privacy',
@@ -1,7 +1,10 @@
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';
1
4
  import { newAccountIdentityId, newAuthUserId, newSessionId, newAuthEventId, nowUnix } from './ids.js';
2
- import { AUTH_SESSION_TTL_SECONDS } from '../../core/constants.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
@@ -24,22 +27,45 @@ export function createCloudflareD1Adapter(db, options = {}) {
24
27
  if (!db?.prepare) {
25
28
  throw new Error('cloudflare_d1_adapter_requires_db_binding');
26
29
  }
27
- const sessionTtlSeconds = options.sessionTtlSeconds ?? AUTH_SESSION_TTL_SECONDS;
30
+ const sessionTtlSeconds = options.sessionTtlSeconds ?? SESSION_POLICY.browser.ttlSeconds;
28
31
 
29
32
  return Object.freeze({
33
+ schemaVersion: IDENTITY_STORE_SCHEMA_VERSION,
30
34
  sessionTtlSeconds,
35
+ backend: 'cloudflare-d1',
31
36
 
32
37
  /**
33
38
  * Append-only login/logout/failed-attempt audit trail (auth_event_log).
34
- * Never throws -- an observability write must not break a real auth flow.
35
- * ip/userAgent are hashed (SHA-256) before storage, matching the
36
- * ip_hash/user_agent_hash column names -- raw values are never persisted.
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.
37
43
  */
38
- async logAuthEvent({ userId, eventType, status = 'ok', provider, metadata, request }) {
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
+ }) {
39
57
  try {
40
58
  const ip = request?.headers?.get?.('cf-connecting-ip') || request?.headers?.get?.('x-forwarded-for') || '';
41
59
  const ua = request?.headers?.get?.('user-agent') || '';
42
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
+ };
43
69
  await db.prepare(
44
70
  `INSERT INTO auth_event_log
45
71
  (id, user_id, event_type, status, provider, metadata_json, ip_hash, user_agent_hash)
@@ -50,7 +76,7 @@ export function createCloudflareD1Adapter(db, options = {}) {
50
76
  eventType,
51
77
  status,
52
78
  provider || null,
53
- metadata ? JSON.stringify(metadata) : '{}',
79
+ JSON.stringify(envelope),
54
80
  ipHash,
55
81
  uaHash,
56
82
  ).run();
@@ -59,6 +85,34 @@ export function createCloudflareD1Adapter(db, options = {}) {
59
85
  }
60
86
  },
61
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
+ },
115
+
62
116
  async findUserByEmail(email) {
63
117
  const row = await db.prepare(
64
118
  `SELECT id, email, display_name, password_hash, salt, status, created_at, updated_at
@@ -79,6 +133,11 @@ export function createCloudflareD1Adapter(db, options = {}) {
79
133
  const id = newAuthUserId();
80
134
  const ts = nowUnix();
81
135
  const normalizedEmail = String(email || '').trim().toLowerCase();
136
+ // accounts = SSOT; auth_users = login principal (1:1 id in portable scaffold).
137
+ await db.prepare(
138
+ `INSERT INTO accounts (id, email, display_name, status, created_at, updated_at)
139
+ VALUES (?, ?, ?, 'active', ?, ?)`,
140
+ ).bind(id, normalizedEmail, displayName || null, ts, ts).run();
82
141
  await db.prepare(
83
142
  `INSERT INTO auth_users (id, email, display_name, password_hash, salt, status, created_at, updated_at)
84
143
  VALUES (?, ?, ?, ?, ?, 'active', ?, ?)`,
@@ -91,24 +150,48 @@ export function createCloudflareD1Adapter(db, options = {}) {
91
150
  await db.prepare(
92
151
  `UPDATE auth_users SET password_hash = ?, salt = ?, updated_at = ? WHERE id = ?`,
93
152
  ).bind(passwordHash, salt, ts, userId).run();
153
+ await db.prepare(
154
+ `UPDATE accounts SET updated_at = ? WHERE id = ?`,
155
+ ).bind(ts, userId).run().catch(() => {});
94
156
  },
95
157
 
96
158
  async findUserByProvider(provider, providerSubject) {
97
159
  const row = await db.prepare(
98
160
  `SELECT u.id, u.email, u.display_name, u.password_hash, u.salt, u.status, u.created_at, u.updated_at
99
161
  FROM account_identities ai
100
- JOIN auth_users u ON u.id = ai.account_id
162
+ JOIN accounts a ON a.id = ai.account_id
163
+ JOIN auth_users u ON u.id = a.id
101
164
  WHERE ai.provider = ? AND ai.provider_subject = ?
165
+ AND COALESCE(a.status, 'active') = 'active'
102
166
  LIMIT 1`,
103
167
  ).bind(provider, providerSubject).first();
104
168
  return row || null;
105
169
  },
106
170
 
107
171
  async upsertProviderIdentity({ accountId, provider, providerSubject, email }) {
172
+ // Ensure SSOT account row exists (OAuth may create identity before password user).
173
+ const ts = nowUnix();
174
+ const account = await db.prepare(
175
+ `SELECT id FROM accounts WHERE id = ? LIMIT 1`,
176
+ ).bind(accountId).first();
177
+ if (!account?.id) {
178
+ const authUser = await this.findUserById(accountId);
179
+ if (!authUser) throw new Error('account_ssot_missing');
180
+ await db.prepare(
181
+ `INSERT INTO accounts (id, email, display_name, status, created_at, updated_at)
182
+ VALUES (?, ?, ?, 'active', ?, ?)`,
183
+ ).bind(
184
+ accountId,
185
+ authUser.email,
186
+ authUser.display_name || null,
187
+ authUser.created_at || ts,
188
+ ts,
189
+ ).run();
190
+ }
191
+
108
192
  const existing = await db.prepare(
109
193
  `SELECT id FROM account_identities WHERE provider = ? AND provider_subject = ? LIMIT 1`,
110
194
  ).bind(provider, providerSubject).first();
111
- const ts = nowUnix();
112
195
  if (existing?.id) {
113
196
  await db.prepare(
114
197
  `UPDATE account_identities SET account_id = ?, email = ?, updated_at = ? WHERE id = ?`,
@@ -173,27 +256,73 @@ export function createCloudflareD1Adapter(db, options = {}) {
173
256
  return { ok: true, reason };
174
257
  },
175
258
 
176
- async saveOAuthState({ state, provider, codeVerifier, redirectTo, ttlSeconds = 600 }) {
177
- // Dedicated table, deliberately NOT named `oauth_states` -- that name collides
178
- // with unrelated Stripe Connect state tracking in customer apps that reuse
179
- // their inneranimalmedia D1 instance (id/user_id/provider_id/redirect_uri/
180
- // scope schema, no default on primary key). See AgentSamRemix incident,
181
- // 2026-08-29: D1_ERROR: table oauth_states has no column named state.
259
+ async createOAuthTransaction({ state, provider, codeVerifier, returnTo, redirectTo, appId, ttlSeconds = 600 }) {
260
+ if (!appId) {
261
+ throw new IdentitySchemaError(
262
+ 'OAUTH_TRANSACTION_APP_ID_REQUIRED',
263
+ 'OAuth transactions must include app_id',
264
+ );
265
+ }
182
266
  const ts = nowUnix();
183
- await db.prepare(
184
- `INSERT INTO identity_oauth_states (state, provider, code_verifier, redirect_to, expires_at, created_at)
185
- VALUES (?, ?, ?, ?, ?, ?)`,
186
- ).bind(state, provider, codeVerifier, redirectTo || null, ts + ttlSeconds, ts).run();
267
+ const expiresAt = ts + ttlSeconds;
268
+ try {
269
+ await db.prepare(
270
+ `INSERT INTO identity_oauth_states
271
+ (state, provider, code_verifier, redirect_to, app_id, expires_at, created_at)
272
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
273
+ ).bind(state, provider, codeVerifier, returnTo ?? redirectTo ?? null, appId, expiresAt, ts).run();
274
+ } catch (err) {
275
+ throw new IdentitySchemaError(
276
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
277
+ 'identity_oauth_states.app_id required — apply migration 0015 (no silent pre-app_id fallback)',
278
+ { cause: String(err?.message || err) },
279
+ );
280
+ }
187
281
  },
188
282
 
189
- async consumeOAuthState(state) {
190
- const row = await db.prepare(
191
- `SELECT state, provider, code_verifier, redirect_to, expires_at FROM identity_oauth_states WHERE state = ? LIMIT 1`,
192
- ).bind(state).first();
283
+ /** @deprecated Use createOAuthTransaction */
284
+ async saveOAuthState(input) {
285
+ return this.createOAuthTransaction(input);
286
+ },
287
+
288
+ async consumeOAuthTransaction(state) {
289
+ let row;
290
+ try {
291
+ row = await db.prepare(
292
+ `SELECT state, provider, code_verifier, redirect_to, app_id, expires_at, created_at
293
+ FROM identity_oauth_states WHERE state = ? LIMIT 1`,
294
+ ).bind(state).first();
295
+ } catch (err) {
296
+ throw new IdentitySchemaError(
297
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
298
+ 'identity_oauth_states.app_id column missing — apply migration 0015',
299
+ { cause: String(err?.message || err) },
300
+ );
301
+ }
193
302
  if (!row) return null;
194
303
  await db.prepare(`DELETE FROM identity_oauth_states WHERE state = ?`).bind(state).run();
195
304
  if (row.expires_at <= nowUnix()) return null;
196
- return row;
305
+ if (!row.app_id) {
306
+ throw new IdentitySchemaError(
307
+ 'IDENTITY_SCHEMA_MIGRATION_REQUIRED',
308
+ 'OAuth transaction missing app_id — refuse silent pre-app_id semantics',
309
+ );
310
+ }
311
+ return {
312
+ state: row.state,
313
+ provider: row.provider,
314
+ code_verifier: row.code_verifier,
315
+ redirect_to: row.redirect_to,
316
+ return_to: row.redirect_to,
317
+ app_id: row.app_id,
318
+ expires_at: row.expires_at,
319
+ created_at: row.created_at,
320
+ };
321
+ },
322
+
323
+ /** @deprecated Use consumeOAuthTransaction */
324
+ async consumeOAuthState(state) {
325
+ return this.consumeOAuthTransaction(state);
197
326
  },
198
327
 
199
328
  async getCompanyBySlug(slug = DEFAULT_COMPANY_SLUG) {