@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
@@ -0,0 +1,18 @@
1
+ [package]
2
+ name = "{{PROJECT_NAME}}"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ crate-type = ["cdylib"]
8
+
9
+ [dependencies]
10
+ worker = "{{WORKER_VERSION}}"
11
+ serde = { version = "1.0", features = ["derive"] }
12
+ serde_json = "1.0"
13
+
14
+ [profile.release]
15
+ lto = true
16
+ strip = "debuginfo"
17
+ codegen-units = 1
18
+ opt-level = "s"
@@ -0,0 +1,17 @@
1
+ use serde_json::json;
2
+ use worker::*;
3
+
4
+ #[event(fetch)]
5
+ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
6
+ Router::new()
7
+ .get("/", |_req, _ctx| Response::ok("AgentSam Rust/Wasm Worker"))
8
+ .get("/health", |_req, _ctx| {
9
+ Response::from_json(&json!({
10
+ "status": "ok",
11
+ "runtime": "cloudflare-workers-rust-wasm",
12
+ "project": "{{PROJECT_NAME}}"
13
+ }))
14
+ })
15
+ .run(req, env)
16
+ .await
17
+ }
@@ -0,0 +1,22 @@
1
+ # {{PROJECT_NAME}}
2
+
3
+ AgentSam Rapid Rust template: `{{TEMPLATE}}`.
4
+
5
+ ## Local first
6
+
7
+ ```bash
8
+ npm install
9
+ agentsam rust doctor --bootstrap
10
+ agentsam rust check
11
+ agentsam rust build
12
+ agentsam rust dev
13
+ ```
14
+
15
+ ## Explicit cloud graduation
16
+
17
+ ```bash
18
+ agentsam rust deploy --dry-run
19
+ agentsam rust deploy --yes
20
+ ```
21
+
22
+ No scaffold/build/check command deploys this Worker.
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "{{PROJECT_NAME}}-worker",
3
+ "private": true,
4
+ "scripts": {
5
+ "dev": "wrangler dev",
6
+ "deploy": "wrangler deploy",
7
+ "deploy:dry": "wrangler deploy --dry-run"
8
+ },
9
+ "devDependencies": {
10
+ "wrangler": "{{WRANGLER_VERSION}}"
11
+ }
12
+ }
@@ -0,0 +1,6 @@
1
+ name = "{{PROJECT_NAME}}"
2
+ main = "build/index.js"
3
+ compatibility_date = "{{COMPATIBILITY_DATE}}"
4
+
5
+ [build]
6
+ command = "worker-build --release"
@@ -0,0 +1,21 @@
1
+ [package]
2
+ name = "{{PROJECT_NAME}}"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ crate-type = ["cdylib"]
8
+
9
+ [dependencies]
10
+ worker = "{{WORKER_VERSION}}"
11
+ serde = { version = "1.0", features = ["derive"] }
12
+ serde_json = "1.0"
13
+ hmac = "0.12"
14
+ sha2 = "0.10"
15
+ hex = "0.4"
16
+
17
+ [profile.release]
18
+ lto = true
19
+ strip = "debuginfo"
20
+ codegen-units = 1
21
+ opt-level = "s"
@@ -0,0 +1,32 @@
1
+ use hmac::{Hmac, Mac};
2
+ use sha2::Sha256;
3
+ use worker::*;
4
+
5
+ type HmacSha256 = Hmac<Sha256>;
6
+
7
+ #[event(fetch)]
8
+ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
9
+ Router::new()
10
+ .post_async("/verify-signature", |mut req, ctx| async move {
11
+ let secret = ctx.secret("API_SECRET")?.to_string();
12
+ let provided = match req.headers().get("X-Signature")? {
13
+ Some(value) => value,
14
+ None => return Response::error("missing X-Signature", 401),
15
+ };
16
+ let provided = match hex::decode(provided.trim()) {
17
+ Ok(value) => value,
18
+ Err(_) => return Response::error("invalid signature encoding", 400),
19
+ };
20
+ let payload = req.bytes().await?;
21
+ let mut mac = HmacSha256::new_from_slice(secret.as_bytes())
22
+ .map_err(|_| Error::RustError("invalid HMAC key".into()))?;
23
+ mac.update(&payload);
24
+ if mac.verify_slice(&provided).is_ok() {
25
+ Response::ok("signature valid")
26
+ } else {
27
+ Response::error("invalid signature", 403)
28
+ }
29
+ })
30
+ .run(req, env)
31
+ .await
32
+ }
@@ -0,0 +1,18 @@
1
+ [package]
2
+ name = "{{PROJECT_NAME}}"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ crate-type = ["cdylib"]
8
+
9
+ [dependencies]
10
+ worker = "{{WORKER_VERSION}}"
11
+ serde = { version = "1.0", features = ["derive"] }
12
+ serde_json = "1.0"
13
+
14
+ [profile.release]
15
+ lto = true
16
+ strip = "debuginfo"
17
+ codegen-units = 1
18
+ opt-level = "s"
@@ -0,0 +1,41 @@
1
+ use serde::{Deserialize, Serialize};
2
+ use worker::*;
3
+
4
+ #[derive(Debug, Deserialize, Serialize)]
5
+ struct BatchInput {
6
+ items: Vec<RawItem>,
7
+ }
8
+
9
+ #[derive(Debug, Deserialize, Serialize)]
10
+ struct RawItem {
11
+ id: u64,
12
+ value: f64,
13
+ }
14
+
15
+ #[derive(Serialize)]
16
+ struct BatchResult {
17
+ processed_count: usize,
18
+ total_sum: f64,
19
+ average: f64,
20
+ }
21
+
22
+ #[event(fetch)]
23
+ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
24
+ Router::new()
25
+ .post_async("/process", |mut req, _ctx| async move {
26
+ let data: BatchInput = match req.json().await {
27
+ Ok(value) => value,
28
+ Err(_) => return Response::error("invalid JSON payload", 400),
29
+ };
30
+ let count = data.items.len();
31
+ let sum: f64 = data.items.iter().map(|item| item.value).sum();
32
+ let average = if count == 0 { 0.0 } else { sum / count as f64 };
33
+ Response::from_json(&BatchResult {
34
+ processed_count: count,
35
+ total_sum: sum,
36
+ average,
37
+ })
38
+ })
39
+ .run(req, env)
40
+ .await
41
+ }
@@ -0,0 +1,9 @@
1
+ [workspace]
2
+ members = ["core", "worker"]
3
+ resolver = "2"
4
+
5
+ [profile.release]
6
+ lto = true
7
+ strip = "debuginfo"
8
+ codegen-units = 1
9
+ opt-level = "s"
@@ -0,0 +1,7 @@
1
+ [package]
2
+ name = "{{PROJECT_NAME}}-core"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ crate-type = ["rlib"]
@@ -0,0 +1,23 @@
1
+ /// Pure Rust domain logic: no Cloudflare, browser, or Tauri dependency.
2
+ pub fn normalize_resource_key(input: &str) -> String {
3
+ input
4
+ .trim()
5
+ .to_ascii_lowercase()
6
+ .chars()
7
+ .map(|ch| if ch.is_ascii_alphanumeric() { ch } else { '-' })
8
+ .collect::<String>()
9
+ .split('-')
10
+ .filter(|part| !part.is_empty())
11
+ .collect::<Vec<_>>()
12
+ .join("-")
13
+ }
14
+
15
+ #[cfg(test)]
16
+ mod tests {
17
+ use super::*;
18
+
19
+ #[test]
20
+ fn normalizes_keys_deterministically() {
21
+ assert_eq!(normalize_resource_key(" Hello / World "), "hello-world");
22
+ }
23
+ }
@@ -0,0 +1,12 @@
1
+ [package]
2
+ name = "{{PROJECT_NAME}}-worker"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+
6
+ [lib]
7
+ crate-type = ["cdylib"]
8
+
9
+ [dependencies]
10
+ shared_core = { package = "{{PROJECT_NAME}}-core", path = "../core" }
11
+ worker = "{{WORKER_VERSION}}"
12
+ serde_json = "1.0"
@@ -0,0 +1,16 @@
1
+ use serde_json::json;
2
+ use worker::*;
3
+
4
+ #[event(fetch)]
5
+ pub async fn main(req: Request, env: Env, _ctx: Context) -> Result<Response> {
6
+ Router::new()
7
+ .get("/normalize/:value", |_req, ctx| {
8
+ let value = ctx.param("value").map(String::as_str).unwrap_or("");
9
+ Response::from_json(&json!({
10
+ "input": value,
11
+ "normalized": shared_core::normalize_resource_key(value)
12
+ }))
13
+ })
14
+ .run(req, env)
15
+ .await
16
+ }
@@ -0,0 +1,6 @@
1
+ name = "{{PROJECT_NAME}}"
2
+ main = "worker/build/index.js"
3
+ compatibility_date = "{{COMPATIBILITY_DATE}}"
4
+
5
+ [build]
6
+ command = "cd worker && worker-build --release"
@@ -1,4 +1,5 @@
1
1
  export { resolveGitContext, tryResolveGitContext, normalizeGitRemote } from './git-context.js';
