@inneranimalmedia/agentsam-sdk 2.6.4 → 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 (418) hide show
  1. package/AGENTSAM.md +11 -0
  2. package/README.md +15 -9
  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-rapid-rust +36 -0
  57. package/docs/AUTH_IDENTITY_CONTRACT.md +2 -0
  58. package/docs/MACHINE_INTELLIGENCE.md +120 -0
  59. package/docs/WINDOWS_RUNTIME_INSTALL.md +30 -0
  60. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +188 -0
  61. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +151 -0
  62. package/docs/architecture/LOCAL_STUDIO_CLOUDFLARE_OAUTH.md +12 -4
  63. package/docs/architecture/R2_SLUG_NAMESPACE.md +20 -0
  64. package/docs/architecture/WORK_PRODUCT_EXTRACTION.md +97 -0
  65. package/docs/brand/AGENT_SAM_ICON_GRAMMAR.md +70 -0
  66. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +71 -0
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +501 -0
  68. package/docs/contracts/capability-install-planner.md +67 -0
  69. package/docs/contracts/environment-vocabulary.md +195 -0
  70. package/docs/contracts/google-cloud-oauth-setup.md +199 -0
  71. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +1 -1
  72. package/docs/plans/LOCAL-STUDIO-GRADUATION-2026-09-26.md +290 -0
  73. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +394 -0
  74. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +227 -0
  75. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +221 -0
  76. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +145 -0
  77. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +215 -0
  78. package/docs/plugins.md +2 -2
  79. package/docs/product/AGENTSAM_PRODUCT_EXPERIENCE_STANDARD.md +280 -0
  80. package/docs/product/LOCAL_STUDIO_DESKTOP_EXPERIENCE.md +139 -0
  81. package/docs/product/README.md +8 -0
  82. package/docs/rapid-rust-wasm.md +35 -0
  83. package/migrations/d1/0016_cloudflare_oauth_user_oauth_tokens_ssot.sql +14 -0
  84. package/package.json +73 -14
  85. package/packages/agentsam-brand/README.md +106 -11
  86. package/packages/agentsam-brand/bin/agentsam-brand.mjs +9 -0
  87. package/packages/agentsam-brand/package.json +39 -7
  88. package/packages/agentsam-brand/src/adapters/cloudflare-images.js +453 -0
  89. package/packages/agentsam-brand/src/adapters/cloudflare-r2.js +74 -0
  90. package/packages/agentsam-brand/src/adapters/d1-registry.js +26 -0
  91. package/packages/agentsam-brand/src/adapters/filesystem.js +59 -0
  92. package/packages/agentsam-brand/src/adapters/memory.js +31 -0
  93. package/packages/agentsam-brand/src/cli/controller.js +503 -0
  94. package/packages/agentsam-brand/src/cli/wizard.js +526 -0
  95. package/packages/agentsam-brand/src/core/capabilities.js +201 -0
  96. package/packages/agentsam-brand/src/core/derivatives.js +211 -0
  97. package/packages/agentsam-brand/src/core/errors.js +12 -0
  98. package/packages/agentsam-brand/src/core/ingest.js +195 -0
  99. package/packages/agentsam-brand/src/core/inspect.js +109 -0
  100. package/packages/agentsam-brand/src/core/keys.js +83 -0
  101. package/packages/agentsam-brand/src/core/naming.js +142 -0
  102. package/packages/agentsam-brand/src/core/optimize.js +316 -0
  103. package/packages/agentsam-brand/src/core/pack.js +305 -0
  104. package/packages/agentsam-brand/src/core/plan.js +276 -0
  105. package/packages/agentsam-brand/src/core/preview.js +159 -0
  106. package/packages/agentsam-brand/src/core/processors/cloudflare.js +68 -0
  107. package/packages/agentsam-brand/src/core/processors/contract.js +203 -0
  108. package/packages/agentsam-brand/src/core/processors/index.js +148 -0
  109. package/packages/agentsam-brand/src/core/processors/native.js +82 -0
  110. package/packages/agentsam-brand/src/core/processors/sharp.js +113 -0
  111. package/packages/agentsam-brand/src/core/processors/squoosh-binary.js +195 -0
  112. package/packages/agentsam-brand/src/core/promote.js +288 -0
  113. package/packages/agentsam-brand/src/core/receipts.js +155 -0
  114. package/packages/agentsam-brand/src/core/v2/compile.js +280 -0
  115. package/packages/agentsam-brand/src/core/v2/derivatives-semantic.js +207 -0
  116. package/packages/agentsam-brand/src/core/v2/ingest-graph.js +387 -0
  117. package/packages/agentsam-brand/src/core/v2/roles.js +180 -0
  118. package/packages/agentsam-brand/src/core/v2/schema.js +209 -0
  119. package/packages/agentsam-brand/src/core/v2/templates.js +114 -0
  120. package/packages/agentsam-brand/src/index.js +193 -36
  121. package/packages/agentsam-brand/src/presets/app-icon.json +16 -0
  122. package/packages/agentsam-brand/src/presets/favicon.json +17 -0
  123. package/packages/agentsam-brand/src/presets/hero.json +12 -0
  124. package/packages/agentsam-brand/src/presets/index.js +40 -0
  125. package/packages/agentsam-brand/src/presets/logo.json +12 -0
  126. package/packages/agentsam-brand/src/presets/model.json +8 -0
  127. package/packages/agentsam-brand/src/presets/og-image.json +10 -0
  128. package/packages/agentsam-brand/src/presets/product-shot.json +11 -0
  129. package/packages/agentsam-brand/src/presets/social-image.json +10 -0
  130. package/packages/agentsam-brand/src/presets/web-image.json +10 -0
  131. package/packages/agentsam-contracts/src/artifacts.ts +41 -0
  132. package/packages/agentsam-knowledge/src/autorag/index.js +1 -1
  133. package/packages/agentsam-knowledge/src/providers/index.js +6 -4
  134. package/packages/agentsam-knowledge/src/providers/ollama-endpoint.js +31 -0
  135. package/packages/agentsam-knowledge/test/autorag.test.mjs +22 -1
  136. package/packages/agentsam-nav/package.json +2 -2
  137. package/packages/agentsam-rapid-rust/Cargo.lock +344 -0
  138. package/packages/agentsam-rapid-rust/Cargo.toml +18 -0
  139. package/packages/agentsam-rapid-rust/README.md +5 -0
  140. package/packages/agentsam-rapid-rust/src/main.rs +718 -0
  141. package/packages/agentsam-rapid-rust/templates/api/Cargo.toml.tmpl +18 -0
  142. package/packages/agentsam-rapid-rust/templates/api/src/lib.rs.tmpl +17 -0
  143. package/packages/agentsam-rapid-rust/templates/common/README.md.tmpl +22 -0
  144. package/packages/agentsam-rapid-rust/templates/common/package.json.tmpl +12 -0
  145. package/packages/agentsam-rapid-rust/templates/common/wrangler.toml.tmpl +6 -0
  146. package/packages/agentsam-rapid-rust/templates/crypto-auth/Cargo.toml.tmpl +21 -0
  147. package/packages/agentsam-rapid-rust/templates/crypto-auth/src/lib.rs.tmpl +32 -0
  148. package/packages/agentsam-rapid-rust/templates/data-processor/Cargo.toml.tmpl +18 -0
  149. package/packages/agentsam-rapid-rust/templates/data-processor/src/lib.rs.tmpl +41 -0
  150. package/packages/agentsam-rapid-rust/templates/shared-core/Cargo.toml.tmpl +9 -0
  151. package/packages/agentsam-rapid-rust/templates/shared-core/core/Cargo.toml.tmpl +7 -0
  152. package/packages/agentsam-rapid-rust/templates/shared-core/core/src/lib.rs.tmpl +23 -0
  153. package/packages/agentsam-rapid-rust/templates/shared-core/worker/Cargo.toml.tmpl +12 -0
  154. package/packages/agentsam-rapid-rust/templates/shared-core/worker/src/lib.rs.tmpl +16 -0
  155. package/packages/agentsam-rapid-rust/templates/shared-core/wrangler.toml.tmpl +6 -0
  156. package/packages/agentsam-repository/src/index.js +1 -0
  157. package/packages/agentsam-repository/src/merkle/semantic.js +3 -10
  158. package/packages/agentsam-repository/src/source-types.js +85 -0
  159. package/packages/agentsam-vault/README.md +96 -0
  160. package/packages/agentsam-vault/package.json +32 -0
  161. package/packages/agentsam-vault/src/contracts/credential.d.ts +78 -0
  162. package/packages/agentsam-vault/src/contracts/credential.js +132 -0
  163. package/packages/agentsam-vault/src/crypto/aes-gcm.d.ts +30 -0
  164. package/packages/agentsam-vault/src/crypto/aes-gcm.js +107 -0
  165. package/packages/agentsam-vault/src/crypto/oauth-envelope.js +150 -0
  166. package/packages/agentsam-vault/src/index.d.ts +9 -0
  167. package/packages/agentsam-vault/src/index.js +27 -0
  168. package/packages/agentsam-vault/src/providers/registry.js +90 -0
  169. package/packages/agentsam-vault/src/runtime/resolver.js +77 -0
  170. package/packages/agentsam-workbench/README.md +24 -0
  171. package/packages/agentsam-workbench/package.json +38 -0
  172. package/packages/agentsam-workbench/src/agent/AgentPanel.tsx +41 -0
  173. package/packages/agentsam-workbench/src/agent/ArtifactCard.tsx +9 -0
  174. package/packages/agentsam-workbench/src/agent/Composer.tsx +102 -0
  175. package/packages/agentsam-workbench/src/agent/ConnectedAgentPanel.tsx +194 -0
  176. package/packages/agentsam-workbench/src/agent/ContextualComposer.tsx +788 -0
  177. package/packages/agentsam-workbench/src/agent/GoalStatusStrip.tsx +38 -0
  178. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +86 -0
  179. package/packages/agentsam-workbench/src/agent/ModelSelect.tsx +19 -0
  180. package/packages/agentsam-workbench/src/agent/Thread.tsx +56 -0
  181. package/packages/agentsam-workbench/src/agent/ToolReceipt.tsx +11 -0
  182. package/packages/agentsam-workbench/src/agent/contextual-composer.css +611 -0
  183. package/packages/agentsam-workbench/src/agent/index.ts +10 -0
  184. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +12 -0
  185. package/packages/agentsam-workbench/src/browser/BrowserFrame.tsx +37 -0
  186. package/packages/agentsam-workbench/src/browser/index.ts +1 -0
  187. package/packages/agentsam-workbench/src/index.ts +6 -0
  188. package/packages/agentsam-workbench/src/project-control.css +160 -0
  189. package/packages/agentsam-workbench/src/projects/ProjectsSurface.tsx +131 -0
  190. package/packages/agentsam-workbench/src/projects/index.ts +1 -0
  191. package/packages/agentsam-workbench/src/shell/Breadcrumb.tsx +35 -0
  192. package/packages/agentsam-workbench/src/shell/ResizableStage.tsx +99 -0
  193. package/packages/agentsam-workbench/src/shell/SidePanel.tsx +5 -0
  194. package/packages/agentsam-workbench/src/shell/index.ts +4 -0
  195. package/packages/agentsam-workbench/src/shell/surfaceRegistry.ts +29 -0
  196. package/packages/agentsam-workbench/src/terminal/TerminalSurface.tsx +5 -0
  197. package/packages/agentsam-workbench/src/terminal/index.ts +1 -0
  198. package/packages/agentsam-workbench/src/timeline/GanttBoard.tsx +258 -0
  199. package/packages/agentsam-workbench/src/timeline/index.ts +1 -0
  200. package/packages/agentsam-workbench/tsconfig.json +13 -0
  201. package/packages/connectors/cloudflare/OAUTH_STORAGE_AUDIT.md +53 -0
  202. package/packages/connectors/cloudflare/package.json +3 -1
  203. package/packages/connectors/cloudflare/src/api-client.js +279 -0
  204. package/packages/connectors/cloudflare/src/capabilities.js +585 -0
  205. package/packages/connectors/cloudflare/src/credential.js +318 -0
  206. package/packages/connectors/cloudflare/src/families/brand-protection.js +123 -0
  207. package/packages/connectors/cloudflare/src/families/keyless.js +114 -0
  208. package/packages/connectors/cloudflare/src/families/pages.js +151 -0
  209. package/packages/connectors/cloudflare/src/families/scanner.js +123 -0
  210. package/packages/connectors/cloudflare/src/families/snippets.js +207 -0
  211. package/packages/connectors/cloudflare/src/families/tag-gateway.js +46 -0
  212. package/packages/connectors/cloudflare/src/families/tags.js +124 -0
  213. package/packages/connectors/cloudflare/src/families/token-validation.js +95 -0
  214. package/packages/connectors/cloudflare/src/families/workflows.js +156 -0
  215. package/packages/connectors/cloudflare/src/index.js +102 -265
  216. package/packages/connectors/cloudflare/src/oauth-persist.js +336 -0
  217. package/packages/connectors/cloudflare/src/owner.js +42 -12
  218. package/packages/connectors/cloudflare/src/permission-options.js +1064 -0
  219. package/packages/connectors/cloudflare/src/routes.js +309 -144
  220. package/packages/connectors/cloudflare/src/scope-catalog.js +345 -0
  221. package/packages/connectors/cloudflare/src/vault.js +2 -2
  222. package/packages/connectors/cloudflare/tests/capabilities.test.mjs +276 -0
  223. package/packages/connectors/cloudflare/tests/connector.test.mjs +26 -30
  224. package/packages/connectors/cloudflare/tests/oauth-persist.test.mjs +125 -0
  225. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +22 -2
  226. package/packages/identity/.agentsam/features/oauth-login-portal/resources.json +10 -4
  227. package/packages/identity/.agentsam/features/oauth-login-portal/routes.json +20 -0
  228. package/packages/identity/README.md +1 -1
  229. package/packages/identity/backend/README.md +1 -1
  230. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +3 -2
  231. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +48 -0
  232. package/packages/identity/package.json +4 -3
  233. package/packages/identity/scripts/local-identity-bridge.mjs +184 -0
  234. package/packages/identity/scripts/preview-auth-portal.mjs +7 -7
  235. package/packages/identity/src/adapters/cloudflare-d1/index.js +31 -2
  236. package/packages/identity/src/adapters/sqlite/index.js +4 -1
  237. package/packages/identity/src/contracts/auth-config.js +28 -8
  238. package/packages/identity/src/contracts/external-identity.js +1 -1
  239. package/packages/identity/src/contracts/provider.js +1 -0
  240. package/packages/identity/src/frontend/auth-portal/README.md +2 -1
  241. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -5
  242. package/packages/identity/src/frontend/auth-portal/pages/reset.html +6 -5
  243. package/packages/identity/src/frontend/auth-portal/pages/signup.html +6 -5
  244. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  245. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +207 -0
  246. package/packages/identity/src/index.js +16 -0
  247. package/packages/identity/src/migrations/0001_identity_core.sql +19 -2
  248. package/packages/identity/src/migrations/0003_accounts_ssot.sql +20 -0
  249. package/packages/identity/src/migrations/README.md +5 -2
  250. package/packages/identity/src/oauth/README.md +10 -5
  251. package/packages/identity/src/oauth/consent-view.js +388 -0
  252. package/packages/identity/src/oauth/credentials.js +31 -11
  253. package/packages/identity/src/oauth/google-desktop-exchange.js +173 -0
  254. package/packages/identity/src/providers/cloudflare/oauth.js +3 -4
  255. package/packages/identity/src/providers/cloudflare/profile.js +49 -14
  256. package/packages/identity/src/providers/iam/index.js +27 -5
  257. package/packages/identity/src/server/identity-service.js +31 -2
  258. package/packages/identity/src/server/worker-router.js +111 -81
  259. package/packages/identity/tests/auth-config.test.mjs +3 -2
  260. package/packages/identity/tests/identity-init-scaffold.test.mjs +3 -0
  261. package/packages/identity/tests/identity-service.test.mjs +16 -0
  262. package/packages/identity/tests/native-session-worker.test.mjs +64 -0
  263. package/packages/identity/tests/oauth-consent-view.test.mjs +106 -0
  264. package/packages/identity/tests/oauth-credentials.test.mjs +17 -4
  265. package/packages/identity/tests/oauth-presets-accounts-ssot.test.mjs +58 -0
  266. package/packages/identity/tests/preview-auth-portal.test.mjs +3 -3
  267. package/packages/runtime-protocol/src/index.js +154 -0
  268. package/packages/theme-scenes/README.md +164 -0
  269. package/packages/theme-scenes/package.json +53 -0
  270. package/packages/theme-scenes/src/blocks/index.js +30 -0
  271. package/packages/theme-scenes/src/contracts/index.js +286 -0
  272. package/packages/theme-scenes/src/demos/index.js +65 -0
  273. package/packages/theme-scenes/src/index.js +75 -0
  274. package/packages/theme-scenes/src/presets/index.js +263 -0
  275. package/packages/theme-scenes/src/runtime/compile.js +119 -0
  276. package/packages/theme-scenes/src/scenes/index.js +146 -0
  277. package/packages/theme-scenes/src/shell/index.js +47 -0
  278. package/packages/theme-scenes/src/themes/index.js +129 -0
  279. package/packages/theme-scenes/src/visuals/index.js +41 -0
  280. package/packages/theme-scenes/test/theme-scenes.test.mjs +179 -0
  281. package/packages/work-graph/src/index.js +34 -1
  282. package/packages/work-graph/src/renderers/gantt-model.js +24 -0
  283. package/packages/work-graph/test/work-graph.test.mjs +27 -7
  284. package/protocol/README.md +15 -7
  285. package/protocol/apps/agentsam.app.v1.schema.json +89 -7
  286. package/protocol/apps/agentsam.host-install.v1.schema.json +36 -0
  287. package/protocol/assets/README.md +9 -0
  288. package/protocol/assets/asset-record.v1.schema.json +64 -0
  289. package/protocol/runtime/agentsam.runtime.v1.schema.json +75 -0
  290. package/protocol/scoring/README.md +10 -0
  291. package/protocol/scoring/scorecard.v1.schema.json +65 -0
  292. package/protocol/ui/icon-registry.mjs +1 -0
  293. package/registry/cms-rust-machine-20260928/installable-products.json +31 -0
  294. package/registry/cms-rust-machine-20260928/manifest.json +22 -0
  295. package/registry/cms-rust-machine-20260928/migration.sql +237 -0
  296. package/registry/cms-rust-machine-20260928/receipt.json +21 -0
  297. package/registry/cms-rust-machine-20260928/receipt.sql +27 -0
  298. package/scripts/build_rapid_rust_cli.py +83 -0
  299. package/src/attachments/index.js +6 -0
  300. package/src/attachments/intake.js +235 -0
  301. package/src/capabilities/repository-snapshot.js +19 -2
  302. package/src/cli/command-catalog.js +8 -0
  303. package/src/cli.js +182 -26
  304. package/src/commands/account-auth.js +94 -8
  305. package/src/commands/app.js +307 -3
  306. package/src/commands/billing.js +127 -0
  307. package/src/commands/brand.js +74 -60
  308. package/src/commands/cheat-sheet.js +154 -0
  309. package/src/commands/cloudflare-login.js +222 -0
  310. package/src/commands/cloudflare.js +453 -23
  311. package/src/commands/codebaseindex.js +6 -1
  312. package/src/commands/compute.js +4 -0
  313. package/src/commands/connections.js +11 -5
  314. package/src/commands/credentials.js +116 -0
  315. package/src/commands/gcloud-auth.js +427 -0
  316. package/src/commands/google-cloud.js +375 -0
  317. package/src/commands/identity-init.js +2 -2
  318. package/src/commands/mcp.js +226 -33
  319. package/src/commands/ollama.js +3 -2
  320. package/src/commands/plugins.js +7 -2
  321. package/src/commands/product.js +36 -0
  322. package/src/commands/runtime-status.js +28 -9
  323. package/src/commands/runtime.js +313 -0
  324. package/src/commands/rust.js +24 -0
  325. package/src/commands/setup.js +279 -0
  326. package/src/commands/shell.js +16 -3
  327. package/src/commands/start-local.js +2 -2
  328. package/src/commands/terminal.js +171 -0
  329. package/src/commands/update.js +140 -0
  330. package/src/commands/whoami.js +329 -65
  331. package/src/features/resolve.js +1 -0
  332. package/src/index.js +4 -0
  333. package/src/indexing/ingest/inventory.js +254 -19
  334. package/src/indexing/ingest/materials.js +3 -9
  335. package/src/indexing/ingest/style-evidence.js +181 -0
  336. package/src/knowledge/source.js +3 -3
  337. package/src/lib/account-session.js +11 -4
  338. package/src/lib/app-authority.js +172 -0
  339. package/src/lib/auth.js +94 -21
  340. package/src/lib/core-client.js +5 -6
  341. package/src/lib/credentials-audit.js +451 -0
  342. package/src/lib/deploy/health.js +24 -6
  343. package/src/lib/detect-context.js +7 -1
  344. package/src/lib/google-cloud-connection.js +270 -0
  345. package/src/lib/google-cloud-inventory.js +385 -0
  346. package/src/lib/google-desktop-oauth.js +372 -0
  347. package/src/lib/google-studio-brokered-oauth.js +158 -0
  348. package/src/lib/identity-scaffold.js +24 -6
  349. package/src/lib/init-options.js +192 -0
  350. package/src/lib/local-scaffold.js +48 -16
  351. package/src/lib/provider-command-remediation.js +308 -0
  352. package/src/lib/provider-credentials.js +8 -0
  353. package/src/lib/scaffold/index.js +8 -2
  354. package/src/lib/scaffold/mcp-server.js +43 -0
  355. package/src/lib/scaffold/templates/mcp-server/index.js +397 -0
  356. package/src/lib/scaffold/templates/mcp-server/presets.js +39 -0
  357. package/src/lib/scaffold/wizards/cms.js +93 -0
  358. package/src/lib/scaffold/wizards/mcp-server.js +61 -0
  359. package/src/lib/setup/contract.js +26 -0
  360. package/src/lib/setup/discover.js +116 -0
  361. package/src/lib/setup/execute.js +205 -0
  362. package/src/lib/setup/planner.js +134 -0
  363. package/src/lib/setup/recipes.js +235 -0
  364. package/src/lib/setup/runtime-persist.js +197 -0
  365. package/src/lib/setup/runtime.js +394 -0
  366. package/src/lib/slash-commands.js +2 -0
  367. package/src/lib/terminal/machine-identity.js +95 -0
  368. package/src/lib/terminal-local.js +164 -0
  369. package/src/lib/terminal-scopes.js +52 -0
  370. package/src/lib/whoami-capabilities.js +184 -0
  371. package/src/local-pty/server.js +34 -5
  372. package/src/mcp/authority.js +58 -108
  373. package/src/mcp/client-adapters.js +68 -144
  374. package/src/mcp/client.js +142 -122
  375. package/src/mcp/cloudflare-bundles.js +225 -0
  376. package/src/mcp/index.js +12 -0
  377. package/src/plugins/cloudflare.js +1 -1
  378. package/src/providers/ollama-chat.js +2 -1
  379. package/src/sam/types.js +27 -2
  380. package/src/security/inventory.js +12 -2
  381. package/src/security/local-vault.js +2 -0
  382. package/src/security/scan.js +1 -1
  383. package/test/account-session.test.mjs +3 -3
  384. package/test/app-authority-context.test.mjs +32 -0
  385. package/test/cli/codebaseindex-plan-ux.test.mjs +1 -1
  386. package/test/cli/mcp-client.test.mjs +21 -10
  387. package/test/cli/runtime-persist.test.mjs +56 -0
  388. package/test/cli/rust-command.test.mjs +21 -0
  389. package/test/credentials-audit.test.mjs +113 -0
  390. package/test/deploy-health-scan.test.mjs +29 -1
  391. package/test/gcloud-auth.test.mjs +111 -0
  392. package/test/google-cloud-connection.test.mjs +83 -0
  393. package/test/google-cloud-inventory.test.mjs +64 -0
  394. package/test/init-options.test.mjs +35 -0
  395. package/test/integration/app-command.test.mjs +30 -0
  396. package/test/integration/cad-project.test.mjs +4 -1
  397. package/test/integration/cms-app-scaffold.test.mjs +71 -0
  398. package/test/integration/cms-site-tenancy-contract.test.mjs +3 -2
  399. package/test/integration/codebaseindex-ingest.test.mjs +48 -0
  400. package/test/integration/features-resolve.test.mjs +30 -11
  401. package/test/integration/inspect-path-cli.test.mjs +46 -0
  402. package/test/integration/inventory-evidence.test.mjs +125 -0
  403. package/test/integration/runtime-status.integration.test.mjs +2 -1
  404. package/test/knowledge.test.mjs +35 -1
  405. package/test/loopback-oauth.test.mjs +53 -0
  406. package/test/ollama.test.mjs +22 -0
  407. package/test/security.test.mjs +23 -0
  408. package/test/setup-planner.test.mjs +74 -0
  409. package/test/setup-runtime.test.mjs +51 -0
  410. package/test/terminal/local-pty.mock.test.mjs +3 -1
  411. package/test/terminal-machine-identity.test.mjs +88 -0
  412. package/test/whoami-resume.test.mjs +27 -6
  413. package/packages/agentsam-brand/test/brand-scan.test.mjs +0 -106
  414. package/packages/work-graph/prototype/README.md +0 -32
  415. package/packages/work-graph/prototype/data/demo-workgraph.js +0 -47
  416. package/packages/work-graph/prototype/renderers/timeline-model.js +0 -21
  417. package/packages/work-graph/prototype/renderers/workgraph-runtime.js +0 -38
  418. package/packages/work-graph/prototype-gnantt.html +0 -655
