@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
package/src/mcp/client.js CHANGED
@@ -1,5 +1,22 @@
1
+ /**
2
+ * MCP JSON-RPC client for AgentSam CLI (ping / tools/list / tools/call).
3
+ *
4
+ * Prefers Streamable HTTP (current MCP remote transport), falls back to SSE.
5
+ * Does not invent connection presets — callers pass a concrete serverConfig.
6
+ */
1
7
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
8
  import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
9
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
10
+ import { createRequire } from 'node:module';
11
+
12
+ const require = createRequire(import.meta.url);
13
+ const PKG_VERSION = (() => {
14
+ try {
15
+ return require('../../package.json').version || '0.0.0';
16
+ } catch {
17
+ return '0.0.0';
18
+ }
19
+ })();
3
20
 
4
21
  function clean(value) {
5
22
  return value == null ? '' : String(value).trim();
@@ -7,57 +24,121 @@ function clean(value) {
7
24
 
8
25
  export function buildHeaders(serverConfig = {}) {
9
26
  const headers = {
10
- 'Accept': 'application/json, text/event-stream',
11
- 'User-Agent': 'AgentSam-SDK/2.6.3 (MCP Client)',
27
+ Accept: 'application/json, text/event-stream',
28
+ 'User-Agent': `AgentSam-SDK/${PKG_VERSION} (MCP Client)`,
12
29
  };
13
30
  const token = clean(serverConfig.auth?.token);
14
31
  if (token) {
15
- headers['Authorization'] = `Bearer ${token}`;
32
+ headers.Authorization = `Bearer ${token}`;
16
33
  }
17
34
  return headers;
18
35
  }
19
36
 
37
+ /**
38
+ * @template T
39
+ * @param {object} serverConfig
40
+ * @param {(client: import('@modelcontextprotocol/sdk/client/index.js').Client, transport: string) => Promise<T>} fn
41
+ * @param {{ timeoutMs?: number }} [options]
42
+ * @returns {Promise<{ ok: true, value: T, transport: string } | { ok: false, error: string, transport?: string }>}
43
+ */
44
+ export async function withMcpClient(serverConfig, fn, options = {}) {
45
+ const url = clean(serverConfig.url);
46
+ if (!url) return { ok: false, error: 'missing_mcp_server_url' };
47
+
48
+ const headers = buildHeaders(serverConfig);
49
+ const requestInit = { headers };
50
+ const errors = [];
51
+
52
+ const tryTransport = async (label, createTransport) => {
53
+ const transport = createTransport();
54
+ const client = new Client(
55
+ { name: 'agentsam-sdk', version: PKG_VERSION },
56
+ { capabilities: {} },
57
+ );
58
+ const timer = setTimeout(() => {
59
+ try { transport.close?.(); } catch { /* ignore */ }
60
+ }, options.timeoutMs || 15000);
61
+ try {
62
+ await client.connect(transport);
63
+ const value = await fn(client, label);
64
+ return { ok: true, value, transport: label };
65
+ } finally {
66
+ clearTimeout(timer);
67
+ try { await transport.close?.(); } catch { /* ignore */ }
68
+ }
69
+ };
70
+
71
+ try {
72
+ return await tryTransport(
73
+ 'streamable_http',
74
+ () => new StreamableHTTPClientTransport(new URL(url), { requestInit }),
75
+ );
76
+ } catch (err) {
77
+ errors.push(`streamable_http:${err?.message || err}`);
78
+ }
79
+
80
+ try {
81
+ return await tryTransport(
82
+ 'sse',
83
+ () => new SSEClientTransport(new URL(url), { requestInit }),
84
+ );
85
+ } catch (err) {
86
+ errors.push(`sse:${err?.message || err}`);
87
+ }
88
+
89
+ return { ok: false, error: errors.join(' | ') || 'mcp_connect_failed' };
90
+ }
91
+
20
92
  export async function pingMcpServer(serverConfig = {}, options = {}) {
21
93
  const url = clean(serverConfig.url);
22
94
  if (!url) throw new Error('missing_mcp_server_url');
23
95
 
24
96
  const startMs = Date.now();
25
- const headers = buildHeaders(serverConfig);
26
- const timeoutMs = options.timeoutMs || 5000;
97
+ const connected = await withMcpClient(
98
+ serverConfig,
99
+ async (client) => {
100
+ // listTools is a cheap post-initialize probe across CF portals
101
+ const tools = await client.listTools().catch(() => ({ tools: [] }));
102
+ return { toolCount: tools?.tools?.length ?? 0 };
103
+ },
104
+ { timeoutMs: options.timeoutMs || 8000 },
105
+ );
106
+
107
+ const latencyMs = Date.now() - startMs;
108
+ if (connected.ok) {
109
+ return {
110
+ ok: true,
111
+ status: 200,
112
+ statusText: 'connected',
113
+ latencyMs,
114
+ url,
115
+ transport: connected.transport,
116
+ toolCount: connected.value?.toolCount ?? null,
117
+ };
118
+ }
27
119
 
120
+ // Last-resort HTTP reachability (does not prove MCP session)
28
121
  try {
29
- const controller = new AbortController();
30
- const timer = setTimeout(() => controller.abort(), timeoutMs);
31
-
32
- // First attempt an HTTP OPTIONS or GET / health ping
122
+ const headers = buildHeaders(serverConfig);
33
123
  const res = await fetch(url, {
34
- method: 'GET',
35
- headers,
36
- signal: controller.signal,
37
- }).catch(async () => {
38
- // If GET returns 405/404, try POST with JSON-RPC ping
39
- return await fetch(url, {
40
- method: 'POST',
41
- headers: { ...headers, 'Content-Type': 'application/json' },
42
- body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'ping' }),
43
- signal: controller.signal,
44
- });
124
+ method: 'POST',
125
+ headers: { ...headers, 'Content-Type': 'application/json' },
126
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'ping' }),
127
+ signal: AbortSignal.timeout(options.timeoutMs || 5000),
45
128
  });
