@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

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 (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -0,0 +1,134 @@
1
+ .agentsam-tool-permission-overlay {
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 120;
5
+ display: grid;
6
+ place-items: center;
7
+ padding: 24px;
8
+ background: color-mix(in srgb, var(--background, #09090b) 68%, transparent);
9
+ backdrop-filter: blur(10px);
10
+ }
11
+ .agentsam-tool-permission-card {
12
+ width: min(640px, calc(100vw - 32px));
13
+ overflow: hidden;
14
+ border: 1px solid color-mix(in srgb, var(--border, #3f3f46) 82%, transparent);
15
+ border-radius: 22px;
16
+ background: color-mix(in srgb, var(--card, #18181b) 97%, black);
17
+ color: var(--card-foreground, #fafafa);
18
+ box-shadow: 0 28px 90px rgba(0, 0, 0, .45);
19
+ }
20
+ .agentsam-tool-permission-header {
21
+ display: flex;
22
+ gap: 14px;
23
+ align-items: flex-start;
24
+ padding: 22px 22px 18px;
25
+ border-bottom: 1px solid var(--border, #3f3f46);
26
+ }
27
+ .agentsam-tool-permission-mark {
28
+ display: grid;
29
+ place-items: center;
30
+ width: 38px;
31
+ height: 38px;
32
+ flex: 0 0 auto;
33
+ border: 1px solid var(--border, #3f3f46);
34
+ border-radius: 11px;
35
+ background: var(--background, #09090b);
36
+ font-size: 11px;
37
+ font-weight: 700;
38
+ letter-spacing: .08em;
39
+ }
40
+ .agentsam-tool-permission-header h2 {
41
+ margin: 0;
42
+ font-size: 16px;
43
+ font-weight: 650;
44
+ }
45
+ .agentsam-tool-permission-header p {
46
+ margin: 6px 0 0;
47
+ color: var(--muted-foreground, #a1a1aa);
48
+ font-size: 13px;
49
+ line-height: 1.45;
50
+ }
51
+ .agentsam-tool-permission-body {
52
+ display: grid;
53
+ gap: 16px;
54
+ padding: 18px 22px;
55
+ }
56
+ .agentsam-tool-permission-facts,
57
+ .agentsam-tool-permission-shared dl {
58
+ display: grid;
59
+ gap: 8px;
60
+ margin: 0;
61
+ }
62
+ .agentsam-tool-permission-facts > div,
63
+ .agentsam-tool-permission-shared dl > div {
64
+ display: grid;
65
+ grid-template-columns: minmax(90px, 140px) 1fr;
66
+ gap: 14px;
67
+ align-items: baseline;
68
+ }
69
+ .agentsam-tool-permission-facts dt,
70
+ .agentsam-tool-permission-shared dt {
71
+ color: var(--muted-foreground, #a1a1aa);
72
+ font-size: 12px;
73
+ }
74
+ .agentsam-tool-permission-facts dd,
75
+ .agentsam-tool-permission-shared dd {
76
+ min-width: 0;
77
+ margin: 0;
78
+ overflow-wrap: anywhere;
79
+ font-size: 13px;
80
+ }
81
+ .agentsam-tool-permission-shared { padding-top: 2px; }
82
+ .agentsam-tool-permission-shared h3 {
83
+ margin: 0 0 10px;
84
+ font-size: 12px;
85
+ font-weight: 600;
86
+ }
87
+ .agentsam-tool-permission-warning {
88
+ margin: 0;
89
+ border: 1px solid color-mix(in srgb, #f59e0b 45%, var(--border, #3f3f46));
90
+ border-radius: 12px;
91
+ padding: 10px 12px;
92
+ color: color-mix(in srgb, #fbbf24 72%, var(--card-foreground, #fafafa));
93
+ font-size: 12px;
94
+ line-height: 1.45;
95
+ }
96
+ .agentsam-tool-permission-actions {
97
+ display: flex;
98
+ gap: 8px;
99
+ align-items: center;
100
+ padding: 14px 16px;
101
+ border-top: 1px solid var(--border, #3f3f46);
102
+ background: color-mix(in srgb, var(--muted, #27272a) 42%, transparent);
103
+ }
104
+ .agentsam-tool-permission-actions button {
105
+ min-height: 36px;
106
+ border: 1px solid var(--border, #3f3f46);
107
+ border-radius: 10px;
108
+ padding: 0 13px;
109
+ background: var(--card, #18181b);
110
+ color: inherit;
111
+ font: inherit;
112
+ font-size: 12px;
113
+ cursor: pointer;
114
+ }
115
+ .agentsam-tool-permission-actions button:disabled {
116
+ cursor: wait;
117
+ opacity: .55;
118
+ }
119
+ .agentsam-tool-permission-actions button:hover:not(:disabled) {
120
+ background: var(--muted, #27272a);
121
+ }
122
+ .agentsam-tool-permission-actions .agentsam-tool-permission-primary {
123
+ border-color: color-mix(in srgb, var(--primary, #fafafa) 48%, var(--border, #3f3f46));
124
+ background: var(--primary, #fafafa);
125
+ color: var(--primary-foreground, #18181b);
126
+ }
127
+ .agentsam-tool-permission-spacer { flex: 1; }
128
+ @media (max-width: 640px) {
129
+ .agentsam-tool-permission-overlay { padding: 12px; align-items: end; }
130
+ .agentsam-tool-permission-card { width: 100%; border-radius: 18px; }
131
+ .agentsam-tool-permission-actions { flex-wrap: wrap; }
132
+ .agentsam-tool-permission-spacer { display: none; }
133
+ .agentsam-tool-permission-actions button { flex: 1 1 auto; }
134
+ }
@@ -1,12 +1,24 @@
1
1
  {
2
2
  "name": "@inneranimalmedia/agentsam-connector-cloudflare",
3
- "version": "0.1.0",
4
- "private": true,
3
+ "version": "2.6.7",
5
4
  "type": "module",
6
5
  "main": "./src/index.js",
7
6
  "exports": {
8
7
  ".": "./src/index.js",
9
8
  "./capabilities": "./src/capabilities.js",
10
9
  "./api-client": "./src/api-client.js"
11
- }
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/SamPrimeaux/agentsam-sdk.git",
17
+ "directory": "packages/connectors/cloudflare"
18
+ },
19
+ "files": [
20
+ "src"
21
+ ],
22
+ "description": "Portable Cloudflare capability connector for AgentSam applications and SDK consumers.",
23
+ "license": "MIT"
12
24
  }
@@ -135,15 +135,16 @@ export class CloudflareApiClient {
135
135
  }
136
136
 
137
137
  const headers = {
138
- Authorization: `Bearer ${this.apiToken}`,
139
138
  Accept: 'application/json',
139
+ ...(opts.headers || {}),
140
+ Authorization: `Bearer ${this.apiToken}`,
140
141
  };
141
142
  let body;
142
143
  if (opts.body != null && method !== 'GET' && method !== 'HEAD') {
143
144
  if (opts.body instanceof FormData || typeof opts.body === 'string' || Buffer.isBuffer(opts.body)) {
144
145
  body = opts.body;
145
146
  } else {
146
- headers['Content-Type'] = 'application/json';
147
+ if (!headers['Content-Type'] && !headers['content-type']) headers['Content-Type'] = 'application/json';
147
148
  body = JSON.stringify(opts.body);
148
149
  }
149
150
  }
@@ -0,0 +1,127 @@
1
+ import { createCloudflareApiClient } from '../api-client.js';
2
+
3
+ export const VECTORIZE_CAPABILITY_ID = 'cloudflare.vectorize';
4
+
5
+ const clean = value => String(value || '').trim();
6
+
7
+ function assertIndex(index) {
8
+ const value = clean(index);
9
+ if (!value) throw new Error('cloudflare_vectorize_index_required');
10
+ return value;
11
+ }
12
+
13
+ function normalizeVector(record = {}) {
14
+ const id = clean(record.id);
15
+ const values = Array.isArray(record.values) ? record.values : record.vector;
16
+ if (!id) throw new Error('cloudflare_vectorize_vector_id_required');
17
+ if (!Array.isArray(values) || !values.length || values.some(value => typeof value !== 'number' || !Number.isFinite(value))) {
18
+ throw new Error('cloudflare_vectorize_vector_values_required');
19
+ }
20
+ const vector = { id, values };
21
+ if (record.namespace != null) vector.namespace = record.namespace;
22
+ if (record.metadata != null) vector.metadata = record.metadata;
23
+ return vector;
24
+ }
25
+
26
+ function workerBinding(binding, context = {}) {
27
+ if (context.backend && typeof context.backend.query === 'function' && typeof context.backend.upsert === 'function') return context.backend;
28
+ if (context.workerBinding && typeof context.workerBinding.query === 'function' && typeof context.workerBinding.upsert === 'function') return context.workerBinding;
29
+ return context.env?.[binding] || null;
30
+ }
31
+
32
+ async function apiClient(context = {}) {
33
+ if (context.apiClient) return context.apiClient;
34
+ return createCloudflareApiClient({
35
+ capabilityId: VECTORIZE_CAPABILITY_ID,
36
+ env: context.env || process.env,
37
+ ownerId: context.ownerId || context.owner_id || '',
38
+ explicitAccountId: context.accountId || context.account_id || '',
39
+ apiToken: context.apiToken || '',
40
+ authMode: context.authMode,
41
+ fetchImpl: context.fetchImpl,
42
+ decryptUserOauthToken: context.decryptUserOauthToken,
43
+ });
44
+ }
45
+
46
+ function indexPath(client, index, operation = '') {
47
+ const suffix = `/vectorize/v2/indexes/${encodeURIComponent(assertIndex(index))}${operation ? `/${operation}` : ''}`;
48
+ return client.accountPath(suffix);
49
+ }
50
+
51
+ export async function vectorizeUpsert({ binding, index, records, context = {} } = {}) {
52
+ const vectors = (records || []).map(normalizeVector);
53
+ const worker = workerBinding(binding, context);
54
+ if (worker) return { transport: 'worker_binding', result: await worker.upsert(vectors) };
55
+ const client = await apiClient(context);
56
+ const ndjson = vectors.map(row => JSON.stringify(row)).join('\n') + (vectors.length ? '\n' : '');
57
+ const result = await client.request('POST', indexPath(client, index, 'upsert'), {
58
+ capabilityId: VECTORIZE_CAPABILITY_ID,
59
+ operation: 'vectorize.upsert',
60
+ headers: { 'Content-Type': 'application/x-ndjson' },
61
+ body: ndjson,
62
+ });
63
+ return { transport: 'cloudflare_api', result: result.result, auth: result.auth };
64
+ }
65
+
66
+ export async function vectorizeQuery({ binding, index, vector, options = {}, context = {} } = {}) {
67
+ if (!Array.isArray(vector) || !vector.length) throw new Error('cloudflare_vectorize_query_vector_required');
68
+ const worker = workerBinding(binding, context);
69
+ if (worker) return { transport: 'worker_binding', result: await worker.query(vector, options) };
70
+ const client = await apiClient(context);
71
+ const result = await client.request('POST', indexPath(client, index, 'query'), {
72
+ capabilityId: VECTORIZE_CAPABILITY_ID,
73
+ operation: 'vectorize.query',
74
+ body: { vector, ...options },
75
+ });
76
+ return { transport: 'cloudflare_api', result: result.result, auth: result.auth };
77
+ }
78
+
79
+ export async function vectorizeDelete({ binding, index, ids, context = {} } = {}) {
80
+ const normalizedIds = (ids || []).map(clean).filter(Boolean);
81
+ const worker = workerBinding(binding, context);
82
+ if (worker) {
83
+ if (typeof worker.deleteByIds !== 'function') throw new Error('cloudflare_vectorize_worker_delete_unavailable');
84
+ return { transport: 'worker_binding', result: await worker.deleteByIds(normalizedIds) };
85
+ }
86
+ const client = await apiClient(context);
87
+ const result = await client.request('POST', indexPath(client, index, 'delete_by_ids'), {
88
+ capabilityId: VECTORIZE_CAPABILITY_ID,
89
+ operation: 'vectorize.delete_by_ids',
90
+ body: { ids: normalizedIds },
91
+ });
92
+ return { transport: 'cloudflare_api', result: result.result, auth: result.auth };
93
+ }
94
+
95
+ export async function vectorizeGetByIds({ binding, index, ids, context = {} } = {}) {
96
+ const normalizedIds = (ids || []).map(clean).filter(Boolean);
97
+ const worker = workerBinding(binding, context);
98
+ if (worker) {
99
+ if (typeof worker.getByIds !== 'function') throw new Error('cloudflare_vectorize_worker_get_by_ids_unavailable');
100
+ return { transport: 'worker_binding', result: await worker.getByIds(normalizedIds) };
101
+ }
102
+ const client = await apiClient(context);
103
+ const result = await client.request('POST', indexPath(client, index, 'get_by_ids'), {
104
+ capabilityId: VECTORIZE_CAPABILITY_ID,
105
+ operation: 'vectorize.get_by_ids',
106
+ body: { ids: normalizedIds },
107
+ });
108
+ return { transport: 'cloudflare_api', result: result.result, auth: result.auth };
109
+ }
110
+
111
+ export async function vectorizeHealth({ binding, index, context = {} } = {}) {
112
+ const worker = workerBinding(binding, context);
113
+ if (worker) {
114
+ if (typeof worker.describe !== 'function') return { operational: true, transport: 'worker_binding', detail: null };
115
+ return { operational: true, transport: 'worker_binding', detail: await worker.describe() };
116
+ }
117
+ try {
118
+ const client = await apiClient(context);
119
+ const result = await client.request('GET', indexPath(client, index, 'info'), {
120
+ capabilityId: VECTORIZE_CAPABILITY_ID,
121
+ operation: 'vectorize.info',
122
+ });
123
+ return { operational: true, transport: 'cloudflare_api', detail: result.result, auth: result.auth };
124
+ } catch (error) {
125
+ return { operational: false, transport: 'cloudflare_api', error: error?.code || error?.message || String(error) };
126
+ }
127
+ }
@@ -64,6 +64,7 @@ export * as keyless from './families/keyless.js';
64
64
  export * as tokenValidation from './families/token-validation.js';
65
65
  export * as pages from './families/pages.js';
66
66
  export * as snippets from './families/snippets.js';
67
+ export * as vectorize from './families/vectorize.js';
67
68
 
68
69
  import { scopesForCapabilities as _scopesForCapabilities, scopesForFeaturePacks as _scopesForFeaturePacks } from './capabilities.js';
69
70
  import { CLOUDFLARE_ALL_SCOPES as _CLOUDFLARE_ALL_SCOPES, isKnownCloudflareScope } from './scope-catalog.js';
@@ -1,9 +1,9 @@
1
- # @inneranimalmedia/heuristic-theme
1
+ # @inneranimalmedia/theme-heuristic
2
2
 
3
3
  Stock AgentSam CMS storefront shell theme. Exports a deterministic theme contract consumed by CMS presets and `theme.storefront.shell`.
4
4
 
5
5
  ```js
6
- import { createStorefrontShellTheme } from "@inneranimalmedia/heuristic-theme";
6
+ import { createStorefrontShellTheme } from "@inneranimalmedia/theme-heuristic";
7
7
 
8
8
  const theme = createStorefrontShellTheme();
9
9
  ```
@@ -1,6 +1,6 @@
1
1
  {
2
- "name": "@inneranimalmedia/heuristic-theme",
3
- "version": "0.1.0",
2
+ "name": "@inneranimalmedia/theme-heuristic",
3
+ "version": "2.6.7",
4
4
  "description": "Stock AgentSam CMS storefront shell theme contract (heuristic-theme).",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
@@ -21,5 +21,10 @@
21
21
  "publishConfig": {
22
22
  "access": "public"
23
23
  },
24
- "license": "MIT"
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/SamPrimeaux/agentsam-sdk.git",
28
+ "directory": "packages/heuristic-theme"
29
+ }
25
30
  }
@@ -14,11 +14,11 @@ export function createHeuristicThemeProductRow({ accountId, repositoryId = null
14
14
  status: "wired",
15
15
  repository_id: repositoryId,
16
16
  canonical_path: "packages/heuristic-theme",
17
- package_name: "@inneranimalmedia/heuristic-theme",
17
+ package_name: "@inneranimalmedia/theme-heuristic",
18
18
  metadata: {
19
19
  origin: "gallery_mount",
20
20
  normalization_state: "wired",
21
- package: "@inneranimalmedia/heuristic-theme",
21
+ package: "@inneranimalmedia/theme-heuristic",
22
22
  preview_kind: "live",
23
23
  capabilities: ["theme.storefront.shell"],
24
24
  app_manifest: null,
@@ -32,7 +32,7 @@ export function createStorefrontShellTheme() {
32
32
  { type: "footer", label: "Footer" },
33
33
  ],
34
34
  metadata: {
35
- package: "@inneranimalmedia/heuristic-theme",
35
+ package: "@inneranimalmedia/theme-heuristic",
36
36
  capability: "theme.storefront.shell",
37
37
  deterministic: true,
38
38
  demoSite: "demo",
@@ -10,7 +10,7 @@ test("createStorefrontShellTheme returns stable stock contract", () => {
10
10
  assert.ok(theme.surfaces.includes("cms.editor"));
11
11
  assert.ok(theme.slots.shell.includes("header"));
12
12
  assert.equal(theme.tokens["--color-accent"], "#1e6a6f");
13
- assert.equal(theme.metadata.package, "@inneranimalmedia/heuristic-theme");
13
+ assert.equal(theme.metadata.package, "@inneranimalmedia/theme-heuristic");
14
14
  assert.deepEqual(createStorefrontShellTheme(), theme);
15
15
  });
16
16
 
@@ -5,7 +5,7 @@
5
5
  "kind": "integration",
6
6
  "status": "extracted",
7
7
  "package": {
8
- "name": "@inneranimalmedia/agentsam-sdk-identity",
8
+ "name": "@inneranimalmedia/agentsam-identity",
9
9
  "version": "2.6.3",
10
10
  "directory": "packages/identity"
11
11
  },
@@ -5,7 +5,9 @@
5
5
  "providers": [
6
6
  {
7
7
  "id": "inneranimalmedia",
8
- "aliases": ["iam"],
8
+ "aliases": [
9
+ "iam"
10
+ ],
9
11
  "oauth_provider_key": "iam",
10
12
  "kind": "oidc",
11
13
  "status": "ready",
@@ -40,7 +42,9 @@
40
42
  },
41
43
  {
42
44
  "id": "google_desktop",
43
- "aliases": ["google-desktop"],
45
+ "aliases": [
46
+ "google-desktop"
47
+ ],
44
48
  "kind": "oauth",
45
49
  "status": "ready",
46
50
  "implementation": "src/providers/google",
@@ -52,10 +56,8 @@
52
56
  "required_configuration": [
53
57
  "GOOGLE_DESKTOP_CLIENT_ID"
54
58
  ],
55
- "optional_configuration": [
56
- "GOOGLE_DESKTOP_CLIENT_SECRET"
57
- ],
58
- "notes": "Desktop/public PKCE client (Console type Desktop app — no secret). Worker brokers POST /api/oauth/google/desktop-exchange for loopback redirects. Optional GOOGLE_DESKTOP_CLIENT_SECRET only if the client id was mis-typed as Web."
59
+ "optional_configuration": [],
60
+ "notes": "Desktop/public PKCE client (Console type Desktop app). Uses system browser + loopback redirect and no embedded client secret."
59
61
  },
60
62
  {
61
63
  "id": "github",
@@ -81,7 +83,7 @@
81
83
  "identity.oauth.authorize",
82
84
  "identity.profile.resolve"
83
85
  ],
84
- "notes": "Contract + authorize URL only — exchange not implemented."
86
+ "notes": "Contract + authorize URL only \u2014 exchange not implemented."
85
87
  },
86
88
  {
87
89
  "id": "email",
@@ -111,6 +113,24 @@
111
113
  "CLOUDFLARE_OAUTH_CLIENT_SECRET"
112
114
  ],
113
115
  "notes": "Cloudflare sign-in (same Worker secrets as the Cloudflare resource connector). Client secret optional for PKCE-only clients (Token Authentication Method = None)."
116
+ },
117
+ {
118
+ "id": "chatgpt",
119
+ "aliases": [
120
+ "openai",
121
+ "chatgpt-hosted"
122
+ ],
123
+ "kind": "hosted_headers",
124
+ "status": "ready",
125
+ "registered": true,
126
+ "implementation": "src/providers/chatgpt",
127
+ "capabilities": [
128
+ "identity.hosted.headers",
129
+ "identity.profile.resolve",
130
+ "cms.auth_host"
131
+ ],
132
+ "required_configuration": [],
133
+ "notes": "ChatGPT / OpenAI Apps SDK hosted identity. Reads oai-authenticated-* request headers and normalizes to NormalizedExternalIdentity (provider=chatgpt). Not classic OAuth client credentials — use createChatGptCmsAuthHost for /cms protection."
114
134
  }
115
135
  ]
116
136
  }
@@ -20,14 +20,14 @@ identity.login(request); // alpha: throws until Identity Service adapter is wi
20
20
  identity.session.fromRequest(request); // alpha: throws until adapter is wired
21
21
  ```
22
22
 
23
- **Alpha scope:** contracts, D1 adapter, Worker router, `agentsam identity init` scaffold (`app/frontend` + `backend` + migrations), and `agentsam identity preview`. Default OAuth: minted `IAM_CLIENT_ID` + `IAM_CLIENT_SECRET`. BYOK options: Google web, Google Desktop (`GOOGLE_DESKTOP_CLIENT_ID`), GitHub, Cloudflare (`CLOUDFLARE_OAUTH_CLIENT_*`). **Account SSOT:** `accounts` (not `account_identities` — that table is IdP linkage only).
23
+ **Alpha scope:** contracts, D1 adapter, Worker router, `agentsam identity init` scaffold (`app/frontend` + `backend` + migrations), and `agentsam identity preview`. Default OAuth: minted `IAM_CLIENT_ID` + `IAM_CLIENT_SECRET`. BYOK options: Google web, Google Desktop (`GOOGLE_DESKTOP_CLIENT_ID`), GitHub, Cloudflare (`CLOUDFLARE_OAUTH_CLIENT_*`). **Stock CMS sign-in picker:** Cloudflare · Google · Inner Animal Media · ChatGPT (`hosted_headers` via Apps SDK). **Account SSOT:** `accounts` (not `account_identities` — that table is IdP linkage only).
24
24
 
25
25
  ## Layout
26
26
 
27
27
  ```
28
28
  src/
29
29
  core/ identity · sessions · accounts · recovery
30
- providers/ google · github · gcp · email
30
+ providers/ google · github · gcp · email · iam · cloudflare · chatgpt
31
31
  oauth/ authorize/callback (extract from IAM — next sprint)
32
32
  adapters/ inneranimalmedia · cloudflare-d1
33
33
  contracts/
@@ -1,32 +1,35 @@
1
- # Identity schema mapping — portable ↔ Cloudflare D1
1
+ # Identity schema mapping — portable ↔ Cloudflare D1 (IAM compat)
2
2
 
3
3
  Portable SQLite (`packages/identity/migrations/sqlite/`) is the product schema.
4
- The D1 adapter maps existing hosted table names without requiring a big-bang rename.
4
+ The IAM-compat adapter maps existing hosted table names without requiring a big-bang rename.
5
5
 
6
- | Portable (SQLite) | Hosted D1 (current) | Notes |
6
+ | Portable (SQLite / portable D1) | Hosted D1 (IAM compat) | Notes |
7
7
  |---|---|---|
8
- | `identity_users` / account plane | **`accounts`** | **Account SSOT** — row of record |
9
- | login principal | `auth_users` | 1:1 with `accounts.id` in portable scaffold |
10
- | `identity_external_accounts` | `account_identities` | IdP linkage only (`account_id` → `accounts.id`) — never the account SSOT |
11
- | `identity_sessions` | `auth_sessions` | Same columns |
12
- | `identity_auth_events` | `auth_event_log` | Same columns |
13
- | `identity_oauth_transactions` | `identity_oauth_states` → migrate to `identity_oauth_transactions` | Requires `app_id NOT NULL`; no silent pre-app_id fallback |
14
- | `identity_provider_connections` | (new / connector tables) | `credential_ref` → vault/KMS; never store raw tokens in D1 rows |
8
+ | `identity_users` / account plane | **`accounts`** + `auth_users` | **Account SSOT** — row of record |
9
+ | `identity_external_accounts` | `account_identities` | IdP linkage only |
10
+ | `identity_sessions` (+ `type`) | `auth_sessions` (+ `type`) | browser / desktop |
11
+ | `identity_auth_events` | `auth_event_log` | Same semantics |
12
+ | `identity_oauth_transactions` (+ native cols) | `identity_oauth_states` | Requires `app_id NOT NULL`; native cols optional |
13
+ | `identity_native_handoffs` | `identity_native_handoffs` | Single-use desktop pickup |
14
+ | `identity_companies` | `company` | Branding / host resolution |
15
+ | `identity_provider_connections` | `identity_provider_connections` (or connector tables) | `credential_ref` only — never raw secrets |
15
16
  | `identity_app_registry` | cache of `agentsam.app.json` | Disk manifests remain SSOT |
16
17
  | `identity_route_registry` | projection cache | Disk manifests remain SSOT |
17
18
  | `identity_oauth_clients` … | optional `identity.oauth-server` pack | Only if product is an AS |
18
19
 
20
+ Password recovery is **not** a portable core table. It uses `createPasswordResetService` with an injected `{get,put,delete}` store. Optional `identity.recovery` pack may exist later.
21
+
19
22
  ## Schema version
20
23
 
21
- Both adapters read `identity_schema_meta.schema_version` (SQLite) or
22
- `PRAGMA`/meta row. Missing `app_id` on OAuth transactions is an
23
- `IdentitySchemaError('IDENTITY_SCHEMA_MIGRATION_REQUIRED')`, not a soft
24
- downgrade.
24
+ Portable adapters read `identity_schema_meta.schema_version`. Lane 1 requires version **2** (after `005_identity_company_native.sql`). Missing `app_id` on OAuth transactions is an `IdentitySchemaError`, not a soft downgrade.
25
25
 
26
26
  ## Packs
27
27
 
28
28
  | Pack | Apply when |
29
29
  |---|---|
30
- | `identity.core` | Always (local + hosted) |
30
+ | `identity.core` | Always (local + hosted portable) |
31
31
  | `identity.oauth-client` | Signing into external IdPs |
32
32
  | `identity.oauth-server` | Product issues its own codes/tokens |
33
+
34
+ Family manifest: `packages/identity/schema/agentsam.identity/manifest.json`
35
+ Generic contract: `protocol/database/agentsam.schema-pack.v1.schema.json`
@@ -0,0 +1,109 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const HERE = path.dirname(fileURLToPath(import.meta.url));
6
+
7
+ /** Package-owned portable SQL SSOT (resolves inside installed npm package). */
8
+ export const PORTABLE_IDENTITY_MIGRATIONS_DIR = path.resolve(HERE, 'sqlite');
9
+
10
+ /** @deprecated Prefer PORTABLE_IDENTITY_MIGRATIONS_DIR */
11
+ export const SQLITE_MIGRATIONS_DIR = PORTABLE_IDENTITY_MIGRATIONS_DIR;
12
+
13
+ export const IDENTITY_SCHEMA_PACK_MANIFEST_PATH = path.resolve(
14
+ HERE,
15
+ '../schema/agentsam.identity/manifest.json',
16
+ );
17
+
18
+ /**
19
+ * Resolve the agentsam.identity pack-family manifest from the installed package.
20
+ * @returns {{ manifest: object, manifestPath: string, sqlDir: string }}
21
+ */
22
+ export function resolveIdentitySchemaPack() {
23
+ const manifestPath = IDENTITY_SCHEMA_PACK_MANIFEST_PATH;
24
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
25
+ return {
26
+ manifest,
27
+ manifestPath,
28
+ sqlDir: PORTABLE_IDENTITY_MIGRATIONS_DIR,
29
+ };
30
+ }
31
+
32
+ function listPortableMigrationFiles(opts = {}) {
33
+ const files = [
34
+ '001_identity_core.sql',
35
+ '002_identity_oauth_client.sql',
36
+ '005_identity_company_native.sql',
37
+ ];
38
+ if (opts.includeOAuthServer) {
39
+ files.push('003_identity_oauth_server.sql');
40
+ files.push('004_identity_oauth_consent_catalog.sql');
41
+ }
42
+ return files;
43
+ }
44
+
45
+ function isIgnorableMigrationError(err) {
46
+ const msg = String(err?.message || err || '').toLowerCase();
47
+ return (
48
+ msg.includes('duplicate column')
49
+ || msg.includes('already exists')
50
+ || msg.includes('duplicate column name')
51
+ );
52
+ }
53
+
54
+ async function runSql(db, sql) {
55
+ if (typeof db.exec === 'function') {
56
+ try {
57
+ db.exec(sql);
58
+ return;
59
+ } catch (err) {
60
+ // Multi-statement exec may fail mid-file on duplicate ALTER; fall through to statements.
61
+ if (!isIgnorableMigrationError(err) && !/alter table/i.test(sql)) throw err;
62
+ }
63
+ }
64
+ const stripped = sql.replace(/\/\*[\s\S]*?\*\//g, '');
65
+ const statements = stripped
66
+ .split(';')
67
+ .map((s) => s.replace(/--[^\n]*/g, '').trim())
68
+ .filter(Boolean);
69
+ for (const statement of statements) {
70
+ try {
71
+ if (typeof db.exec === 'function' && !db.prepare) {
72
+ db.exec(statement);
73
+ } else {
74
+ await db.prepare(statement).run();
75
+ }
76
+ } catch (err) {
77
+ if (isIgnorableMigrationError(err)) continue;
78
+ throw err;
79
+ }
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Apply portable agentsam.identity SQL pack to a SQLite or D1-shaped target.
85
+ * Same SQL sources for both; executor differs by driver API.
86
+ *
87
+ * @param {{ prepare?: Function, exec?: Function }} target
88
+ * @param {{ includeOAuthServer?: boolean }} [opts]
89
+ */
90
+ export async function applyPortableIdentityMigrations(target, opts = {}) {
91
+ if (!target || (typeof target.exec !== 'function' && typeof target.prepare !== 'function')) {
92
+ throw new Error('applyPortableIdentityMigrations_requires_db_target');
93
+ }
94
+ const files = listPortableMigrationFiles(opts);
95
+ for (const file of files) {
96
+ const sqlPath = path.join(PORTABLE_IDENTITY_MIGRATIONS_DIR, file);
97
+ const sql = fs.readFileSync(sqlPath, 'utf8');
98
+ await runSql(target, sql);
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Stable compatibility alias — same portable pack, same sources.
104
+ * @param {{ prepare?: Function, exec?: Function }} db
105
+ * @param {{ includeOAuthServer?: boolean }} [opts]
106
+ */
107
+ export async function applySqliteIdentityMigrations(db, opts = {}) {
108
+ return applyPortableIdentityMigrations(db, opts);
109
+ }
@@ -1,5 +1,5 @@
1
1
  -- identity.oauth-server consent catalog.
2
- -- Issuer branding remains owned by the portable company table.
2
+ -- Issuer branding remains owned by portable identity_companies (identity.core).
3
3
 
4
4
  INSERT OR IGNORE INTO identity_schema_meta (key, value)
5
5
  VALUES ('pack_oauth_consent_catalog', '1');