@@ -133,6 +133,11 @@ export function createCloudflareD1Adapter(db, options = {}) {
133
133
  const id = newAuthUserId();
134
134
  const ts = nowUnix();
135
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();
136
141
  await db.prepare(
137
142
  `INSERT INTO auth_users (id, email, display_name, password_hash, salt, status, created_at, updated_at)
138
143
  VALUES (?, ?, ?, ?, ?, 'active', ?, ?)`,
@@ -145,24 +150,48 @@ export function createCloudflareD1Adapter(db, options = {}) {
145
150
  await db.prepare(
146
151
  `UPDATE auth_users SET password_hash = ?, salt = ?, updated_at = ? WHERE id = ?`,
147
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(() => {});
148
156
  },
149
157
 
150
158
  async findUserByProvider(provider, providerSubject) {
151
159
  const row = await db.prepare(
152
160
  `SELECT u.id, u.email, u.display_name, u.password_hash, u.salt, u.status, u.created_at, u.updated_at
153
161
  FROM account_identities ai
154
- 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
155
164
  WHERE ai.provider = ? AND ai.provider_subject = ?
165
+ AND COALESCE(a.status, 'active') = 'active'
156
166
  LIMIT 1`,
157
167
  ).bind(provider, providerSubject).first();
158
168
  return row || null;
159
169
  },
160
170
 
161
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
+
162
192
  const existing = await db.prepare(
163
193
  `SELECT id FROM account_identities WHERE provider = ? AND provider_subject = ? LIMIT 1`,
164
194
  ).bind(provider, providerSubject).first();
165
- const ts = nowUnix();
166
195
  if (existing?.id) {
167
196
  await db.prepare(
168
197
  `UPDATE account_identities SET account_id = ?, email = ?, updated_at = ? WHERE id = ?`,
@@ -23,7 +23,10 @@ export async function applySqliteIdentityMigrations(db, opts = {}) {
23
23
  '001_identity_core.sql',
24
24
  '002_identity_oauth_client.sql',
25
25
  ];
26
- if (opts.includeOAuthServer) files.push('003_identity_oauth_server.sql');
26
+ if (opts.includeOAuthServer) {
27
+ files.push('003_identity_oauth_server.sql');
28
+ files.push('004_identity_oauth_consent_catalog.sql');
29
+ }
27
30
 
28
31
  for (const file of files) {
29
32
  const sql = fs.readFileSync(path.join(SQLITE_MIGRATIONS_DIR, file), 'utf8');
@@ -4,12 +4,13 @@
4
4
  * Browser login sessions and reusable API credentials are intentionally
5
5
  * separate: login sessions are opaque, machine-local session state while
6
6
  * AGENTSAM_API_KEY is an explicit delegated account credential.
7
+ *
8
+ * Namespaces (do not collapse):
9
+ * PLATFORM issuer → IAM_OAUTH_ISSUER (account API)
10
+ * APP host → agentsam.app.json hosts[] (e.g. local-studio)
11
+ * Never treat Local Studio host origin as an alias of IAM_OAUTH_ISSUER.
7
12
  */
8
13
 
9
- export const DEFAULT_IAM_OAUTH_ISSUER = 'https://inneranimalmedia.com';
10
- /** @deprecated Use DEFAULT_IAM_OAUTH_ISSUER. */
11
- export const DEFAULT_IAM_ORIGIN = DEFAULT_IAM_OAUTH_ISSUER;
12
-
13
14
  export const AGENTSAM_AUTH_ENV = Object.freeze({
14
15
  iamIssuer: 'IAM_OAUTH_ISSUER',
15
16
  iamOrigin: 'IAM_ORIGIN',
@@ -17,8 +18,23 @@ export const AGENTSAM_AUTH_ENV = Object.freeze({
17
18
  iamClientSecret: 'IAM_CLIENT_SECRET',
18
19
  apiKey: 'AGENTSAM_API_KEY',
19
20
  bridgeKey: 'AGENTSAM_BRIDGE_KEY',
21
+ googleClientId: 'GOOGLE_CLIENT_ID',
22
+ googleClientSecret: 'GOOGLE_CLIENT_SECRET',
23
+ googleDesktopClientId: 'GOOGLE_DESKTOP_CLIENT_ID',
24
+ googleDesktopClientSecret: 'GOOGLE_DESKTOP_CLIENT_SECRET',
25
+ githubClientId: 'GITHUB_CLIENT_ID',
26
+ githubClientSecret: 'GITHUB_CLIENT_SECRET',
27
+ cloudflareOauthClientId: 'CLOUDFLARE_OAUTH_CLIENT_ID',
28
+ cloudflareOauthClientSecret: 'CLOUDFLARE_OAUTH_CLIENT_SECRET',
20
29
  });
21
30
 
31
+ /**
32
+ * Hosted AgentSam platform compatibility issuer — not an APP host and never a
33
+ * portable Local Studio default. Portable apps use packages/identity locally
34
+ * unless an installation explicitly selects a remote IAM adapter.
35
+ */
36
+ export const PLATFORM_ACCOUNT_ISSUER = 'https://inneranimalmedia.com';
37
+
22
38
  export const AGENTSAM_AUTH_CONTRACT = Object.freeze({
23
39
  version: 2,
24
40
  authority: 'agentsam-sdk',
@@ -27,6 +43,7 @@ export const AGENTSAM_AUTH_CONTRACT = Object.freeze({
27
43
  origin: AGENTSAM_AUTH_ENV.iamOrigin,
28
44
  clientId: AGENTSAM_AUTH_ENV.iamClientId,
29
45
  clientSecret: AGENTSAM_AUTH_ENV.iamClientSecret,
46
+ defaultIssuer: PLATFORM_ACCOUNT_ISSUER,
30
47
  }),
31
48
  apiKey: Object.freeze({
32
49
  env: AGENTSAM_AUTH_ENV.apiKey,
@@ -55,11 +72,14 @@ function normalizeOrigin(value) {
55
72
  return clean(value).replace(/\/+$/, '');
56
73
  }
57
74
 
58
- /** Resolve canonical IAM issuer. IAM_OAUTH_ISSUER wins; IAM_ORIGIN is compatibility only. */
75
+ /**
76
+ * Resolve PLATFORM account issuer.
77
+ * Order: explicit → IAM_OAUTH_ISSUER → IAM_ORIGIN → PLATFORM_ACCOUNT_ISSUER.
78
+ * Does not read APP host origins.
79
+ */
59
80
  export function resolveIamIssuer(env = {}, explicit = '') {
60
- return normalizeOrigin(
61
- explicit || env?.IAM_OAUTH_ISSUER || env?.IAM_ORIGIN || DEFAULT_IAM_OAUTH_ISSUER,
62
- );
81
+ return normalizeOrigin(explicit || env?.IAM_OAUTH_ISSUER || env?.IAM_ORIGIN || '')
82
+ || PLATFORM_ACCOUNT_ISSUER;
63
83
  }
64
84
 
65
85
  /** @deprecated Use resolveIamIssuer. Same resolution order as issuer. */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Portable external identity shape — storage-agnostic.
3
- * Adapters map this into application-specific account_identities rows.
3
+ * Adapters map this into account_identities rows that point at accounts (SSOT).
4
4
  */
5
5
 
6
6
  /** @typedef {import('../provider-contract.js').NormalizedExternalIdentity} NormalizedExternalIdentity */
@@ -3,6 +3,7 @@
3
3
  export const IdentityProviders = Object.freeze([
4
4
  'email',
5
5
  'google',
6
+ 'google_desktop',
6
7
  'github',
7
8
  'gcp',
8
9
  'inneranimalmedia',
@@ -26,7 +26,8 @@ The CLI can now scaffold the reusable identity app surfaces directly with `agent
26
26
  - `POST /api/auth/login`
27
27
  - `POST /api/auth/signup` — create account (email/password); portal form must call this, not login
28
28
  - `GET /api/company` — public branding SSOT (loaded by `shared/company-branding.js`)
29
- - OAuth: `/api/oauth/google/start`, `/api/oauth/github/start`
29
+ - OAuth: `/api/oauth/google/start`, `/api/oauth/github/start`, `/api/oauth/cloudflare/start`
30
+ - Desktop PKCE broker: `POST /api/oauth/google/desktop-exchange` (`GOOGLE_DESKTOP_CLIENT_ID`)
30
31
  - GCP: per-client when demanded — scaffold only until requested
31
32
 
32
33
  Sensitive finalize stays server-side (`oauth/callback` → Identity Service).
@@ -4,7 +4,7 @@
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Sign in | Inner Animal Media</title>
7
+ <title>Sign in | AgentSam</title>
8
8
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
9
9
  rel="stylesheet">
10
10
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
@@ -360,12 +360,12 @@
360
360
  <div class="login-card">
361
361
  <img
362
362
  class="auth-logo"
363
- src="https://imagedelivery.net/g7wf09fCONpnidkRnR_5vw/527ab85a-01bb-4125-57bb-694fe8be8700/public"
364
- alt="Inner Animal Media"
363
+ src="/shared/agentsam-mark.svg"
364
+ alt="AgentSam"
365
365
  />
366
366
 
367
367
  <h1 data-company-tagline>Instant Access</h1>
368
- <p class="subtitle" data-company-subtitle="signin">Sign in to Inner Animal Media</p>
368
+ <p class="subtitle" data-company-subtitle="signin">Sign in to AgentSam</p>
369
369
  <p id="registeredMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Account created. Sign in below.</p>
370
370
  <p id="resetMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Password updated. Sign in with your new password.</p>
371
371
  <p id="oauthErrorMsg" class="subtitle" style="color: #FF3B30; display: none; margin-top: -16px; margin-bottom: 16px;"></p>
@@ -451,7 +451,7 @@
451
451
  </div>
452
452
 
453
453
  <footer class="auth-min-footer" aria-label="Legal">
454
- <span data-company-name>Inner Animal Media</span>
454
+ <span data-company-name>AgentSam</span>
455
455
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
456
456
  <a href="/privacy">Privacy</a>
457
457
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
@@ -824,6 +824,7 @@
824
824
  });
825
825
  })();
826
826
  </script>
827
+ <script src="/shared/desktop-identity-bridge.js" defer></script>
827
828
  <script src="/shared/company-branding.js" defer></script>
828
829
  </body>
829
830
  </html>
@@ -4,7 +4,7 @@
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Reset password | Inner Animal Media</title>
7
+ <title>Reset password | AgentSam</title>
8
8
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
9
9
  rel="stylesheet">
10
10
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
@@ -280,8 +280,8 @@
280
280
  <div class="login-card">
281
281
  <img
282
282
  class="auth-logo"
283
- src="https://imagedelivery.net/g7wf09fCONpnidkRnR_5vw/527ab85a-01bb-4125-57bb-694fe8be8700/public"
284
- alt="Inner Animal Media"
283
+ src="/shared/agentsam-mark.svg"
284
+ alt="AgentSam"
285
285
  style="width:120px;height:120px;object-fit:contain;display:block;margin:0 auto 20px;"
286
286
  />
287
287
 
@@ -290,7 +290,7 @@
290
290
  <p class="subtitle">We'll send you a secure verification code.</p>
291
291
 
292
292
  <div class="email-note">
293
- You'll receive an email from <strong data-company-support-email>hey@inneranimalmedia.com</strong>.<br>
293
+ You'll receive an email from <strong data-company-support-email>support@agentsam.dev</strong>.<br>
294
294
  Check your inbox and spam folder.
295
295
  </div>
296
296
 
@@ -365,7 +365,7 @@
365
365
  </div>
366
366
 
367
367
  <footer class="auth-min-footer" aria-label="Legal">
368
- <span data-company-name>Inner Animal Media</span>
368
+ <span data-company-name>AgentSam</span>
369
369
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
370
370
  <a href="/privacy">Privacy</a>
371
371
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
@@ -579,6 +579,7 @@
579
579
  }
580
580
  })();
581
581
  </script>
582
+ <script src="/shared/desktop-identity-bridge.js" defer></script>
582
583
  <script src="/shared/company-branding.js" defer></script>
583
584
  </body>
584
585
  </html>
@@ -4,7 +4,7 @@
4
4
  <head>
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>Sign up | Inner Animal Media</title>
7
+ <title>Sign up | AgentSam</title>
8
8
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
9
9
  rel="stylesheet">
10
10
  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
@@ -398,12 +398,12 @@
398
398
  <div class="login-card">
399
399
  <img
400
400
  class="auth-logo"
401
- src="https://imagedelivery.net/g7wf09fCONpnidkRnR_5vw/527ab85a-01bb-4125-57bb-694fe8be8700/public"
402
- alt="Inner Animal Media"
401
+ src="/shared/agentsam-mark.svg"
402
+ alt="AgentSam"
403
403
  />
404
404
 
405
405
  <h1>Create account</h1>
406
- <p class="subtitle" data-company-subtitle="signup">Join Inner Animal Media</p>
406
+ <p class="subtitle" data-company-subtitle="signup">Join AgentSam</p>
407
407
  <p id="registeredMsg" class="subtitle" style="color: #10B981; display: none; margin-top: -16px; margin-bottom: 16px;">Account created. Sign in below.</p>
408
408
  <p id="oauthErrorMsg" class="subtitle" style="color: #FF3B30; display: none; margin-top: -16px; margin-bottom: 16px;"></p>
409
409
  <p id="cfConnectNotice" class="subtitle" style="color: #fdba74; display: none; margin-top: -12px; margin-bottom: 12px; font-size: 12px; line-height: 1.45; text-align: center; max-width: 320px;">Sign in with Google, GitHub, or Supabase first, then connect Cloudflare from Integrations.</p>
@@ -485,7 +485,7 @@
485
485
  </div>
486
486
 
487
487
  <footer class="auth-min-footer" aria-label="Legal">
488
- <span data-company-name>Inner Animal Media</span>
488
+ <span data-company-name>AgentSam</span>
489
489
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
490
490
  <a href="/privacy">Privacy</a>
491
491
  <span class="auth-min-footer-sep" aria-hidden="true">|</span>
@@ -835,6 +835,7 @@
835
835
  });
836
836
  })();
837
837
  </script>
838
+ <script src="/shared/desktop-identity-bridge.js" defer></script>
838
839
  <script src="/shared/company-branding.js" defer></script>
839
840
  </body>
840
841
  </html>
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Auth portal branding from D1 `company` via GET /api/company.
3
- * Static HTML keeps IAM defaults as fallback when API is unavailable.
3
+ * Static HTML keeps portable AgentSam defaults as fallback when host branding is unavailable.
4
4
  */
5
5
  (function () {
6
6
  var SUBTITLE_PREFIX = {
@@ -0,0 +1,207 @@
1
+ (function () {
2
+ function getInvoke() {
3
+ try {
4
+ return window.__TAURI__?.core?.invoke
5
+ || window.parent?.__TAURI__?.core?.invoke
6
+ || null;
7
+ } catch {
8
+ return null;
9
+ }
10
+ }
11
+
12
+ var invoke = getInvoke();
13
+ if (!invoke) return;
14
+
15
+ var APP_ID = 'local-studio';
16
+ var SESSION_ACCOUNT = 'identity_session';
17
+ var originalFetch = window.fetch.bind(window);
18
+
19
+ async function callIdentity(payload) {
20
+ var raw = await invoke('identity_bridge', {
21
+ requestJson: JSON.stringify(payload || {}),
22
+ });
23
+ var body = typeof raw === 'string' ? JSON.parse(raw) : raw;
24
+ if (!body || body.ok === false) {
25
+ throw new Error(body?.error || 'identity_request_failed');
26
+ }
27
+ return body;
28
+ }
29
+
30
+ async function getSessionId() {
31
+ return await invoke('secure_store_get', {
32
+ appId: APP_ID,
33
+ account: SESSION_ACCOUNT,
34
+ });
35
+ }
36
+
37
+ async function setSessionId(sessionId) {
38
+ await invoke('secure_store_set', {
39
+ appId: APP_ID,
40
+ account: SESSION_ACCOUNT,
41
+ value: String(sessionId || ''),
42
+ });
43
+ }
44
+
45
+ async function clearSessionId() {
46
+ try {
47
+ await invoke('secure_store_delete', {
48
+ appId: APP_ID,
49
+ account: SESSION_ACCOUNT,
50
+ });
51
+ } catch {}
52
+ }
53
+
54
+ function jsonResponse(body, status) {
55
+ return new Response(JSON.stringify(body), {
56
+ status: status || 200,
57
+ headers: { 'content-type': 'application/json' },
58
+ });
59
+ }
60
+
61
+ function parseBody(init) {
62
+ if (!init?.body) return {};
63
+ try {
64
+ return typeof init.body === 'string' ? JSON.parse(init.body) : {};
65
+ } catch {
66
+ return {};
67
+ }
68
+ }
69
+
70
+ function notifyAuthenticated(body) {
71
+ try {
72
+ window.parent?.postMessage({
73
+ type: 'agentsam:desktop-identity',
74
+ authenticated: true,
75
+ user: body?.user || null,
76
+ }, '*');
77
+ } catch {}
78
+ }
79
+
80
+ window.fetch = async function packagedIdentityFetch(input, init) {
81
+ var url;
82
+ try {
83
+ url = new URL(typeof input === 'string' ? input : input.url, window.location.href);
84
+ } catch {
85
+ return originalFetch(input, init);
86
+ }
87
+
88
+ if (url.pathname === '/api/company') {
89
+ return jsonResponse({
90
+ name: 'AgentSam',
91
+ tagline: 'Instant Access',
92
+ logoUrl: '/shared/agentsam-mark.svg',
93
+ authBgColor: '#050508',
94
+ });
95
+ }
96
+
97
+ if (url.pathname === '/api/auth/login') {
98
+ try {
99
+ var loginBody = parseBody(init);
100
+ var login = await callIdentity({
101
+ op: 'login',
102
+ email: loginBody.email,
103
+ password: loginBody.password,
104
+ next: loginBody.next || '/agentsam',
105
+ });
106
+ await setSessionId(login.session_id);
107
+ notifyAuthenticated(login);
108
+ return jsonResponse({ ok: true, user: login.user, redirect: '/agentsam' });
109
+ } catch (error) {
110
+ return jsonResponse({ ok: false, error: error?.message || String(error) }, 401);
111
+ }
112
+ }
113
+
114
+ if (url.pathname === '/api/auth/signup') {
115
+ try {
116
+ var signupBody = parseBody(init);
117
+ var signup = await callIdentity({
118
+ op: 'signup',
119
+ email: signupBody.email,
120
+ password: signupBody.password,
121
+ displayName: signupBody.name || signupBody.displayName || signupBody.display_name,
122
+ next: signupBody.next || '/agentsam',
123
+ });
124
+ await setSessionId(signup.session_id);
125
+ notifyAuthenticated(signup);
126
+ return jsonResponse({ ok: true, user: signup.user, redirect: '/agentsam' });
127
+ } catch (error) {
128
+ return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
129
+ }
130
+ }
131
+
132
+ if (url.pathname === '/api/auth/password-reset/request') {
133
+ try {
134
+ var requestBody = parseBody(init);
135
+ var requested = await callIdentity({
136
+ op: 'reset_request',
137
+ email: requestBody.email,
138
+ });
139
+ return jsonResponse(requested);
140
+ } catch (error) {
141
+ return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
142
+ }
143
+ }
144
+
145
+ if (url.pathname === '/api/auth/password-reset/confirm') {
146
+ try {
147
+ var resetBody = parseBody(init);
148
+ var reset = await callIdentity({
149
+ op: 'reset_confirm',
150
+ email: resetBody.email,
151
+ code: resetBody.code,
152
+ password: resetBody.password,
153
+ confirm_password: resetBody.confirm_password || resetBody.confirmPassword || resetBody.confirm,
154
+ });
155
+ return jsonResponse(reset);
156
+ } catch (error) {
157
+ return jsonResponse({ ok: false, error: error?.message || String(error) }, 400);
158
+ }
159
+ }
160
+
161
+ if (url.pathname === '/api/auth/logout') {
162
+ var sessionId = await getSessionId();
163
+ if (sessionId) {
164
+ try {
165
+ await callIdentity({ op: 'logout', session_id: sessionId });
166
+ } catch {}
167
+ }
168
+ await clearSessionId();
169
+ return jsonResponse({ ok: true });
170
+ }
171
+
172
+ return originalFetch(input, init);
173
+ };
174
+
175
+ function localizeAuthLinks() {
176
+ var map = {
177
+ '/auth/login': './login.html',
178
+ '/auth/signup': './signup.html',
179
+ '/auth/reset': './reset.html',
180
+ };
181
+ document.querySelectorAll('a[href]').forEach(function (link) {
182
+ var href = link.getAttribute('href');
183
+ if (!href) return;
184
+ var base = href.split('?')[0];
185
+ if (map[base]) {
186
+ var query = href.indexOf('?') >= 0 ? href.slice(href.indexOf('?')) : '';
187
+ link.setAttribute('href', map[base] + query);
188
+ }
189
+ });
190
+
191
+ // Provider OAuth belongs to installed provider adapters. Do not render
192
+ // decorative/dead login buttons in the packaged native surface.
193
+ ['googleSignIn', 'githubSignIn', 'cloudflareSignIn'].forEach(function (id) {
194
+ var link = document.getElementById(id);
195
+ if (link) link.style.display = 'none';
196
+ });
197
+ var backupToggle = document.getElementById('backupCodeToggle');
198
+ if (backupToggle) {
199
+ var backupPrompt = backupToggle.closest('p');
200
+ if (backupPrompt) backupPrompt.style.display = 'none';
201
+ else backupToggle.style.display = 'none';
202
+ }
203
+ }
204
+
205
+ window.addEventListener('DOMContentLoaded', localizeAuthLinks);
206
+ window.__AGENTSAM_DESKTOP_IDENTITY__ = true;
207
+ })();
@@ -66,12 +66,28 @@ export {
66
66
  } from './server/post-auth.js';
67
67
  export { verifyAppAuthContract, verifyAppPackage } from './app/verify-app.js';
68
68
  export { DEFAULT_COMPANY_ID, DEFAULT_COMPANY_SLUG, normalizeCompanyRow } from './contracts/company.js';
69
+ export {
70
+ buildOAuthConsentView,
71
+ normalizeOAuthConsentCompany,
72
+ normalizeOAuthConsentResource,
73
+ normalizeOAuthConsentClient,
74
+ normalizeOAuthConsentScope,
75
+ } from './oauth/consent-view.js';
69
76
  export * from './contracts/auth-config.js';
70
77
  export { createPasswordResetService } from './recovery/password-reset.js';
71
78
  export {
72
79
  finalizeInboundOAuth,
73
80
  registerFinalizeInboundOAuth,
74
81
  } from './oauth/callback.js';
82
+ export {
83
+ resolveOAuthCredentialLane,
84
+ resolveIamPlatformCredentials,
85
+ requireIamPlatformCredentials,
86
+ } from './oauth/credentials.js';
87
+ export {
88
+ handleGoogleDesktopExchangeRequest,
89
+ resolveGoogleExchangeSecret,
90
+ } from './oauth/google-desktop-exchange.js';
75
91
  export { createCloudflareD1Adapter } from './adapters/cloudflare-d1/index.js';
76
92
  export {
77
93
  createSqliteIdentityAdapter,
@@ -1,5 +1,20 @@
1
1
  -- AgentSam Identity — customer D1 core (portable, boring, growable)
2
2
  -- Timestamps: INTEGER unixepoch seconds (AGENTS.md §2)
3
+ --
4
+ -- SSOT: `accounts` is the account row of record.
5
+ -- `auth_users` is the login principal (1:1 with accounts.id in this portable scaffold).
6
+ -- `account_identities` is IdP linkage only (provider + subject → accounts.id) — never the account SSOT.
7
+
8
+ CREATE TABLE IF NOT EXISTS accounts (
9
+ id TEXT PRIMARY KEY NOT NULL,
10
+ email TEXT NOT NULL COLLATE NOCASE,
11
+ display_name TEXT,
12
+ status TEXT NOT NULL DEFAULT 'active',
13
+ created_at INTEGER NOT NULL,
14
+ updated_at INTEGER NOT NULL
15
+ );
16
+
17
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_email ON accounts(email);
3
18
 
4
19
  CREATE TABLE IF NOT EXISTS auth_users (
5
20
  id TEXT PRIMARY KEY NOT NULL,
@@ -9,7 +24,8 @@ CREATE TABLE IF NOT EXISTS auth_users (
9
24
  salt TEXT,
10
25
  status TEXT NOT NULL DEFAULT 'active',
11
26
  created_at INTEGER NOT NULL,
12
- updated_at INTEGER NOT NULL
27
+ updated_at INTEGER NOT NULL,
28
+ FOREIGN KEY (id) REFERENCES accounts(id)
13
29
  );
14
30
 
15
31
  CREATE UNIQUE INDEX IF NOT EXISTS idx_auth_users_email ON auth_users(email);
@@ -31,6 +47,7 @@ CREATE TABLE IF NOT EXISTS auth_sessions (
31
47
  CREATE INDEX IF NOT EXISTS idx_auth_sessions_user_expires
32
48
  ON auth_sessions(user_id, expires_at);
33
49
 
50
+ -- IdP linkage only — points at accounts (SSOT), not a substitute for accounts.
34
51
  CREATE TABLE IF NOT EXISTS account_identities (
35
52
  id TEXT PRIMARY KEY NOT NULL,
36
53
  account_id TEXT NOT NULL,
@@ -39,7 +56,7 @@ CREATE TABLE IF NOT EXISTS account_identities (
39
56
  email TEXT,
40
57
  created_at INTEGER NOT NULL,
41
58
  updated_at INTEGER NOT NULL,
42
- FOREIGN KEY (account_id) REFERENCES auth_users(id)
59
+ FOREIGN KEY (account_id) REFERENCES accounts(id)
43
60
  );
44
61
 
45
62
  CREATE UNIQUE INDEX IF NOT EXISTS idx_account_identities_provider_subject
@@ -0,0 +1,20 @@
1
+ -- Additive upgrade: accounts as SSOT for scaffolds that already applied an older 0001.
2
+ -- Safe to re-run. New scaffolds get accounts from 0001_identity_core.sql directly.
3
+ --
4
+ -- account_identities remains IdP linkage only (provider + subject → accounts.id).
5
+
6
+ CREATE TABLE IF NOT EXISTS accounts (
7
+ id TEXT PRIMARY KEY NOT NULL,
8
+ email TEXT NOT NULL COLLATE NOCASE,
9
+ display_name TEXT,
10
+ status TEXT NOT NULL DEFAULT 'active',
11
+ created_at INTEGER NOT NULL,
12
+ updated_at INTEGER NOT NULL
13
+ );
14
+
15
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_accounts_email ON accounts(email);
16
+
17
+ -- Backfill from auth_users (1:1 portable scaffold).
18
+ INSERT OR IGNORE INTO accounts (id, email, display_name, status, created_at, updated_at)
19
+ SELECT id, email, display_name, COALESCE(status, 'active'), created_at, updated_at
20
+ FROM auth_users;
@@ -14,13 +14,16 @@ wrangler d1 execute <database_name> --remote --file=migrations/0001_identity_cor
14
14
 
15
15
  `agentsam identity init` copies this migration into the customer project automatically.
16
16
 
17
+ Existing scaffolds missing `accounts`: also apply `0003_accounts_ssot.sql`.
18
+
17
19
  ## Tables
18
20
 
19
21
  | Table | Purpose |
20
22
  |-------|---------|
21
- | `auth_users` | Login identity (`au_*` ids) |
23
+ | `accounts` | **Account SSOT** — row of record (`au_*` ids shared with auth_users in portable scaffold) |
24
+ | `auth_users` | Login principal (password hash, 1:1 with accounts.id) |
22
25
  | `auth_sessions` | Browser sessions |
23
- | `account_identities` | OAuth provider linkage |
26
+ | `account_identities` | IdP linkage only (provider + subject → accounts.id) — **not** the account SSOT |
24
27
  | `oauth_states` | PKCE/state for OAuth start |
25
28
  | `password_reset_tokens` | Reset flow (grow when wired) |
26
29
  | `company` | Branding SSOT — name, logo, colors, support info (`GET /api/company`) |