2
+ export * from './source-types.js';
2
3
  export * from './contracts.js';
3
4
  export * from './merkle/index.js';
4
5
  export * from './work-tracking.js';
@@ -3,16 +3,9 @@ import path from 'node:path';
3
3
  import ts from 'typescript';
4
4
  import { comparePaths, fileHasher } from './hash.js';
5
5
  import { FILEMETA_FORMAT, FILEMETA_VERSION, metadataRoot } from './filemeta.js';
6
+ import { isAstSourceExtension, sourceLanguageIdForExtension } from '../source-types.js';
6
7
  const MAX_AST_BYTES = 2 * 1024 * 1024;
7
8
 
8
- const LANGUAGE_BY_EXTENSION = Object.freeze({
9
- '.c': 'c', '.cc': 'cpp', '.cpp': 'cpp', '.cxx': 'cpp', '.css': 'css', '.go': 'go',
10
- '.h': 'c', '.hpp': 'cpp', '.html': 'html', '.java': 'java', '.js': 'javascript',
11
- '.jsx': 'javascript', '.json': 'json', '.md': 'markdown', '.mjs': 'javascript',
12
- '.cjs': 'javascript', '.py': 'python', '.rs': 'rust', '.scss': 'scss', '.sql': 'sql',
13
- '.ts': 'typescript', '.tsx': 'typescript', '.yaml': 'yaml', '.yml': 'yaml',
14
- });
15
- const AST_EXTENSIONS = new Set(['.js', '.jsx', '.mjs', '.cjs', '.ts', '.tsx']);
16
9
  const ASSET_EXTENSIONS = new Set([
17
10
  '.avif', '.eot', '.gif', '.ico', '.jpeg', '.jpg', '.mp3', '.mp4', '.ogg', '.otf', '.pdf',
18
11
  '.png', '.svg', '.ttf', '.wav', '.webm', '.webp', '.woff', '.woff2',
@@ -305,7 +298,7 @@ export async function buildSemanticMetadata(rootPath, tree) {
305
298
  const pkg = nearestPackage(contentEntry.path, packages);
306
299
  const localPath = pkg?.root && contentEntry.path.startsWith(pkg.root + '/') ? contentEntry.path.slice(pkg.root.length + 1) : contentEntry.path;
307
300
  const ext = extensionOf(contentEntry.path);
308
- const language = LANGUAGE_BY_EXTENSION[ext] || null;
301
+ const language = sourceLanguageIdForExtension(ext);
309
302
  const layer = inferLayer(contentEntry.path, pkg?.root || '');
310
303
  const kind = contentEntry.type === 'symlink' ? 'symlink' : inferKind(contentEntry.path, language);
311
304
  const structuralSystem = (contentEntry.path.startsWith('packages/') || contentEntry.path.startsWith('apps/')) ? contentEntry.path.split('/')[1] : null;
@@ -314,7 +307,7 @@ export async function buildSemanticMetadata(rootPath, tree) {
314
307
  const tags = new Set([...(Array.isArray(pkg?.agentsam?.tags) ? pkg.agentsam.tags : []), ...(explicit.tags || [])].filter((tag) => typeof tag === 'string' && tag));
315
308
  let mode = contentEntry.mode;
316
309
  let sourceBuffer = null;
317
- if (contentEntry.type === 'file' && AST_EXTENSIONS.has(ext) && contentEntry.size <= MAX_AST_BYTES) {
310
+ if (contentEntry.type === 'file' && isAstSourceExtension(ext) && contentEntry.size <= MAX_AST_BYTES) {
318
311
  const verified = await readVerifiedFile(rootPath, contentEntry);
319
312
  if (mode != null && verified.mode !== mode) throw new Error(`File mode changed while building semantic metadata: ${contentEntry.path}`);
320
313
  mode = verified.mode;
@@ -0,0 +1,85 @@
1
+ import path from 'node:path';
2
+
3
+ const DEFINITIONS = [
4
+ { id: 'javascript', label: 'JavaScript', kind: 'code', extensions: ['.js', '.mjs', '.cjs', '.jsx'], knowledge: true, ast: true },
5
+ { id: 'typescript', label: 'TypeScript', kind: 'code', extensions: ['.ts', '.tsx'], knowledge: true, ast: true },
6
+ { id: 'rust', label: 'Rust', kind: 'code', extensions: ['.rs'], knowledge: true },
7
+ { id: 'python', label: 'Python', kind: 'code', extensions: ['.py'], knowledge: true },
8
+ { id: 'go', label: 'Go', kind: 'code', extensions: ['.go'], knowledge: true },
9
+ { id: 'java', label: 'Java', kind: 'code', extensions: ['.java'] },
10
+ { id: 'kotlin', label: 'Kotlin', kind: 'code', extensions: ['.kt'] },
11
+ { id: 'swift', label: 'Swift', kind: 'code', extensions: ['.swift'] },
12
+ { id: 'c', label: 'C', kind: 'code', extensions: ['.c', '.h'] },
13
+ { id: 'cpp', label: 'C++', kind: 'code', extensions: ['.cc', '.cpp', '.cxx', '.hpp'] },
14
+ { id: 'csharp', label: 'C#', kind: 'code', extensions: ['.cs'] },
15
+ { id: 'ruby', label: 'Ruby', kind: 'code', extensions: ['.rb'] },
16
+ { id: 'php', label: 'PHP', kind: 'code', extensions: ['.php'] },
17
+ { id: 'sql', label: 'SQL', kind: 'code', extensions: ['.sql'], knowledge: true },
18
+ { id: 'shell', label: 'Shell', kind: 'code', extensions: ['.sh', '.bash', '.zsh'] },
19
+ { id: 'yaml', label: 'YAML', kind: 'code', extensions: ['.yaml', '.yml'] },
20
+ { id: 'toml', label: 'TOML', kind: 'code', extensions: ['.toml'] },
21
+ { id: 'vue', label: 'Vue', kind: 'code', extensions: ['.vue'] },
22
+ { id: 'svelte', label: 'Svelte', kind: 'code', extensions: ['.svelte'] },
23
+ { id: 'markdown', label: 'Markdown', kind: 'document', extensions: ['.md', '.mdx'], knowledge: true },
24
+ { id: 'json', label: 'JSON', kind: 'document', extensions: ['.json'], knowledge: true },
25
+ { id: 'html', label: 'HTML', kind: 'document', extensions: ['.html', '.htm'] },
26
+ { id: 'css', label: 'CSS', kind: 'document', extensions: ['.css', '.scss'] },
27
+ { id: 'text', label: 'Text', kind: 'document', extensions: ['.txt'] },
28
+ { id: 'xml', label: 'XML', kind: 'document', extensions: ['.xml'] },
29
+ { id: 'csv', label: 'CSV', kind: 'document', extensions: ['.csv'] },
30
+ ];
31
+
32
+ export const SOURCE_TYPES = Object.freeze(
33
+ DEFINITIONS.map((definition) => Object.freeze({
34
+ ...definition,
35
+ extensions: Object.freeze([...definition.extensions]),
36
+ })),
37
+ );
38
+
39
+ const BY_EXTENSION = new Map(
40
+ SOURCE_TYPES.flatMap((definition) => definition.extensions.map((extension) => [extension, definition])),
41
+ );
42
+
43
+ export function normalizeSourceExtension(value) {
44
+ const raw = String(value || '').trim().toLowerCase();
45
+ if (!raw) return '';
46
+ return raw.startsWith('.') ? raw : '.' + raw;
47
+ }
48
+
49
+ export function sourceTypeForExtension(value) {
50
+ return BY_EXTENSION.get(normalizeSourceExtension(value)) || null;
51
+ }
52
+
53
+ export function sourceTypeForPath(filePath) {
54
+ const lower = String(filePath || '').toLowerCase();
55
+ if (lower.endsWith('.d.ts')) return sourceTypeForExtension('.ts');
56
+ return sourceTypeForExtension(path.posix.extname(lower));
57
+ }
58
+
59
+ export function sourceLanguageForExtension(value) {
60
+ return sourceTypeForExtension(value)?.label || null;
61
+ }
62
+
63
+ export function sourceLanguageIdForExtension(value) {
64
+ return sourceTypeForExtension(value)?.id || null;
65
+ }
66
+
67
+ export function isCodeSourceExtension(value) {
68
+ return sourceTypeForExtension(value)?.kind === 'code';
69
+ }
70
+
71
+ export function isDocumentSourceExtension(value) {
72
+ return sourceTypeForExtension(value)?.kind === 'document';
73
+ }
74
+
75
+ export function isKnowledgeSourceExtension(value) {
76
+ return sourceTypeForExtension(value)?.knowledge === true;
77
+ }
78
+
79
+ export function isKnowledgeSourcePath(filePath) {
80
+ return sourceTypeForPath(filePath)?.knowledge === true;
81
+ }
82
+
83
+ export function isAstSourceExtension(value) {
84
+ return sourceTypeForExtension(value)?.ast === true;
85
+ }
@@ -0,0 +1,96 @@
1
+ # AgentSam Credential System
2
+
3
+ ## Answers (current Worker)
4
+
5
+ ### How does `/api/vault/*` work?
6
+
7
+ ```
8
+ Browser /settings/keys
9
+ │
10
+ ▼
11
+ POST /api/vault/secrets { service_name, value }
12
+ │
13
+ ▼
14
+ AES-256-GCM encrypt with VAULT_MASTER_KEY
15
+ AAD = userId:service:name
16
+ │
17
+ ▼
18
+ D1 user_secrets (ciphertext + metadata + last4)
19
+ │
20
+ GET list → metadata only (never plaintext)
21
+ POST unwrap → service lane only (bridge / internal)
22
+ ```
23
+
24
+ Auth lanes on the vault Worker:
25
+
26
+ | Lane | Header / cookie | Use |
27
+ |---|---|---|
28
+ | Browser session | identity session cookie | user manages own BYOK keys |
29
+ | Bridge | `AGENTSAM_BRIDGE_KEY` | machine unwrap / inventory |
30
+
31
+ ## VAULT_MASTER_KEY format
32
+
33
+ Required:
34
+
35
+ ```
36
+ v1.<base64 of exactly 32 bytes>
37
+ ```
38
+
39
+ Generate / rotate:
40
+
41
+ ```bash
42
+ node -e "import('node:crypto').then(({randomBytes})=>console.log('v1.'+randomBytes(32).toString('base64')))" \
43
+ | npx wrangler secret put VAULT_MASTER_KEY -c apps/local-studio/backend/wrangler.jsonc
44
+ ```
45
+
46
+ Or: `node apps/local-studio/scripts/ensure-vault-secret.mjs` (mints `v1.` when missing; does **not** rotate an existing secret).
47
+
48
+ Arbitrary strings are **rejected** (no silent truncate/hash).
49
+
50
+ ### App-owned keys (no cross-app coupling)
51
+
52
+ Each Worker owns its own `VAULT_MASTER_KEY`. Rotating Local Studio (`agentsam-sdk` Worker via `apps/local-studio/backend/wrangler.jsonc`) has **zero** effect on Inner Animal Media’s Worker secret of the same name, and vice versa. Never copy a vault master key between apps.
53
+
54
+ ### After rotation — BYOK re-save
55
+
56
+ Existing `user_secrets` ciphertext encrypted under the previous master key will not decrypt. There is no safe server-side re-encrypt without plaintext.
57
+
58
+ Operational plan:
59
+
60
+ 1. Rotate `VAULT_MASTER_KEY` on the target Worker only (pipe into `wrangler secret put`; never log/print the value).
61
+ 2. Deploy that Worker so runtime imports the new `v1.` key.
62
+ 3. In Local Studio → **Settings → Keys**, delete orphaned provider rows (or they will fail on unwrap), then re-enter each BYOK value and save. New ciphertext is sealed under the new key.
63
+ 4. Do **not** bulk-wipe shared D1 `user_secrets` unless you intend to invalidate every consumer of that table — scope cleanup to the users/services you manage in this app.
64
+
65
+ ### Where is `AGENTSAM_API_KEY` minted / used?
66
+
67
+ | Concern | Detail |
68
+ |---|---|
69
+ | Format | `aak_*` |
70
+ | Store | IAM D1 `agentsam_api_credentials` (**hash only**) |
71
+ | Verify | `resolveAgentsamApiCredential` on inneranimalmedia |
72
+ | Consume | `Authorization: Bearer aak_…` in SDK/CLI for remote control-plane |
73
+ | Env | Customer sets `AGENTSAM_API_KEY` in wrangler/env — **compatibility adapter**, not primary UX |
74
+ | Not | Browser OAuth session, bridge key, or vault ciphertext |
75
+
76
+ Mint path: account credential rows are verified today; product mint UI belongs on `/settings/keys` under kind `agentsam_api_key` (registry already defines the provider). Hash insert against `agentsam_api_credentials` is the IAM-side write still to productize.
77
+
78
+ ## New packages (this change)
79
+
80
+ ```
81
+ packages/agentsam-vault/ contracts, AES-GCM, provider registry, resolver
82
+ packages/agentsam-key-manager/ SensitiveInput, KeysPage, IntegrationsPage
83
+ ```
84
+
85
+ Local Studio `/settings/keys` and `/settings/integrations` now consume key-manager; vault API remains the hosted backend.
86
+
87
+ ## Authority split (from your CF dashboard)
88
+
89
+ | Secret / var | Role |
90
+ |---|---|
91
+ | `VAULT_MASTER_KEY` | Encrypt user_secrets |
92
+ | `AGENTSAM_BRIDGE_KEY` | Machine service auth |
93
+ | `IAM_CLIENT_ID` / `IAM_CLIENT_SECRET` | Hosted OAuth confidential client |
94
+ | `CLOUDFLARE_OAUTH_CLIENT_ID` (+ optional secret) | CF OAuth (PKCE-only OK without secret) |
95
+ | `OPENAI_API_KEY` etc. | Env fallback until vault wins |
96
+ | `AGENTSAM_API_KEY` | Delegated `aak_*` for customers' Workers |
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@inneranimalmedia/agentsam-vault",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "AgentSam credential vault core \u2014 contracts, AES-GCM crypto, provider registry, resolver. UI lives in agentsam-key-manager.",
7
+ "main": "./src/index.js",
8
+ "types": "./src/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/index.d.ts",
12
+ "default": "./src/index.js"
13
+ },
14
+ "./contracts": {
15
+ "types": "./src/contracts/credential.d.ts",
16
+ "default": "./src/contracts/credential.js"
17
+ },
18
+ "./providers": "./src/providers/registry.js",
19
+ "./crypto": {
20
+ "types": "./src/crypto/aes-gcm.d.ts",
21
+ "default": "./src/crypto/aes-gcm.js"
22
+ },
23
+ "./resolver": "./src/runtime/resolver.js",
24
+ "./oauth": "./src/crypto/oauth-envelope.js"
25
+ },
26
+ "scripts": {
27
+ "test": "node --test tests/*.test.mjs"
28
+ },
29
+ "engines": {
30
+ "node": ">=20"
31
+ }
32
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Portable AgentSam credential / vault contracts (types).
3
+ * Secrets never live on CredentialRecord — only credential_ref.
4
+ */
5
+
6
+ export type CredentialOwnerType = "user" | "account" | "app";
7
+ export type CredentialKind =
8
+ | "provider_api_key"
9
+ | "oauth_connection"
10
+ | "agentsam_api_key"
11
+ | "app_secret";
12
+ export type CredentialStatus = "active" | "expired" | "revoked" | "invalid";
13
+
14
+ export interface CredentialRecord {
15
+ id: string;
16
+ owner_type: CredentialOwnerType;
17
+ owner_id: string;
18
+ kind: CredentialKind;
19
+ provider?: string;
20
+ label: string;
21
+ credential_ref: string;
22
+ status: CredentialStatus;
23
+ capabilities?: string[];
24
+ granted_scopes?: string[];
25
+ expires_at?: string | null;
26
+ validated_at?: string | null;
27
+ last_used_at?: string | null;
28
+ rotated_at?: string | null;
29
+ last4?: string;
30
+ created_at: string;
31
+ updated_at: string;
32
+ }
33
+
34
+ export interface CredentialProviderField {
35
+ id: string;
36
+ type: "secret" | "text" | "url";
37
+ required?: boolean;
38
+ label?: string;
39
+ }
40
+
41
+ export interface CredentialProviderDefinition {
42
+ id: string;
43
+ label: string;
44
+ credential: { kind: CredentialKind; sensitive?: boolean };
45
+ fields: CredentialProviderField[];
46
+ capabilities?: string[];
47
+ operations?: { test?: boolean; rotate?: boolean; revoke?: boolean };
48
+ }
49
+
50
+ export declare const CREDENTIAL_KINDS: Readonly<{
51
+ PROVIDER_API_KEY: "provider_api_key";
52
+ OAUTH_CONNECTION: "oauth_connection";
53
+ AGENTSAM_API_KEY: "agentsam_api_key";
54
+ APP_SECRET: "app_secret";
55
+ }>;
56
+
57
+ export declare const CREDENTIAL_STATUSES: Readonly<{
58
+ ACTIVE: "active";
59
+ EXPIRED: "expired";
60
+ REVOKED: "revoked";
61
+ INVALID: "invalid";
62
+ }>;
63
+
64
+ export declare const CREDENTIAL_AUTHORITY: Readonly<{
65
+ vaultMasterKey: "VAULT_MASTER_KEY";
66
+ agentsamApiKey: "AGENTSAM_API_KEY";
67
+ agentsamApiKeyPrefix: "aak_";
68
+ agentsamApiKeyStore: "agentsam_api_credentials";
69
+ bridgeKey: "AGENTSAM_BRIDGE_KEY";
70
+ }>;
71
+
72
+ export function normalizeCredentialRecord(
73
+ input: Partial<CredentialRecord> & Record<string, unknown>,
74
+ ): CredentialRecord;
75
+
76
+ export function defineCredentialProvider(
77
+ def: CredentialProviderDefinition,
78
+ ): CredentialProviderDefinition;