@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
@@ -1,19 +1,24 @@
1
1
  import {
2
2
  deleteMcpServer,
3
3
  detectInstalledClients,
4
+ getCloudflareMcpBundle,
4
5
  inspectClientAdapter,
5
- isClientRegistered,
6
+ listCloudflareMcpBundles,
6
7
  listKnownServers,
7
8
  listMcpServers,
8
9
  listMcpTools,
10
+ listOfferableMcpServerConnections,
9
11
  listRegisteredClients,
10
12
  pingMcpServer,
11
13
  readMcpServer,
12
14
  removeServerFromClient,
13
15
  resolveServerPreset,
16
+ scopesForCloudflareMcpBundle,
14
17
  syncServerToClient,
15
18
  writeMcpServer,
16
19
  } from '../mcp/index.js';
20
+ import { createMcpServerProject } from '../lib/scaffold/mcp-server.js';
21
+ import { listMcpServerPresets } from '../lib/scaffold/templates/mcp-server/presets.js';
17
22
 
18
23
  function clean(value) {
19
24
  return value == null ? '' : String(value).trim();
@@ -32,14 +37,33 @@ export function parseMcpArgs(argv = []) {
32
37
  let token = '';
33
38
  let json = false;
34
39
  let catalog = false;
40
+ let bundles = false;
41
+ let pack = '';
42
+ let preset = '';
43
+ let output = '';
44
+ let issuer = '';
45
+ let audience = '';
46
+ let displayName = '';
47
+ let authMode = '';
48
+ let force = false;
35
49
 
36
50
  for (let i = 1; i < argv.length; i += 1) {
37
51
  const arg = argv[i];
38
52
  if (arg === '--client') client = argv[++i] || '';
39
53
  else if (arg === '--url') url = argv[++i] || '';
40
54
  else if (arg === '--token') token = argv[++i] || '';
55
+ else if (arg === '--pack') pack = argv[++i] || '';
56
+ else if (arg === '--preset') preset = argv[++i] || '';
57
+ else if (arg === '--output' || arg === '--out') output = argv[++i] || '';
58
+ else if (arg === '--issuer') issuer = argv[++i] || '';
59
+ else if (arg === '--audience') audience = argv[++i] || '';
60
+ else if (arg === '--display-name') displayName = argv[++i] || '';
61
+ else if (arg === '--public') authMode = 'public';
62
+ else if (arg === '--oauth') authMode = 'oauth';
63
+ else if (arg === '--force') force = true;
41
64
  else if (arg === '--json') json = true;
42
65
  else if (arg === '--catalog' || arg === '--all') catalog = true;
66
+ else if (arg === '--bundles' || arg === '--cloudflare') bundles = true;
43
67
  else if (arg === '--help' || arg === '-h') help = true;
44
68
  }
45
69
 
@@ -49,41 +73,72 @@ export function parseMcpArgs(argv = []) {
49
73
  client: client.toLowerCase(),
50
74
  url,
51
75
  token,
76
+ pack: pack.toLowerCase(),
77
+ preset: preset.toLowerCase(),
78
+ output,
79
+ issuer,
80
+ audience,
81
+ displayName,
82
+ authMode,
83
+ force,
52
84
  json,
53
85
  catalog,
86
+ bundles,
54
87
  help,
55
88
  };
56
89
  }
57
90
 
58
91
  function renderHelp(options = {}) {
59
92
  const clients = listRegisteredClients(options);
60
- const servers = listKnownServers(options);
61
-
62
- const presetRows = servers.map((s) => {
63
- const key = (s.name || s.server_key || '').padEnd(24);
64
- const desc = s.description || s.display_name || s.health_status || '';
65
- return ` ${key} ${s.url} (${desc})`;
93
+ const cfBundles = listCloudflareMcpBundles();
94
+ const offerable = listOfferableMcpServerConnections();
95
+ const templateRows = listMcpServerPresets().map((preset) =>
96
+ ` ${preset.key.padEnd(18)} ${preset.display_name}`
97
+ ).join('\n');
98
+
99
+ const presetRows = offerable.map((s) => {
100
+ const key = (s.connection_key || '').padEnd(28);
101
+ return ` ${key} ${s.url}`;
66
102
  }).join('\n');
67
103
 
68
104
  const clientRows = clients.map((c) => {
69
105
  const key = c.client_key.padEnd(24);
70
- const note = c.notes || c.display_name;
71
- return ` ${key} ${c.display_name} (${note})`;
106
+ return ` ${key} ${c.display_name}`;
107
+ }).join('\n');
108
+
109
+ const bundleRows = cfBundles.map((b) => {
110
+ const key = b.name.padEnd(28);
111
+ const packs = (b.feature_packs || []).join(',') || '—';
112
+ return ` ${key} packs=[${packs}] manage=${(b.portal_manage_scopes || []).join(',')}`;
72
113
  }).join('\n');
73
114
 
74
115
  return `
75
- AgentSam · MCP Client Management
116
+ AgentSam · MCP Factory + Client Management
76
117
 
77
118
  Usage:
119
+ agentsam mcp create <name> [--preset <preset>] [--output <dir>] [--issuer <url>] [--audience <url>] [--oauth|--public] [--force]
78
120
  agentsam mcp add <name> [--client <client>|all] [--url <url>] [--token <token>]
79
- agentsam mcp list [--catalog|--all] [--json]
121
+ agentsam mcp list [--catalog|--bundles] [--json]
80
122
  agentsam mcp status [<name>] [--json]
81
123
  agentsam mcp doctor [<name>] [--json]
82
124
  agentsam mcp remove <name> [--client <client>|all]
125
+ agentsam mcp scopes <cloudflare-bundle> [--json]
126
+
127
+ Notes:
128
+ • Client adapters = IDE hosts (cursor, claude, chatgpt, agentsam).
129
+ • Offerable MCP server connections include every CF portal hostname (see below).
130
+ • CF OAuth: pick packs (agentsam, developer_platform, zero_trust, …) or pack \`all\` (~315 scopes).
131
+ • mcp-portals.read/write come with the agentsam pack for CF-connected portal management.
132
+
133
+ MCP server templates:
134
+ ${templateRows}
83
135
 
84
- Known server presets:
136
+ Offerable MCP server connections:
85
137
  ${presetRows}
86
138
 
139
+ Cloudflare MCP bundles (granular packs):
140
+ ${bundleRows}
141
+
87
142
  Recognized client adapters:
88
143
  ${clientRows}
89
144
  `;
@@ -100,19 +155,68 @@ export async function runMcp(argv = [], options = {}) {
100
155
 
101
156
  const { subcommand, target } = args;
102
157
 
158
+ if (subcommand === 'create') {
159
+ if (!target) throw new Error('mcp_project_name_required');
160
+ const preset = args.preset || 'heuristics';
161
+ const result = await createMcpServerProject({
162
+ projectName: target,
163
+ preset,
164
+ output: args.output || target,
165
+ issuer: args.issuer || undefined,
166
+ audience: args.audience || undefined,
167
+ displayName: args.displayName || undefined,
168
+ authMode: args.authMode || undefined,
169
+ force: args.force,
170
+ }, {
171
+ cwd: options.cwd || process.cwd(),
172
+ });
173
+
174
+ if (args.json) {
175
+ write(JSON.stringify(result, null, 2) + '\n');
176
+ return result;
177
+ }
178
+
179
+ write(`\n ✓ Generated MCP server: ${result.display_name}\n`);
180
+ write(` preset: ${result.preset}\n`);
181
+ write(` output: ${result.output_dir}\n`);
182
+ write(` manifest: ${result.manifest_path}\n`);
183
+ write(` endpoint: ${result.transport} ${result.endpoint_path}\n\n`);
184
+ return result;
185
+ }
186
+
103
187
  if (subcommand === 'list') {
188
+ if (args.bundles) {
189
+ const bundles = listCloudflareMcpBundles().map((b) => ({
190
+ ...b,
191
+ suggested_oauth_scopes: scopesForCloudflareMcpBundle(b.name),
192
+ }));
193
+ if (args.json) {
194
+ write(JSON.stringify({ bundles }, null, 2) + '\n');
195
+ return bundles;
196
+ }
197
+ write('\n Cloudflare MCP portal bundles\n\n');
198
+ for (const b of bundles) {
199
+ write(` • ${b.name} — ${b.display_name}\n`);
200
+ write(` url: ${b.url}\n`);
201
+ write(` packs: ${(b.feature_packs || []).join(', ') || '(portal OAuth only)'}\n`);
202
+ write(` manage: ${(b.portal_manage_scopes || []).join(', ')}\n`);
203
+ write(` scopes: ${b.suggested_oauth_scopes.slice(0, 8).join(' ')}${b.suggested_oauth_scopes.length > 8 ? ' …' : ''}\n\n`);
204
+ }
205
+ return bundles;
206
+ }
207
+
104
208
  if (args.catalog) {
105
209
  const catalog = listKnownServers(options);
106
210
  if (args.json) {
107
211
  write(JSON.stringify({ catalog }, null, 2) + '\n');
108
212
  return catalog;
109
213
  }
110
- write('\n Known MCP Server Catalog (Registry: agentsam_mcp_servers)\n\n');
214
+ write('\n Known MCP Server Catalog\n\n');
111
215
  for (const s of catalog) {
112
216
  write(` • ${s.name || s.server_key} (${s.display_name || s.name})\n`);
113
217
  write(` url: ${s.url}\n`);
114
218
  write(` auth_type: ${s.auth_type || 'none'}\n`);
115
- write(` health: ${s.health_status || 'unknown'}${s.avg_latency_ms != null ? ` · ${s.avg_latency_ms}ms` : ''}\n\n`);
219
+ write(` protocol: ${s.protocol || 'streamable_http'}\n\n`);
116
220
  }
117
221
  return catalog;
118
222
  }
@@ -124,6 +228,7 @@ export async function runMcp(argv = [], options = {}) {
124
228
  }
125
229
  if (servers.length === 0) {
126
230
  write(' No MCP servers configured yet. Add one with: agentsam mcp add inneranimalmedia\n');
231
+ write(' Cloudflare portals: agentsam mcp list --bundles\n');
127
232
  return servers;
128
233
  }
129
234
  write('\n Configured MCP Servers (Authority: ~/.agentsam/mcp/)\n\n');
@@ -137,13 +242,49 @@ export async function runMcp(argv = [], options = {}) {
137
242
  return servers;
138
243
  }
139
244
 
245
+ if (subcommand === 'scopes') {
246
+ const name = target;
247
+ if (!name) throw new Error('mcp_bundle_name_required');
248
+ const bundle = getCloudflareMcpBundle(name);
249
+ if (!bundle) {
250
+ throw new Error(`unknown_cloudflare_mcp_bundle:${name}`);
251
+ }
252
+ const scopes = scopesForCloudflareMcpBundle(name);
253
+ const payload = {
254
+ bundle: bundle.name,
255
+ url: bundle.url,
256
+ feature_packs: bundle.feature_packs,
257
+ capability_ids: bundle.capability_ids,
258
+ portal_manage_scopes: bundle.portal_manage_scopes,
259
+ oauth_scopes: scopes,
260
+ authorize_hint: `agentsam cloudflare permissions authorize --packs ${(bundle.feature_packs || ['agentsam']).join(',')}`,
261
+ note: 'Never request CLOUDFLARE_ALL_SCOPES (~315) at once — upgrade by pack.',
262
+ };
263
+ if (args.json) {
264
+ write(JSON.stringify(payload, null, 2) + '\n');
265
+ return payload;
266
+ }
267
+ write(`\n OAuth scopes for MCP bundle: ${name}\n`);
268
+ write(` URL: ${bundle.url}\n`);
269
+ write(` Packs: ${(bundle.feature_packs || []).join(', ') || '(none)'}\n`);
270
+ write(` Manage: ${(bundle.portal_manage_scopes || []).join(', ')}\n`);
271
+ write(` Scopes (${scopes.length}):\n`);
272
+ for (const s of scopes) write(` • ${s}\n`);
273
+ write(`\n ${payload.authorize_hint}\n\n`);
274
+ return payload;
275
+ }
276
+
140
277
  if (subcommand === 'add') {
141
- const name = target || 'inneranimalmedia';
278
+ const name = target;
279
+ if (!name) {
280
+ throw new Error('mcp_server_name_required: agentsam mcp add <name> [--url <url>]');
281
+ }
282
+
142
283
  const preset = resolveServerPreset(name, options);
143
284
  const url = args.url || preset?.url;
144
285
 
145
286
  if (!url) {
146
- throw new Error(`missing_url: specify --url for custom MCP server "${name}"`);
287
+ throw new Error(`missing_url: specify --url for custom MCP server "${name}" (or use a catalog name from: agentsam mcp list --catalog)`);
147
288
  }
148
289
 
149
290
  let requestedClients = ['cursor'];
@@ -158,30 +299,58 @@ export async function runMcp(argv = [], options = {}) {
158
299
  requestedClients = preset.defaultClients;
159
300
  }
160
301
 
302
+ const cfBundle = getCloudflareMcpBundle(name);
303
+ const packHint = args.pack || (cfBundle?.feature_packs || [])[0] || '';
304
+
161
305
  const serverConfig = {
162
306
  name,
163
307
  url,
164
- protocol: preset?.protocol || 'sse',
165
- auth: args.token ? { type: preset?.auth_type || 'bearer', token: args.token } : null,
308
+ protocol: preset?.protocol || 'streamable_http',
309
+ auth: args.token
310
+ ? { type: preset?.auth_type === 'none' ? 'bearer' : (preset?.auth_type || 'bearer'), token: args.token }
311
+ : null,
166
312
  clients: requestedClients,
167
- metadata: preset ? { preset: name, description: preset.description, health_status: preset.health_status } : {},
313
+ metadata: {
314
+ ...(preset
315
+ ? {
316
+ preset: name,
317
+ description: preset.description,
318
+ provider: preset.provider || null,
319
+ kind: preset.kind || null,
320
+ feature_packs: preset.feature_packs || [],
321
+ capability_ids: preset.capability_ids || [],
322
+ portal_manage_scopes: preset.portal_manage_scopes || [],
323
+ }
324
+ : {}),
325
+ pack_hint: packHint || null,
326
+ },
168
327
  };
169
328
 
170
- // Store in AgentSam authority
171
329
  const written = writeMcpServer(name, serverConfig, options);
172
330
 
173
- // Materialize client adapters
174
331
  const syncedAdapters = [];
175
332
  for (const c of requestedClients) {
176
333
  const res = syncServerToClient(c, name, serverConfig, options);
177
334
  syncedAdapters.push(res);
178
335
  }
179
336
 
180
- // Ping to verify connectivity
181
337
  const ping = await pingMcpServer(serverConfig, options);
338
+ const scopePreview = cfBundle ? scopesForCloudflareMcpBundle(name) : null;
182
339
 
183
340
  if (args.json) {
184
- const payload = { ok: true, server: written, syncedAdapters, ping };
341
+ const payload = {
342
+ ok: true,
343
+ server: written,
344
+ syncedAdapters,
345
+ ping,
346
+ cloudflare_bundle: cfBundle
347
+ ? {
348
+ feature_packs: cfBundle.feature_packs,
349
+ portal_manage_scopes: cfBundle.portal_manage_scopes,
350
+ suggested_oauth_scopes: scopePreview,
351
+ }
352
+ : null,
353
+ };
185
354
  write(JSON.stringify(payload, null, 2) + '\n');
186
355
  return payload;
187
356
  }
@@ -189,16 +358,23 @@ export async function runMcp(argv = [], options = {}) {
189
358
  write(`\n ✓ Configured MCP server: ${name}\n`);
190
359
  write(` Authority: ~/.agentsam/mcp/${name}.json\n`);
191
360
  write(` URL: ${url}\n`);
361
+ write(` Protocol: ${serverConfig.protocol}\n`);
192
362
  for (const a of syncedAdapters) {
193
363
  write(` Adapter: ${a.client} -> ${a.configPath}\n`);
194
364
  }
195
365
  if (ping.ok) {
196
- write(` Ping: ✓ Connected (${ping.latencyMs}ms)\n`);
366
+ write(` Ping: ✓ Connected (${ping.latencyMs}ms${ping.transport ? `, ${ping.transport}` : ''})\n`);
197
367
  } else {
198
368
  write(` Ping: ⚠ Warning (${ping.error || 'unreachable'})\n`);
199
369
  }
370
+ if (cfBundle) {
371
+ write(` CF packs: ${(cfBundle.feature_packs || []).join(', ') || '(portal-hosted OAuth)'}\n`);
372
+ write(` Portal: ${(cfBundle.portal_manage_scopes || []).join(', ')}\n`);
373
+ write(` Upgrade: agentsam mcp scopes ${name}\n`);
374
+ write(` (CF-connected users: ensure agentsam pack includes mcp-portals.*)\n`);
375
+ }
200
376
  write('\n');
201
- return { server: written, syncedAdapters, ping };
377
+ return { ok: true, server: written, syncedAdapters, ping };
202
378
  }
203
379
 
204
380
  if (subcommand === 'status') {
@@ -221,9 +397,11 @@ export async function runMcp(argv = [], options = {}) {
221
397
  const report = {
222
398
  name,
223
399
  url: server.url,
400
+ protocol: server.protocol,
224
401
  ping,
225
402
  clients: clientStatuses,
226
403
  hasAuth: Boolean(server.auth?.token),
404
+ metadata: server.metadata || {},
227
405
  };
228
406
 
229
407
  if (args.json) {
@@ -261,21 +439,34 @@ export async function runMcp(argv = [], options = {}) {
261
439
  const toolsProbe = ping.ok ? await listMcpTools(server, options) : { count: 0, tools: [] };
262
440
 
263
441
  const detectedClients = detectInstalledClients(options);
442
+ const cfBundle = getCloudflareMcpBundle(name);
264
443
  const diagnostics = {
265
444
  name,
266
445
  authorityPath: `~/.agentsam/mcp/${name}.json`,
267
446
  url: server.url,
268
447
  connectivity: ping.ok ? 'pass' : 'fail',
269
448
  latencyMs: ping.latencyMs,
449
+ transport: ping.transport || null,
270
450
  authConfigured: Boolean(server.auth?.token),
271
451
  discoveredTools: toolsProbe.count,
272
452
  clients: clientStatuses,
273
453
  detectedHostClients: detectedClients,
274
- catalogHealth: preset ? {
275
- health_status: preset.health_status,
276
- avg_latency_ms: preset.avg_latency_ms,
277
- error_rate: preset.error_rate,
278
- } : null,
454
+ catalog: preset
455
+ ? {
456
+ auth_type: preset.auth_type,
457
+ protocol: preset.protocol,
458
+ provider: preset.provider,
459
+ feature_packs: preset.feature_packs || [],
460
+ portal_manage_scopes: preset.portal_manage_scopes || [],
461
+ }
462
+ : null,
463
+ cloudflare_oauth_hint: cfBundle
464
+ ? {
465
+ packs: cfBundle.feature_packs,
466
+ scopes: scopesForCloudflareMcpBundle(name),
467
+ note: 'Authorize packs via agentsam cloudflare permissions — not the full scope catalog.',
468
+ }
469
+ : null,
279
470
  };
280
471
 
281
472
  if (args.json) {
@@ -286,15 +477,17 @@ export async function runMcp(argv = [], options = {}) {
286
477
  write(`\n AgentSam MCP Doctor · ${name}\n\n`);
287
478
  write(` [1] Authority state: ✓ Valid (~/.agentsam/mcp/${name}.json)\n`);
288
479
  write(` [2] Endpoint ping: ${ping.ok ? `✓ Reachable (${ping.latencyMs}ms)` : `✗ Unreachable (${ping.error})`}\n`);
289
- if (preset?.health_status) {
290
- write(` [3] Live health data: ${preset.health_status} (avg latency: ${preset.avg_latency_ms ?? 0}ms, error rate: ${preset.error_rate ?? 0}%)\n`);
291
- }
480
+ write(` [3] Catalog: ${preset ? `${preset.auth_type} / ${preset.protocol}` : 'custom'}\n`);
292
481
  write(` [4] Auth credential: ${diagnostics.authConfigured ? '✓ Token configured' : '○ Unauthenticated / public'}\n`);
293
482
  write(` [5] Tool discovery: ${toolsProbe.count > 0 ? `✓ Found ${toolsProbe.count} tools` : '○ 0 tools discovered'}\n`);
294
483
  write(` [6] Client adapters:\n`);
295
484
  for (const c of clientStatuses) {
296
485
  write(` • ${c.client}: ${c.configured ? '✓ Synced' : '✗ Desynced'} (${c.path})\n`);
297
486
  }
487
+ if (cfBundle) {
488
+ write(` [7] CF portal packs: ${(cfBundle.feature_packs || []).join(', ') || '—'}\n`);
489
+ write(` Portal manage: ${(cfBundle.portal_manage_scopes || []).join(', ')}\n`);
490
+ }
298
491
  write('\n');
299
492
  return diagnostics;
300
493
  }
@@ -2,9 +2,10 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import { spawn, spawnSync } from 'node:child_process';
4
4
  import { readProjectConfig, setLocalModelCapability, writeProjectConfig } from '../lib/project-config.js';
5
+ import { OLLAMA_DEFAULT_ENDPOINT, resolveOllamaEndpoint } from '../../packages/agentsam-knowledge/src/providers/ollama-endpoint.js';
5
6
 
6
7
  export const OLLAMA_DEFAULTS = Object.freeze({
7
- baseUrl: 'http://127.0.0.1:11434',
8
+ baseUrl: OLLAMA_DEFAULT_ENDPOINT,
8
9
  model: 'qwen2.5-coder',
9
10
  embedModel: 'mxbai-embed-large',
10
11
  });
@@ -50,7 +51,7 @@ export function parseOllamaArgs(argv = []) {
50
51
 
51
52
  export function resolveOllamaConfig(opts = {}, env = process.env) {
52
53
  return {
53
- baseUrl: clean(opts.baseUrl || env.OLLAMA_BASE_URL || OLLAMA_DEFAULTS.baseUrl).replace(/\/+$/, ''),
54
+ baseUrl: resolveOllamaEndpoint({ endpoint: opts.baseUrl, env }),
54
55
  model: clean(opts.model || env.OLLAMA_MODEL || OLLAMA_DEFAULTS.model),
55
56
  embedModel: clean(opts.embedModel || env.OLLAMA_EMBED_MODEL || OLLAMA_DEFAULTS.embedModel),
56
57
  };
@@ -27,7 +27,7 @@ function installMigration(cwd) {
27
27
  function parse(argv) {
28
28
  const out = {
29
29
  action: argv[0] || 'list', key: '', cwd: process.cwd(), json: false,
30
- origin: process.env.AGENTSAM_ORIGIN || process.env.AGENTSAM_API_ORIGIN || 'https://agentsam.inneranimalmedia.com',
30
+ origin: '',
31
31
  timeoutMs: 180_000, noOpen: false,
32
32
  };
33
33
  for (let i = 1; i < argv.length; i += 1) {
@@ -59,7 +59,12 @@ async function resolveCliBearer(opts) {
59
59
  }
60
60
 
61
61
  async function fetchConnector(opts, token, pathname, init = {}) {
62
- const origin = String(opts.origin).replace(/\/$/, '');
62
+ const origin = String(opts.origin || '').replace(/\/$/, '');
63
+ if (!origin) {
64
+ throw new Error(
65
+ 'origin_required: pass --origin https://<your-local-studio-host> (no AGENTSAM_ORIGIN / hardcoded host fallback).',
66
+ );
67
+ }
63
68
  const headers = new Headers(init.headers || {});
64
69
  headers.set('accept', 'application/json');
65
70
  headers.set('authorization', `Bearer ${token}`);
@@ -16,7 +16,40 @@ function parseCommon(argv = []) {
16
16
  return out;
17
17
  }
18
18
 
19
+ export function printInspectHelp() {
20
+ console.log(`
21
+ agentsam inspect — deterministic repository world state
22
+
23
+ agentsam inspect [path] Inspect a repository or directory
24
+ agentsam inspect [path] --json Machine-readable bounded index
25
+ agentsam inspect [path] --full --json Full snapshot authority
26
+ agentsam inspect [path] --view files File evidence view
27
+ agentsam inspect [path] --match <text> Filter files by path/symbol/import metadata
28
+ agentsam inspect [path] --save-snapshot <file>
29
+ Save the content-addressed snapshot
30
+
31
+ --cwd <path> Explicit root (legacy/automation form; positional path is preferred)
32
+ --view <index|files|full>
33
+ --index Bounded repository index (default)
34
+ --full Full repository snapshot
35
+ --limit <1-500> File result limit
36
+ --facet-limit <1-200> Facet result limit
37
+ --churn-days <days> Git churn window (default: 30)
38
+ --system/--package/--category/--layer/--kind/--language/--role
39
+ --execution-domain/--tag/--path/--symbol/--import/--match <value>
40
+ Deterministic metadata filters
41
+ --snapshot-file <file> Project a previously saved snapshot instead of scanning
42
+ --save-snapshot <file> Save the newly scanned snapshot
43
+ --pretty Pretty JSON when --json is used
44
+
45
+ No model, embeddings, network, provider spend, deploy, or mutation is required.
46
+ Output includes content hashes, Merkle identity, file metadata, AST-derived symbols/imports,
47
+ packages, systems, facets, revision evidence, and trust-boundary analysis when available.
48
+ `);
49
+ }
50
+
19
51
  export async function runInspect(argv = []) {
52
+ if (argv.includes('--help') || argv.includes('-h')) { printInspectHelp(); return; }
20
53
  const opts = parseCommon(argv);
21
54
  let churnDays = 30;
22
55
  let view = 'index';
@@ -27,6 +60,7 @@ export async function runInspect(argv = []) {
27
60
  let snapshotFile = '';
28
61
  let saveSnapshot = '';
29
62
  const filters = {};
63
+ let positionalRoot = '';
30
64
  const addFilter = (field, value) => {
31
65
  const clean = String(value || '').trim();
32
66
  if (!clean) throw new Error(`inspect_${field}_value_required`);
@@ -50,8 +84,10 @@ export async function runInspect(argv = []) {
50
84
  else if (arg === '--save-snapshot') saveSnapshot = String(opts.positionals[++i] || '').trim();
51
85
  else if (filterFlags.has(arg)) addFilter(filterFlags.get(arg), opts.positionals[++i]);
52
86
  else if (arg === 'repository') continue;
87
+ else if (!arg.startsWith('-') && !positionalRoot) positionalRoot = arg;
53
88
  else throw new Error(`unknown inspect option: ${arg}`);
54
89
  }
90
+ if (positionalRoot) opts.cwd = path.resolve(opts.cwd, positionalRoot);
55
91
  if (!['full', 'index', 'files'].includes(view)) throw new Error(`invalid inspect view: ${view}`);
56
92
  if (!Number.isInteger(limit) || limit < 1 || limit > 500) throw new Error('inspect limit must be an integer from 1..500');
57
93
  if (!Number.isInteger(facetLimit) || facetLimit < 1 || facetLimit > 200) throw new Error('inspect facet limit must be an integer from 1..200');
@@ -7,33 +7,52 @@ import { collectLocalStatus } from '../lib/local-status.js';
7
7
  import { tryReadProjectConfig } from '../lib/project-config.js';
8
8
 
9
9
  function terminalConnection(row = {}) {
10
+ const lastSeen = row.last_seen_at ?? null;
11
+ const id = row.id || row.connection_id || null;
12
+ const compute = row.compute_provider || row.provider || null;
10
13
  return {
11
- id: row.id || row.connection_id || null,
14
+ id,
15
+ connection_id: id,
12
16
  instance_id: row.instance_id || null,
13
17
  name: row.name || row.connection_name || null,
14
18
  kind: row.kind || row.target_type || null,
15
- provider: row.provider || row.compute_provider || null,
19
+ provider: compute,
20
+ compute_provider: compute,
16
21
  transport: row.transport || null,
17
22
  transport_provider: row.transport_provider || null,
18
- active: row.is_active === true || Number(row.is_active) === 1,
19
- default: row.is_default === true || Number(row.is_default) === 1,
20
- health: row.last_health_status || row.health_status || 'unknown',
21
- last_seen_at: row.last_seen_at || null,
23
+ endpoint_url: row.endpoint_url || null,
24
+ route_hostname: row.route_hostname || null,
25
+ public_url: row.public_url || row.endpoint_url || null,
26
+ active: row.is_active === true || Number(row.is_active) === 1 || row.active === true,
27
+ default: row.is_default === true || Number(row.is_default) === 1 || row.default === true,
28
+ health: row.last_health_status || row.health_status || row.health || 'unknown',
29
+ last_seen_at: lastSeen,
30
+ last_seen_at_iso: row.last_seen_at_iso || (Number.isFinite(Number(lastSeen)) && Number(lastSeen) > 0
31
+ ? new Date((Number(lastSeen) > 1e12 ? Number(lastSeen) : Number(lastSeen) * 1000)).toISOString()
32
+ : null),
22
33
  };
23
34
  }
24
35
 
25
36
  function terminalInstance(row = {}) {
37
+ const lastSeen = row.last_seen_at ?? null;
38
+ const id = row.id || row.instance_id || null;
39
+ const compute = row.compute_provider || row.provider || null;
26
40
  return {
27
- id: row.id || null,
41
+ id,
42
+ instance_id: id,
28
43
  name: row.name || null,
29
44
  kind: row.kind || null,
30
- provider: row.provider || row.compute_provider || null,
45
+ provider: compute,
46
+ compute_provider: compute,
31
47
  status: row.status || null,
32
48
  platform: row.platform || null,
33
49
  arch: row.arch || null,
34
50
  active_connection_count: Number(row.active_connection_count || 0),
35
51
  default_connection_id: row.default_connection_id || null,
36
- last_seen_at: row.last_seen_at || null,
52
+ last_seen_at: lastSeen,
53
+ last_seen_at_iso: row.last_seen_at_iso || (Number.isFinite(Number(lastSeen)) && Number(lastSeen) > 0
54
+ ? new Date((Number(lastSeen) > 1e12 ? Number(lastSeen) : Number(lastSeen) * 1000)).toISOString()
55
+ : null),
37
56
  };
38
57
  }
39
58