46
-
47
- clearTimeout(timer);
48
- const latencyMs = Date.now() - startMs;
49
-
50
129
  return {
51
130
  ok: res.status < 500,
52
131
  status: res.status,
53
132
  statusText: res.statusText,
54
- latencyMs,
133
+ latencyMs: Date.now() - startMs,
55
134
  url,
135
+ transport: 'http_jsonrpc_ping',
136
+ warning: connected.error,
56
137
  };
57
138
  } catch (err) {
58
139
  return {
59
140
  ok: false,
60
- error: err.name === 'AbortError' ? 'timeout' : err.message,
141
+ error: connected.error || (err.name === 'TimeoutError' || err.name === 'AbortError' ? 'timeout' : err.message),
61
142
  latencyMs: Date.now() - startMs,
62
143
  url,
63
144
  };
@@ -65,108 +146,47 @@ export async function pingMcpServer(serverConfig = {}, options = {}) {
65
146
  }
66
147
 
67
148
  export async function listMcpTools(serverConfig = {}, options = {}) {
68
- const url = clean(serverConfig.url);
69
- if (!url) throw new Error('missing_mcp_server_url');
70
-
71
- const headers = buildHeaders(serverConfig);
72
-
73
- // Try standard JSON-RPC tools/list via POST first (fastest across Cloudflare Workers)
74
- try {
75
- const res = await fetch(url, {
76
- method: 'POST',
77
- headers: { ...headers, 'Content-Type': 'application/json' },
78
- body: JSON.stringify({
79
- jsonrpc: '2.0',
80
- id: 'tools-list-1',
81
- method: 'tools/list',
82
- params: {},
83
- }),
84
- signal: AbortSignal.timeout(options.timeoutMs || 8000),
85
- });
86
-
87
- if (res.ok) {
88
- const data = await res.json();
89
- if (data?.result?.tools && Array.isArray(data.result.tools)) {
90
- return {
91
- tools: data.result.tools,
92
- count: data.result.tools.length,
93
- transport: 'http_jsonrpc',
94
- };
95
- }
96
- }
97
- } catch {
98
- // Fall back to SSE transport below
99
- }
100
-
101
- // Fallback to SSE transport via @modelcontextprotocol/sdk
102
- try {
103
- const transport = new SSEClientTransport(new URL(url), {
104
- requestInit: { headers },
105
- });
106
- const client = new Client({ name: 'agentsam-sdk', version: '2.6.3' }, { capabilities: {} });
107
- await client.connect(transport);
108
- const toolsResult = await client.listTools();
109
- await transport.close();
110
-
149
+ const connected = await withMcpClient(
150
+ serverConfig,
151
+ async (client) => client.listTools(),
152
+ { timeoutMs: options.timeoutMs || 12000 },
153
+ );
154
+
155
+ if (connected.ok) {
156
+ const tools = connected.value?.tools || [];
111
157
  return {
112
- tools: toolsResult.tools || [],
113
- count: toolsResult.tools?.length || 0,
114
- transport: 'sse_sdk',
115
- };
116
- } catch (err) {
117
- return {
118
- tools: [],
119
- count: 0,
120
- error: err.message,
158
+ tools,
159
+ count: tools.length,
160
+ transport: connected.transport,
121
161
  };
122
162
  }
163
+
164
+ return {
165
+ tools: [],
166
+ count: 0,
167
+ error: connected.error,
168
+ };
123
169
  }
124
170
 
125
171
  export async function callMcpTool(serverConfig = {}, toolName, args = {}, options = {}) {
126
- const url = clean(serverConfig.url);
127
- if (!url) throw new Error('missing_mcp_server_url');
128
-
129
172
  const startMs = Date.now();
130
- const headers = buildHeaders(serverConfig);
131
-
132
- try {
133
- const res = await fetch(url, {
134
- method: 'POST',
135
- headers: { ...headers, 'Content-Type': 'application/json' },
136
- body: JSON.stringify({
137
- jsonrpc: '2.0',
138
- id: `call-${Date.now()}`,
139
- method: 'tools/call',
140
- params: {
141
- name: toolName,
142
- arguments: args,
143
- },
144
- }),
145
- signal: AbortSignal.timeout(options.timeoutMs || 30000),
146
- });
147
-
148
- const latencyMs = Date.now() - startMs;
149
- if (!res.ok) {
150
- return {
151
- ok: false,
152
- status: res.status,
153
- error: `HTTP ${res.status}: ${res.statusText}`,
154
- latencyMs,
155
- };
156
- }
157
-
158
- const data = await res.json();
159
- return {
160
- ok: !data.error && !data.result?.isError,
161
- result: data.result,
162
- error: data.error?.message || (data.result?.isError ? JSON.stringify(data.result.content) : null),
163
- latencyMs,
164
- };
165
- } catch (err) {
166
- return {
167
- ok: false,
168
- error: err.message,
169
- latencyMs: Date.now() - startMs,
170
- };
173
+ const connected = await withMcpClient(
174
+ serverConfig,
175
+ async (client) => client.callTool({ name: toolName, arguments: args }),
176
+ { timeoutMs: options.timeoutMs || 30000 },
177
+ );
178
+
179
+ const latencyMs = Date.now() - startMs;
180
+ if (!connected.ok) {
181
+ return { ok: false, error: connected.error, latencyMs };
171
182
  }
183
+
184
+ const result = connected.value;
185
+ return {
186
+ ok: !result?.isError,
187
+ result,
188
+ error: result?.isError ? JSON.stringify(result.content) : null,
189
+ latencyMs,
190
+ transport: connected.transport,
191
+ };
172
192
  }
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Cloudflare-hosted MCP portal servers (tool bundles), not OAuth clients.
3
+ *
4
+ * Each entry is an MCP *server* you can register with `agentsam mcp add <name>`.
5
+ * OAuth consent stays granular via feature packs / capability ids — never the
6
+ * full ~315-scope catalog. Managing portals themselves needs mcp-portals.*.
7
+ */
8
+
9
+ import {
10
+ scopesForCapabilities,
11
+ scopesForFeaturePacks,
12
+ } from '../../packages/connectors/cloudflare/src/capabilities.js';
13
+
14
+ /**
15
+ * @typedef {object} CloudflareMcpBundle
16
+ * @property {string} name
17
+ * @property {string} display_name
18
+ * @property {string} url
19
+ * @property {'none'|'bearer'|'cloudflare_portal_oauth'|'user_oauth_cloudflare'} auth_type
20
+ * @property {'streamable_http'|'sse'} protocol
21
+ * @property {string[]} feature_packs — AgentSam CF feature pack ids for AgentSam-side upgrade
22
+ * @property {string[]} capability_ids — finer granulation than packs
23
+ * @property {string[]} portal_manage_scopes — scopes to create/manage this portal via CF API
24
+ * @property {string} description
25
+ */
26
+
27
+ /** @type {readonly CloudflareMcpBundle[]} */
28
+ export const CLOUDFLARE_MCP_SERVER_BUNDLES = Object.freeze([
29
+ {
30
+ name: 'cloudflare-api',
31
+ display_name: 'Cloudflare API (Code Mode)',
32
+ url: 'https://mcp.cloudflare.com/mcp',
33
+ auth_type: 'cloudflare_portal_oauth',
34
+ protocol: 'streamable_http',
35
+ feature_packs: [],
36
+ capability_ids: [],
37
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
38
+ description: 'Full CF API via search/execute tools — Cloudflare hosts OAuth for this portal',
39
+ },
40
+ {
41
+ name: 'cloudflare-docs',
42
+ display_name: 'Cloudflare Docs',
43
+ url: 'https://docs.mcp.cloudflare.com/mcp',
44
+ auth_type: 'none',
45
+ protocol: 'streamable_http',
46
+ feature_packs: [],
47
+ capability_ids: [],
48
+ portal_manage_scopes: ['mcp-portals.read'],
49
+ description: 'Cloudflare developer documentation reference',
50
+ },
51
+ {
52
+ name: 'cloudflare-bindings',
53
+ display_name: 'Cloudflare Workers Bindings',
54
+ url: 'https://bindings.mcp.cloudflare.com/mcp',
55
+ auth_type: 'cloudflare_portal_oauth',
56
+ protocol: 'streamable_http',
57
+ feature_packs: ['data', 'compute', 'ai'],
58
+ capability_ids: [
59
+ 'cloudflare.workers',
60
+ 'cloudflare.d1',
61
+ 'cloudflare.kv',
62
+ 'cloudflare.r2',
63
+ 'cloudflare.workers_ai',
64
+ ],
65
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
66
+ description: 'Workers storage, AI, and compute bindings',
67
+ },
68
+ {
69
+ name: 'cloudflare-builds',
70
+ display_name: 'Cloudflare Workers Builds',
71
+ url: 'https://builds.mcp.cloudflare.com/mcp',
72
+ auth_type: 'cloudflare_portal_oauth',
73
+ protocol: 'streamable_http',
74
+ feature_packs: ['compute'],
75
+ capability_ids: ['cloudflare.workers'],
76
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
77
+ description: 'Workers Builds / CI insights (workers-ci.*)',
78
+ },
79
+ {
80
+ name: 'cloudflare-observability',
81
+ display_name: 'Cloudflare Observability',
82
+ url: 'https://observability.mcp.cloudflare.com/mcp',
83
+ auth_type: 'cloudflare_portal_oauth',
84
+ protocol: 'streamable_http',
85
+ feature_packs: ['compute'],
86
+ capability_ids: ['cloudflare.workers'],
87
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
88
+ description: 'Workers observability / logs / analytics',
89
+ },
90
+ {
91
+ name: 'cloudflare-browser',
92
+ display_name: 'Cloudflare Browser Rendering',
93
+ url: 'https://browser.mcp.cloudflare.com/mcp',
94
+ auth_type: 'cloudflare_portal_oauth',
95
+ protocol: 'streamable_http',
96
+ feature_packs: ['compute'],
97
+ capability_ids: ['cloudflare.browser_rendering'],
98
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
99
+ description: 'Fetch pages, markdown, screenshots',
100
+ },
101
+ {
102
+ name: 'cloudflare-logs',
103
+ display_name: 'Cloudflare Logpush',
104
+ url: 'https://logs.mcp.cloudflare.com/mcp',
105
+ auth_type: 'cloudflare_portal_oauth',
106
+ protocol: 'streamable_http',
107
+ feature_packs: ['analytics'],
108
+ capability_ids: [],
109
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
110
+ description: 'Logpush job health',
111
+ },
112
+ {
113
+ name: 'cloudflare-ai-gateway',
114
+ display_name: 'Cloudflare AI Gateway',
115
+ url: 'https://ai-gateway.mcp.cloudflare.com/mcp',
116
+ auth_type: 'cloudflare_portal_oauth',
117
+ protocol: 'streamable_http',
118
+ feature_packs: ['ai'],
119
+ capability_ids: ['cloudflare.workers_ai'],
120
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
121
+ description: 'AI Gateway request logs',
122
+ },
123
+ {
124
+ name: 'cloudflare-audit-logs',
125
+ display_name: 'Cloudflare Audit Logs',
126
+ url: 'https://auditlogs.mcp.cloudflare.com/mcp',
127
+ auth_type: 'cloudflare_portal_oauth',
128
+ protocol: 'streamable_http',
129
+ feature_packs: ['analytics'],
130
+ capability_ids: [],
131
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
132
+ description: 'Account audit log reports',
133
+ },
134
+ {
135
+ name: 'cloudflare-dns-analytics',
136
+ display_name: 'Cloudflare DNS Analytics',
137
+ url: 'https://dns-analytics.mcp.cloudflare.com/mcp',
138
+ auth_type: 'cloudflare_portal_oauth',
139
+ protocol: 'streamable_http',
140
+ feature_packs: ['dns', 'analytics'],
141
+ capability_ids: [],
142
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
143
+ description: 'DNS performance analytics',
144
+ },
145
+ {
146
+ name: 'cloudflare-graphql',
147
+ display_name: 'Cloudflare GraphQL',
148
+ url: 'https://graphql.mcp.cloudflare.com/mcp',
149
+ auth_type: 'cloudflare_portal_oauth',
150
+ protocol: 'streamable_http',
151
+ feature_packs: ['analytics'],
152
+ capability_ids: [],
153
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
154
+ description: 'Analytics via GraphQL',
155
+ },
156
+ {
157
+ name: 'cloudflare-containers',
158
+ display_name: 'Cloudflare Container Sandbox',
159
+ url: 'https://containers.mcp.cloudflare.com/mcp',
160
+ auth_type: 'cloudflare_portal_oauth',
161
+ protocol: 'streamable_http',
162
+ feature_packs: ['compute'],
163
+ capability_ids: ['cloudflare.containers'],
164
+ portal_manage_scopes: ['mcp-portals.read', 'mcp-portals.write'],
165
+ description: 'Ephemeral sandboxed containers',
166
+ },
167
+ ]);
168
+
169
+ export function listCloudflareMcpBundles() {
170
+ return [...CLOUDFLARE_MCP_SERVER_BUNDLES];
171
+ }
172
+
173
+ export function getCloudflareMcpBundle(name) {
174
+ const key = String(name || '').trim().toLowerCase();
175
+ if (!key) return null;
176
+ return CLOUDFLARE_MCP_SERVER_BUNDLES.find((b) => b.name === key) || null;
177
+ }
178
+
179
+ /**
180
+ * Scopes AgentSam should request (or upgrade) so a CF-connected user can
181
+ * manage / use the portal surface — not Cloudflare's own portal OAuth dance.
182
+ */
183
+ export function scopesForCloudflareMcpBundle(name, options = {}) {
184
+ const bundle = getCloudflareMcpBundle(name);
185
+ if (!bundle) return [];
186
+
187
+ const set = new Set();
188
+ if (options.includePortalManage !== false) {
189
+ for (const s of bundle.portal_manage_scopes || []) set.add(s);
190
+ }
191
+ for (const s of scopesForFeaturePacks(bundle.feature_packs || [], bundle.capability_ids || [])) {
192
+ set.add(s);
193
+ }
194
+ if (options.includeBaseline === false) {
195
+ // scopesForFeaturePacks always includes baseline; strip if caller asks
196
+ for (const s of ['account-settings.read', 'user-details.read', 'memberships.read', 'offline_access']) {
197
+ // keep offline_access — refresh still needed
198
+ if (s !== 'offline_access') set.delete(s);
199
+ }
200
+ }
201
+ return [...set];
202
+ }
203
+
204
+ /** Catalog rows for MCP authority (server presets). */
205
+ export function cloudflareBundlesAsServerCatalog() {
206
+ return CLOUDFLARE_MCP_SERVER_BUNDLES.map((b) => ({
207
+ name: b.name,
208
+ display_name: b.display_name,
209
+ url: b.url,
210
+ auth_type: b.auth_type,
211
+ protocol: b.protocol,
212
+ defaultClients: ['cursor'],
213
+ health_status: 'unknown',
214
+ avg_latency_ms: null,
215
+ error_rate: null,
216
+ description: b.description,
217
+ feature_packs: b.feature_packs,
218
+ capability_ids: b.capability_ids,
219
+ portal_manage_scopes: b.portal_manage_scopes,
220
+ provider: 'cloudflare',
221
+ kind: 'mcp_portal_bundle',
222
+ }));
223
+ }
224
+
225
+ export { scopesForCapabilities, scopesForFeaturePacks };
package/src/mcp/index.js CHANGED
@@ -22,6 +22,8 @@ export {
22
22
  DEFAULT_CLIENT_REGISTRY_URL,
23
23
  CLIENT_REGISTRY_CACHE_SCHEMA,
24
24
  SEED_EXTERNAL_CLIENT_REGISTRY,
25
+ SEED_OFFERABLE_MCP_SERVER_CONNECTIONS,
26
+ listOfferableMcpServerConnections,
25
27
  fetchExternalClientRegistry,
26
28
  listRegisteredClients,
27
29
  isClientRegistered,
@@ -37,8 +39,18 @@ export {
37
39
  pingMcpServer,
38
40
  listMcpTools,
39
41
  callMcpTool,
42
+ withMcpClient,
43
+ buildHeaders,
40
44
  } from './client.js';
41
45
 
46
+ export {
47
+ CLOUDFLARE_MCP_SERVER_BUNDLES,
48
+ listCloudflareMcpBundles,
49
+ getCloudflareMcpBundle,
50
+ scopesForCloudflareMcpBundle,
51
+ cloudflareBundlesAsServerCatalog,
52
+ } from './cloudflare-bundles.js';
53
+
42
54
  export {
43
55
  recordToolReceipt,
44
56
  getSessionToolReceipts,
@@ -19,7 +19,7 @@ export const AGENTSAM_MCP_PLUGIN_MANIFEST = normalizePluginManifest({
19
19
  { capability_key: 'cloudflare.api.execute', domain: 'cloudflare', verb: 'execute', description: 'Execute a bounded Cloudflare API Code Mode program.', is_mutating: true },
20
20
  ],
21
21
  tool_lanes: ['typed', 'mcp', 'api', 'codemode'],
22
- resource_scope: { owner: 'account', oauth_connection_table: 'agentsam_cloudflare_connections' },
22
+ resource_scope: { owner: 'account', oauth_connection_table: 'user_oauth_tokens' },
23
23
  config: {
24
24
  oauth_authority: 'cloudflare',
25
25
  oauth_client_id: 'c0704bd7a7aab7216b362603e1985499',
@@ -1,5 +1,6 @@
1
1
  import { createAgentEvent, createUsageSnapshot } from '../telemetry/index.js';
2
2
  import { diagnosticFromError } from '../errors/index.js';
3
+ import { resolveOllamaEndpoint } from '../../packages/agentsam-knowledge/src/providers/ollama-endpoint.js';
3
4
 
4
5
  function clean(value) { return value == null ? '' : String(value).trim(); }
5
6
  function integer(value) { const n = Number(value ?? 0); return Number.isFinite(n) && n >= 0 ? Math.floor(n) : 0; }
@@ -28,7 +29,7 @@ function callsFromMessage(message = {}) {
28
29
 
29
30
  export function createOllamaChatAdapter(options = {}) {
30
31
  const fetchImpl = options.fetchImpl || fetch;
31
- const endpoint = clean(options.endpoint || process.env.OLLAMA_BASE_URL || 'http://127.0.0.1:11434').replace(/\/$/, '');
32
+ const endpoint = resolveOllamaEndpoint({ endpoint: options.endpoint, env: options.env || process.env });
32
33
 
33
34
  async function send(messages, params = {}) {
34
35
  const record = params.modelRecord || options.modelRecord;
package/src/sam/types.js CHANGED
@@ -6,13 +6,34 @@
6
6
  export const SAM_RESULT_SCHEMA = 'agentsam.result.v1';
7
7
  export const SAM_EXPANSION = 'Systematic Autonomous Machinery';
8
8
 
9
- /** @typedef {'local'|'remote'|'sandbox'|'platform'} SamLane */
9
+ /** @typedef {'local'|'remote'|'sandbox'|'platform'|'mcp'} SamLane */
10
10
  /** @typedef {'never'|'optional'|'required'} SamModelPolicy */
11
11
  /** @typedef {'none'|'optional'|'required'} SamNetworkPolicy */
12
- /** @typedef {'none'|'local_write'|'remote_read'|'remote_write'|'deploy'|'billable'} SamSideEffects */
12
+ /** @typedef {'none'|'local_write'|'remote_read'|'remote_write'|'deploy'|'billable'|'oauth'} SamSideEffects */
13
13
  /** @typedef {'read_only'|'write'|'privileged'} SamRisk */
14
14
  /** @typedef {'never'|'optional'|'required'} SamSpendPolicy */
15
15
 
16
+ /**
17
+ * Provider capability / OAuth pack reference (Cloudflare, GitHub, …).
18
+ * Prefer pack- or capability-scoped consent — never wholesale scope catalogs.
19
+ * @typedef {object} SamCapabilityRef
20
+ * @property {string} id
21
+ * @property {string} [provider]
22
+ * @property {string[]} [oauth_scopes]
23
+ * @property {string[]} [feature_packs]
24
+ */
25
+
26
+ /**
27
+ * MCP projection for an operation (server tool surface).
28
+ * @typedef {object} SamMcpProjection
29
+ * @property {string} [server_name]
30
+ * @property {string} [server_url]
31
+ * @property {string} [tool_name]
32
+ * @property {string[]} [required_scopes]
33
+ * @property {string[]} [feature_packs]
34
+ * @property {'streamable_http'|'sse'|'stdio'} [protocol]
35
+ */
36
+
16
37
  /**
17
38
  * @typedef {object} SamExecutionMeta
18
39
  * @property {SamLane[]} lanes
@@ -36,6 +57,8 @@ export const SAM_EXPANSION = 'Systematic Autonomous Machinery';
36
57
  * @property {string} [description]
37
58
  * @property {SamExecutionMeta} execution
38
59
  * @property {{ account?: boolean, provider?: string[] }} [auth]
60
+ * @property {SamCapabilityRef[]} [capability_refs]
61
+ * @property {SamMcpProjection} [mcp]
39
62
  * @property {SamRisk} risk
40
63
  * @property {string} [input_schema]
41
64
  * @property {string} [output_schema]
@@ -57,6 +80,7 @@ export const SAM_EXPANSION = 'Systematic Autonomous Machinery';
57
80
  * @property {Record<string, unknown>} [execution]
58
81
  * @property {string} [cwd]
59
82
  * @property {Record<string, string|undefined>} [env]
83
+ * @property {{ mcp?: SamMcpProjection, capability_refs?: SamCapabilityRef[] }} [projection]
60
84
  */
61
85
 
62
86
  /**
@@ -71,6 +95,7 @@ export const SAM_EXPANSION = 'Systematic Autonomous Machinery';
71
95
  * @property {string|null} [input_hash]
72
96
  * @property {string|null} [output_hash]
73
97
  * @property {'completed'|'failed'|'cancelled'} status
98
+ * @property {SamMcpProjection} [mcp]
74
99
  */
75
100
 
76
101
  /**
@@ -11,7 +11,7 @@ export function readJson(file) {
11
11
  if (!stat.isFile() || stat.size > 32 * 1024 * 1024) throw new Error('Manifest must be a regular JSON file under 32 MiB');
12
12
  return JSON.parse(fs.readFileSync(file, 'utf8'));
13
13
  }
14
- export function collectNpmDependencies(projectRoot = process.cwd()) {
14
+ export function collectNpmDependencies(projectRoot = process.cwd(), options = {}) {
15
15
  const root = fs.realpathSync(projectRoot);
16
16
  const manifest = readJson(path.join(root, 'package.json'));
17
17
  const issues = [], dependencies = new Map(), skipped = [];
@@ -20,9 +20,19 @@ export function collectNpmDependencies(projectRoot = process.cwd()) {
20
20
  const unsupported = ['pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb'].filter(file => fs.existsSync(path.join(root, file)));
21
21
  if (manifest.packageManager && !manifest.packageManager.startsWith('npm@')) issues.push('Selected package manager is not npm; this adapter cannot prove its dependency graph.');
22
22
  else if (unsupported.length && !manifest.packageManager) issues.push('Multiple/unsupported package-manager lockfiles; select npm explicitly with packageManager or scan in the owning manager.');
23
+ const releaseCandidate = options.releaseCandidate || null;
23
24
  const add = (name, pkg, location, direct) => {
24
25
  if (pkg.link) { skipped.push({ path: location, reason: 'workspace/link (dependencies scanned from lock graph)' }); return; }
25
- if (!packageName(name) || !exactVersion(pkg.version) || /^(?:file:|link:|git[+:]|https?:\/\/.*\.git)/i.test(pkg.resolved || '')) {
26
+ const resolved = String(pkg.resolved || '');
27
+ const isLocalTarball = /^file:/i.test(resolved);
28
+ const allowedReleaseCandidate = Boolean(
29
+ isLocalTarball
30
+ && releaseCandidate
31
+ && releaseCandidate.name === name
32
+ && releaseCandidate.version === pkg.version
33
+ && releaseCandidate.location === location
34
+ );
35
+ if (!packageName(name) || !exactVersion(pkg.version) || (/^(?:file:|link:|git[+:]|https?:\/\/.*\.git)/i.test(resolved) && !allowedReleaseCandidate)) {
26
36
  issues.push('Unresolved or non-registry dependency at ' + location);
27
37
  return;
28
38
  }