@inneranimalmedia/agentsam-sdk 2.6.5 → 2.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/AGENTSAM.md +29 -0
  2. package/README.md +37 -0
  3. package/apps/README.md +5 -0
  4. package/apps/cad-creator/README.md +4 -4
  5. package/apps/cad-creator/shared/cad/package.json +1 -1
  6. package/apps/client-cms-editor/AGENTS.md +12 -7
  7. package/apps/client-cms-editor/README.md +76 -48
  8. package/apps/client-cms-editor/agentsam.app.json +26 -9
  9. package/apps/client-cms-editor/backend/package.json +20 -3
  10. package/apps/client-cms-editor/backend/src/api/client.ts +134 -101
  11. package/apps/client-cms-editor/backend/src/index.ts +1 -1
  12. package/apps/client-cms-editor/backend/src/model.ts +11 -115
  13. package/apps/client-cms-editor/backend/src/preview/bridge.ts +1 -1
  14. package/apps/client-cms-editor/backend/tsconfig.json +6 -1
  15. package/apps/client-cms-editor/bin/agentsam-cms.js +262 -0
  16. package/apps/client-cms-editor/bin/agentsam-cms.mjs +2 -228
  17. package/apps/client-cms-editor/frontend/package.json +16 -7
  18. package/apps/client-cms-editor/frontend/src/AgentSamDrawer.tsx +9 -41
  19. package/apps/client-cms-editor/frontend/src/CmsAgentSurface.tsx +19 -174
  20. package/apps/client-cms-editor/frontend/src/adapters/heuristic.ts +29 -0
  21. package/apps/client-cms-editor/frontend/src/adapters/http.ts +628 -0
  22. package/apps/client-cms-editor/frontend/src/adapters/memory.ts +510 -0
  23. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +213 -0
  24. package/apps/client-cms-editor/frontend/src/editor/CmsEditorProvider.tsx +20 -0
  25. package/apps/client-cms-editor/frontend/src/editor/canvas/PreviewCanvas.tsx +53 -0
  26. package/apps/client-cms-editor/frontend/src/{CmsEditor.tsx → editor/legacy/CmsEditorPrototype.tsx} +52 -23
  27. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +218 -0
  28. package/apps/client-cms-editor/frontend/src/index.ts +19 -5
  29. package/apps/client-cms-editor/frontend/src/lib/agent-host.ts +24 -0
  30. package/apps/client-cms-editor/frontend/src/main.tsx +82 -8
  31. package/apps/client-cms-editor/frontend/src/mount.tsx +92 -30
  32. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +1 -1
  33. package/apps/client-cms-editor/frontend/src/styles/cmsShell.css +8 -8
  34. package/apps/client-cms-editor/frontend/src/styles/studio.css +55 -3
  35. package/apps/client-cms-editor/frontend/tsconfig.json +12 -1
  36. package/apps/client-cms-editor/frontend/vite.config.ts +12 -0
  37. package/apps/client-cms-editor/package-lock.json +973 -134
  38. package/apps/client-cms-editor/package.json +118 -6
  39. package/apps/client-cms-editor/reference/harvest/HARVEST_RECEIPT.json +201 -0
  40. package/apps/client-cms-editor/reference/harvest/PROVENANCE_HISTORY.txt +10 -0
  41. package/apps/client-cms-editor/reference/harvest/README.md +8 -0
  42. package/apps/client-cms-editor/reference/harvest/plans/ARCHIVE-INTAKE.md +135 -0
  43. package/apps/client-cms-editor/reference/harvest/plans/CHATGPT-IDENTITY-HARVEST.md +83 -0
  44. package/apps/client-cms-editor/reference/harvest/plans/CMS-EDITOR-HARVEST.md +166 -0
  45. package/apps/client-cms-editor/reference/harvest/plans/HARVEST-INDEX.md +196 -0
  46. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +137 -0
  47. package/apps/client-cms-editor/reference/harvest/plans/NO-IMPLICIT-SIDE-EFFECTS.md +87 -0
  48. package/apps/client-cms-editor/reference/harvest/plans/STOREFRONT-SURFACE-MAP.md +140 -0
  49. package/apps/client-cms-editor/reference/harvest/plans/THEME-INNERANIMALS-HARVEST.md +137 -0
  50. package/apps/client-cms-editor/reference/harvest/plans/TOOLING-LAB.md +63 -0
  51. package/apps/client-cms-editor/reference/harvest/plans/harvest-manifest.json +97 -0
  52. package/apps/client-cms-editor/reference/harvest/plans/local-cms-harvest-schema.sql +328 -0
  53. package/apps/client-cms-editor/shared/cms/package.json +17 -7
  54. package/apps/client-cms-editor/shared/cms/src/adapter.ts +204 -0
  55. package/apps/client-cms-editor/shared/cms/src/agent-context.ts +7 -5
  56. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +32 -0
  57. package/apps/client-cms-editor/shared/cms/src/host.ts +82 -0
  58. package/apps/client-cms-editor/shared/cms/src/index.ts +4 -0
  59. package/apps/client-cms-editor/shared/cms/src/map.ts +115 -0
  60. package/apps/client-cms-editor/shared/cms/src/starter-pack.ts +158 -0
  61. package/contracts/source-types.v1.json +353 -0
  62. package/docs/CMS_CONTEXTUAL_COMPOSER.md +1 -1
  63. package/docs/PRODUCT_LIFECYCLE.md +566 -0
  64. package/docs/REPO_FILE_MAP.txt +132 -0
  65. package/docs/THEME_REFINERY.md +2 -2
  66. package/docs/architecture/AGENTSAM_RUNTIME_PROTOCOL.md +40 -20
  67. package/docs/content-studio/REVISION_GATE_2026-09-27.md +1 -1
  68. package/docs/plans/LOCAL_STUDIO_DESKTOP_RELEASE_2026-09-29.md +150 -0
  69. package/migrations/d1/0017_identity_native_oauth.sql +21 -0
  70. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  71. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  72. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  73. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  74. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  75. package/native/agentsam-machine/Cargo.lock +426 -0
  76. package/native/agentsam-machine/Cargo.toml +9 -0
  77. package/native/agentsam-machine/cli/Cargo.toml +21 -0
  78. package/native/agentsam-machine/cli/README.md +21 -0
  79. package/native/agentsam-machine/cli/src/main.rs +77 -0
  80. package/native/agentsam-machine/core/Cargo.toml +22 -0
  81. package/native/agentsam-machine/core/README.md +14 -0
  82. package/native/agentsam-machine/core/build.rs +33 -0
  83. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  84. package/native/agentsam-machine/core/src/assets.rs +790 -0
  85. package/native/agentsam-machine/core/src/bound.rs +298 -0
  86. package/native/agentsam-machine/core/src/enrich.rs +706 -0
  87. package/native/agentsam-machine/core/src/frontend.rs +442 -0
  88. package/native/agentsam-machine/core/src/lib.rs +1092 -0
  89. package/native/agentsam-machine/core/src/liquid.rs +528 -0
  90. package/native/agentsam-machine/core/src/source_types.rs +78 -0
  91. package/package.json +64 -24
  92. package/packages/agentsam-brand/README.md +1 -1
  93. package/packages/agentsam-brand/package.json +4 -4
  94. package/packages/agentsam-brand/src/index.js +1 -1
  95. package/packages/agentsam-contracts/package.json +13 -3
  96. package/packages/agentsam-contracts/src/tools.ts +22 -0
  97. package/packages/agentsam-errors/package.json +13 -3
  98. package/packages/agentsam-errors/src/index.js +1 -0
  99. package/packages/agentsam-errors/src/tool.js +56 -0
  100. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  101. package/packages/agentsam-goap/README.md +52 -0
  102. package/packages/agentsam-goap/package.json +37 -0
  103. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  104. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  105. package/packages/agentsam-goap/src/contracts.js +226 -0
  106. package/packages/agentsam-goap/src/control-plane.js +112 -0
  107. package/packages/agentsam-goap/src/errors.js +157 -0
  108. package/packages/agentsam-goap/src/index.js +5 -0
  109. package/packages/agentsam-goap/src/world.js +202 -0
  110. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  111. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  112. package/packages/agentsam-knowledge/package.json +18 -4
  113. package/packages/agentsam-knowledge/src/autorag/index.js +10 -3
  114. package/packages/agentsam-knowledge/src/backends/index.js +33 -1
  115. package/packages/agentsam-knowledge/test/autorag.test.mjs +60 -1
  116. package/packages/agentsam-nav/dist/browser.global.js +21 -18
  117. package/packages/agentsam-nav/dist/browser.js +6807 -130
  118. package/packages/agentsam-nav/dist/index.js +6799 -122
  119. package/packages/agentsam-nav/package.json +24 -6
  120. package/packages/agentsam-queue-control/README.md +1 -1
  121. package/packages/agentsam-queue-control/package.json +7 -2
  122. package/packages/agentsam-rapid-rust/src/main.rs +1 -1
  123. package/packages/agentsam-repository/package.json +13 -3
  124. package/packages/agentsam-repository/src/goap.js +13 -14
  125. package/packages/agentsam-repository/src/source-types.js +8 -0
  126. package/packages/agentsam-repository/src/tickets.js +15 -22
  127. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  128. package/packages/agentsam-vault/package.json +14 -4
  129. package/packages/agentsam-workbench/package.json +15 -4
  130. package/packages/agentsam-workbench/src/agent/ToolPermissionRequest.tsx +94 -0
  131. package/packages/agentsam-workbench/src/agent/index.ts +2 -0
  132. package/packages/agentsam-workbench/src/agent/tool-permission.css +134 -0
  133. package/packages/connectors/cloudflare/package.json +15 -3
  134. package/packages/connectors/cloudflare/src/api-client.js +3 -2
  135. package/packages/connectors/cloudflare/src/families/vectorize.js +127 -0
  136. package/packages/connectors/cloudflare/src/index.js +1 -0
  137. package/packages/heuristic-theme/README.md +2 -2
  138. package/packages/heuristic-theme/package.json +8 -3
  139. package/packages/heuristic-theme/src/registry.js +2 -2
  140. package/packages/heuristic-theme/src/theme.js +1 -1
  141. package/packages/heuristic-theme/test/theme.test.mjs +1 -1
  142. package/packages/identity/.agentsam/features/oauth-login-portal/agentsam.feature.json +1 -1
  143. package/packages/identity/.agentsam/features/oauth-login-portal/providers.json +27 -7
  144. package/packages/identity/README.md +2 -2
  145. package/packages/identity/migrations/D1_SCHEMA_MAPPING.md +18 -15
  146. package/packages/identity/migrations/apply-portable.js +109 -0
  147. package/packages/identity/migrations/sqlite/004_identity_oauth_consent_catalog.sql +1 -1
  148. package/packages/identity/migrations/sqlite/005_identity_company_native.sql +52 -0
  149. package/packages/identity/package.json +27 -6
  150. package/packages/identity/schema/agentsam.identity/manifest.json +101 -0
  151. package/packages/identity/scripts/local-identity-bridge.mjs +13 -7
  152. package/packages/identity/scripts/preview-auth-portal.mjs +6 -6
  153. package/packages/identity/src/adapters/cloudflare-d1/index.js +8 -401
  154. package/packages/identity/src/adapters/iam-compat/index.js +540 -0
  155. package/packages/identity/src/adapters/portable-d1/index.js +18 -0
  156. package/packages/identity/src/adapters/portable-store.js +479 -0
  157. package/packages/identity/src/adapters/sqlite/index.js +13 -312
  158. package/packages/identity/src/contracts/auth-config.js +0 -1
  159. package/packages/identity/src/contracts/identity-store.js +56 -5
  160. package/packages/identity/src/contracts/provider.js +1 -0
  161. package/packages/identity/src/contracts/sign-in-options.js +104 -0
  162. package/packages/identity/src/core/constants.js +1 -1
  163. package/packages/identity/src/core/session-policy.js +31 -0
  164. package/packages/identity/src/frontend/auth-portal/pages/login.html +6 -6
  165. package/packages/identity/src/frontend/auth-portal/pages/reset.html +5 -5
  166. package/packages/identity/src/frontend/auth-portal/pages/signup.html +5 -5
  167. package/packages/identity/src/frontend/auth-portal/shared/company-branding.js +1 -1
  168. package/packages/identity/src/frontend/auth-portal/shared/desktop-identity-bridge.js +6 -37
  169. package/packages/identity/src/index.js +28 -1
  170. package/packages/identity/src/migrations/README.md +23 -23
  171. package/packages/identity/src/oauth/README.md +1 -1
  172. package/packages/identity/src/oauth/credentials.js +10 -11
  173. package/packages/identity/src/oauth/google-desktop-exchange.js +195 -27
  174. package/packages/identity/src/oauth/iam-platform.js +21 -9
  175. package/packages/identity/src/oauth/native-handoff.js +136 -0
  176. package/packages/identity/src/providers/chatgpt/headers.js +65 -0
  177. package/packages/identity/src/providers/chatgpt/index.js +86 -0
  178. package/packages/identity/src/providers/chatgpt/mapper.js +43 -0
  179. package/packages/identity/src/providers/chatgpt/paths.js +45 -0
  180. package/packages/identity/src/providers/github/oauth.js +1 -2
  181. package/packages/identity/src/providers/github/profile.js +16 -2
  182. package/packages/identity/src/providers/index.js +11 -3
  183. package/packages/identity/src/server/identity-service.js +2 -1
  184. package/packages/identity/src/server/worker-router.js +71 -18
  185. package/packages/identity/tests/chatgpt-provider.test.mjs +75 -0
  186. package/packages/identity/tests/google-desktop-identity-login.test.mjs +210 -0
  187. package/packages/identity/tests/identity-init-scaffold.test.mjs +15 -4
  188. package/packages/identity/tests/lane1-identity-store-parity.test.mjs +527 -0
  189. package/packages/identity/tests/lane1-packed-consumer.test.mjs +175 -0
  190. package/packages/identity/tests/native-oauth-handoff.test.mjs +292 -0
  191. package/packages/identity/tests/oauth-credentials.test.mjs +4 -4
  192. package/packages/identity/tests/preview-auth-portal.test.mjs +4 -2
  193. package/packages/identity/tests/session-routes-policy.test.mjs +13 -1
  194. package/packages/identity/tests/worker-runtime-boundary.test.mjs +11 -0
  195. package/packages/providers/completeful/package.json +7 -2
  196. package/packages/theme-church-site/package.json +17 -6
  197. package/packages/theme-church-site/src/harvest.json +4 -2
  198. package/packages/theme-church-site/src/index.js +7 -3
  199. package/packages/theme-church-site/test/theme.test.mjs +4 -2
  200. package/packages/theme-companions-site/package.json +17 -6
  201. package/packages/theme-companions-site/src/harvest.json +4 -2
  202. package/packages/theme-companions-site/src/index.js +7 -3
  203. package/packages/theme-companions-site/test/theme.test.mjs +4 -2
  204. package/packages/theme-floors-site/package.json +17 -6
  205. package/packages/theme-floors-site/src/harvest.json +4 -2
  206. package/packages/theme-floors-site/src/index.js +7 -3
  207. package/packages/theme-floors-site/test/theme.test.mjs +4 -2
  208. package/packages/theme-fuelnfree-site/package.json +17 -6
  209. package/packages/theme-fuelnfree-site/src/harvest.json +4 -2
  210. package/packages/theme-fuelnfree-site/src/index.js +7 -3
  211. package/packages/theme-fuelnfree-site/test/theme.test.mjs +4 -2
  212. package/packages/theme-handyman-site/package.json +17 -6
  213. package/packages/theme-handyman-site/src/harvest.json +4 -2
  214. package/packages/theme-handyman-site/src/index.js +7 -3
  215. package/packages/theme-handyman-site/test/theme.test.mjs +4 -2
  216. package/packages/theme-insurance-site/package.json +17 -6
  217. package/packages/theme-insurance-site/src/harvest.json +4 -2
  218. package/packages/theme-insurance-site/src/index.js +7 -3
  219. package/packages/theme-insurance-site/test/theme.test.mjs +4 -2
  220. package/packages/theme-scenes/README.md +1 -1
  221. package/packages/theme-scenes/package.json +4 -3
  222. package/packages/theme-scenes/src/registry.js +187 -0
  223. package/packages/theme-shinshu-site/package.json +17 -6
  224. package/packages/theme-shinshu-site/src/harvest.json +4 -2
  225. package/packages/theme-shinshu-site/src/index.js +7 -3
  226. package/packages/theme-shinshu-site/test/theme.test.mjs +4 -2
  227. package/packages/work-graph/package.json +14 -4
  228. package/protocol/FILEMETA_V1.md +2 -2
  229. package/protocol/capabilities/manifest.json +1 -1
  230. package/protocol/database/agentsam.schema-pack.v1.schema.json +72 -0
  231. package/protocol/presets/catalog.json +2 -2
  232. package/protocol/theme-refinery/lineage-registry.json +105 -0
  233. package/protocol/theme-refinery/product-metadata.schema.json +21 -1
  234. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  235. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  236. package/python/tests/test_repository_intelligence.py +30 -0
  237. package/src/cli/command-catalog.js +48 -5
  238. package/src/cli/dispatch.js +1 -0
  239. package/src/cli.js +20 -1
  240. package/src/cloudflare/runtime-status.js +2 -1
  241. package/src/commands/autorag.js +67 -13
  242. package/src/commands/cheat-sheet.js +29 -4
  243. package/src/commands/codebaseindex.js +45 -2
  244. package/src/commands/goap-world.js +134 -0
  245. package/src/commands/goap.js +11 -4
  246. package/src/commands/knowledge.js +59 -2
  247. package/src/commands/machine-binary.js +109 -0
  248. package/src/commands/machine-runtime.js +266 -0
  249. package/src/commands/machine.js +208 -0
  250. package/src/commands/package.js +530 -0
  251. package/src/commands/plan-ledger.js +370 -0
  252. package/src/commands/plan.js +183 -0
  253. package/src/commands/security.js +67 -4
  254. package/src/commands/setup.js +33 -16
  255. package/src/commands/skill.js +78 -17
  256. package/src/commands/status.js +8 -1
  257. package/src/features/resolve.js +1 -0
  258. package/src/knowledge/engine.js +21 -2
  259. package/src/knowledge/runtime-discovery.js +127 -0
  260. package/src/knowledge/source.js +1 -1
  261. package/src/lib/identity-scaffold.js +53 -13
  262. package/src/lib/setup/recipes.js +1 -1
  263. package/src/lib/slash-commands.js +1 -1
  264. package/src/local/runtime-store.js +24 -2
  265. package/src/local/sqlite.js +17 -0
  266. package/src/models/discovery.js +40 -22
  267. package/src/models/inventory-core.d.ts +105 -0
  268. package/src/models/inventory-core.js +54 -6
  269. package/src/sam/operations/package-audit.js +41 -0
  270. package/src/sam/seed.js +2 -0
  271. package/src/security/logs.js +3 -0
  272. package/src/ui/cli/help.js +41 -0
  273. package/apps/client-cms-editor/backend/src/demo-bootstrap.ts +0 -145
  274. package/test/account-session.test.mjs +0 -101
  275. package/test/agent-capabilities.test.mjs +0 -67
  276. package/test/app-authority-context.test.mjs +0 -32
  277. package/test/app-building-skills.test.mjs +0 -61
  278. package/test/apps-scaffold-contract.test.mjs +0 -114
  279. package/test/blender-cad.test.mjs +0 -146
  280. package/test/cad-docker.test.mjs +0 -96
  281. package/test/capabilities.test.mjs +0 -133
  282. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  283. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  284. package/test/cli/eval-live.test.mjs +0 -219
  285. package/test/cli/go.test.mjs +0 -128
  286. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  287. package/test/cli/mcp-client.test.mjs +0 -256
  288. package/test/cli/preferences-runtime.test.mjs +0 -11
  289. package/test/cli/runtime-persist.test.mjs +0 -56
  290. package/test/cli/runtime-ui.test.mjs +0 -141
  291. package/test/cli/rust-command.test.mjs +0 -21
  292. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  293. package/test/cli/status-actions.test.mjs +0 -88
  294. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  295. package/test/cli-preferences.test.mjs +0 -46
  296. package/test/cloudflare-connector.test.mjs +0 -93
  297. package/test/cloudflare-runtime.test.mjs +0 -82
  298. package/test/context.test.mjs +0 -159
  299. package/test/credentials-audit.test.mjs +0 -113
  300. package/test/deploy-health-scan.test.mjs +0 -95
  301. package/test/deploy-receipt.test.mjs +0 -91
  302. package/test/dockerize.test.mjs +0 -93
  303. package/test/error-diagnostics.test.mjs +0 -124
  304. package/test/eval-context.test.mjs +0 -37
  305. package/test/execution-approvals.test.mjs +0 -27
  306. package/test/fixtures/cad/courtyard-house.json +0 -208
  307. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  308. package/test/gcloud-auth.test.mjs +0 -111
  309. package/test/go/build-source-identity.test.mjs +0 -31
  310. package/test/go/cloudflare-probe.test.mjs +0 -317
  311. package/test/go/distribution.test.mjs +0 -28
  312. package/test/google-cloud-connection.test.mjs +0 -83
  313. package/test/google-cloud-inventory.test.mjs +0 -64
  314. package/test/indexing-provider.test.mjs +0 -29
  315. package/test/init-options.test.mjs +0 -35
  316. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  317. package/test/integration/app-command.test.mjs +0 -85
  318. package/test/integration/cad-discovery.test.mjs +0 -158
  319. package/test/integration/cad-docker-executor.test.mjs +0 -249
  320. package/test/integration/cad-execution.test.mjs +0 -184
  321. package/test/integration/cad-project-app.test.mjs +0 -31
  322. package/test/integration/cad-project-d1.test.mjs +0 -25
  323. package/test/integration/cad-project-native.test.mjs +0 -24
  324. package/test/integration/cad-project-workflow.test.mjs +0 -9
  325. package/test/integration/cad-project.test.mjs +0 -85
  326. package/test/integration/cli-help.test.mjs +0 -41
  327. package/test/integration/cms-app-scaffold.test.mjs +0 -71
  328. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -257
  329. package/test/integration/codebaseindex-ingest.test.mjs +0 -214
  330. package/test/integration/core-client.integration.test.mjs +0 -55
  331. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  332. package/test/integration/features-resolve.test.mjs +0 -147
  333. package/test/integration/icon-registry.test.mjs +0 -67
  334. package/test/integration/ingest-discover-models.test.mjs +0 -30
  335. package/test/integration/inspect-path-cli.test.mjs +0 -46
  336. package/test/integration/install-script.test.mjs +0 -110
  337. package/test/integration/inventory-core.test.mjs +0 -53
  338. package/test/integration/inventory-evidence.test.mjs +0 -125
  339. package/test/integration/knowledge-rpc.test.mjs +0 -112
  340. package/test/integration/local-fs.test.mjs +0 -113
  341. package/test/integration/merkle-cli.test.mjs +0 -61
  342. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  343. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  344. package/test/integration/provider-env-cli.test.mjs +0 -50
  345. package/test/integration/provider-factory.test.mjs +0 -197
  346. package/test/integration/repository-company-graph.test.mjs +0 -90
  347. package/test/integration/runtime-migrations.test.mjs +0 -87
  348. package/test/integration/runtime-status.integration.test.mjs +0 -212
  349. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  350. package/test/integration/sam-decision.test.mjs +0 -584
  351. package/test/integration/sam-kernel.test.mjs +0 -99
  352. package/test/integration/sam-planning-astar.test.mjs +0 -279
  353. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  354. package/test/integration/skill-runtime.test.mjs +0 -240
  355. package/test/integration/storage-architecture.test.mjs +0 -154
  356. package/test/integration/store-discovery.test.mjs +0 -44
  357. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  358. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  359. package/test/integration/tool-runtime.test.mjs +0 -124
  360. package/test/integration/tool-schema.test.mjs +0 -59
  361. package/test/jr-dev-skill.test.mjs +0 -26
  362. package/test/knowledge-context-pack.test.mjs +0 -19
  363. package/test/knowledge-postgres.test.mjs +0 -40
  364. package/test/knowledge-service.test.mjs +0 -110
  365. package/test/knowledge.test.mjs +0 -206
  366. package/test/live/terminal-transport.live.test.mjs +0 -24
  367. package/test/local-sessions.test.mjs +0 -57
  368. package/test/local-studio-deploy.test.mjs +0 -83
  369. package/test/loopback-oauth.test.mjs +0 -53
  370. package/test/merkle-render.test.mjs +0 -31
  371. package/test/mini.test.mjs +0 -140
  372. package/test/model-catalog.test.mjs +0 -70
  373. package/test/models.test.mjs +0 -309
  374. package/test/npm10-lock.test.mjs +0 -29
  375. package/test/ollama.test.mjs +0 -137
  376. package/test/open-url.test.mjs +0 -64
  377. package/test/openai-responses.test.mjs +0 -155
  378. package/test/portable-context.test.mjs +0 -94
  379. package/test/project-config.test.mjs +0 -81
  380. package/test/project-rules.test.mjs +0 -44
  381. package/test/provider-credentials.test.mjs +0 -106
  382. package/test/rehydrate.test.mjs +0 -25
  383. package/test/release-hygiene.test.mjs +0 -42
  384. package/test/repository-snapshot-view.test.mjs +0 -112
  385. package/test/responses-runner.test.mjs +0 -465
  386. package/test/runtime-activity.test.mjs +0 -98
  387. package/test/sdk-worker-contract.test.mjs +0 -72
  388. package/test/security.test.mjs +0 -252
  389. package/test/setup-planner.test.mjs +0 -74
  390. package/test/setup-runtime.test.mjs +0 -51
  391. package/test/shell.test.mjs +0 -281
  392. package/test/skills.test.mjs +0 -22
  393. package/test/smoke.mjs +0 -122
  394. package/test/telemetry.test.mjs +0 -79
  395. package/test/terminal/local-pty.mock.test.mjs +0 -153
  396. package/test/terminal-machine-identity.test.mjs +0 -88
  397. package/test/theme-portability.test.mjs +0 -14
  398. package/test/tools-search.test.mjs +0 -73
  399. package/test/unit/website-assets-bindings.test.mjs +0 -60
  400. package/test/whoami-resume.test.mjs +0 -157
@@ -1,268 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import test from 'node:test';
6
-
7
- import {
8
- getSecureProviderKey,
9
- setSecureProviderKey,
10
- deleteSecureProviderKey,
11
- listSecureConfiguredProviders,
12
- hydrateSecureCredentials,
13
- localVaultPath,
14
- localVaultSaltPath,
15
- } from '../../src/security/local-vault.js';
16
- import { resolveExecutableCommand } from '../../src/security/process.js';
17
- import {
18
- resolveProviderCredential,
19
- setProviderCredential,
20
- removeProviderCredential,
21
- exportProviderEnvProfile,
22
- } from '../../src/lib/provider-credentials.js';
23
- import {
24
- validateAndSaveProviderCredential,
25
- providerChoices,
26
- runProviders,
27
- } from '../../src/commands/providers.js';
28
- import { renderModelsStatus } from '../../src/commands/models.js';
29
-
30
- // picocolors color-detection differs between local runs and CI runners (CI often
31
- // reports TTY-like support that enables ANSI output) - strip escape codes before
32
- // asserting on rendered text content so this test checks content, not incidental
33
- // terminal color state.
34
- // eslint-disable-next-line no-control-regex
35
- const ANSI_PATTERN = /\x1B\[[0-9;]*m/g;
36
- const stripAnsi = (s) => String(s).replace(ANSI_PATTERN, '');
37
-
38
- function createTempHome(t) {
39
- const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-vault-test-'));
40
- t.after(() => fs.rmSync(home, { recursive: true, force: true }));
41
- return home;
42
- }
43
-
44
- test('resolveExecutableCommand resolves Windows .cmd shims with shell: true on win32', () => {
45
- const npxWin = resolveExecutableCommand('npx', 'win32');
46
- assert.equal(npxWin.command, 'npx.cmd');
47
- assert.equal(npxWin.shell, true);
48
-
49
- const npmWin = resolveExecutableCommand('npm', 'win32');
50
- assert.equal(npmWin.command, 'npm.cmd');
51
- assert.equal(npmWin.shell, true);
52
-
53
- const wranglerWin = resolveExecutableCommand('wrangler', 'win32');
54
- assert.equal(wranglerWin.command, 'wrangler.cmd');
55
- assert.equal(wranglerWin.shell, true);
56
-
57
- const scriptWin = resolveExecutableCommand('build.bat', 'win32');
58
- assert.equal(scriptWin.command, 'build.bat');
59
- assert.equal(scriptWin.shell, true);
60
-
61
- // Linux and macOS are untouched
62
- const npxMac = resolveExecutableCommand('npx', 'darwin');
63
- assert.equal(npxMac.command, 'npx');
64
- assert.equal(npxMac.shell, false);
65
-
66
- const npmLinux = resolveExecutableCommand('npm', 'linux');
67
- assert.equal(npmLinux.command, 'npm');
68
- assert.equal(npmLinux.shell, false);
69
- });
70
-
71
- test('local vault encrypts with AES-256-GCM and never writes plaintext secrets to disk', (t) => {
72
- const home = createTempHome(t);
73
- const opts = { home, disableOsStore: true };
74
-
75
- const secret = 'sk-proj-testsecret1234567890abcdef';
76
- setSecureProviderKey('openai', secret, opts);
77
-
78
- const retrieved = getSecureProviderKey('openai', opts);
79
- assert.equal(retrieved.value, secret);
80
- assert.equal(retrieved.source, 'local_vault');
81
-
82
- // Verify disk contents
83
- const encFile = localVaultPath(opts);
84
- assert.equal(fs.existsSync(encFile), true);
85
- const rawText = fs.readFileSync(encFile, 'utf8');
86
-
87
- // Plaintext MUST NOT appear anywhere in the file
88
- assert.equal(rawText.includes(secret), false);
89
-
90
- // Must have JSON with iv, tag, and data
91
- const parsed = JSON.parse(rawText);
92
- assert.ok(parsed.secrets.openai.iv);
93
- assert.ok(parsed.secrets.openai.tag);
94
- assert.ok(parsed.secrets.openai.data);
95
-
96
- // Salt file must exist with restrictive permissions
97
- const saltFile = localVaultSaltPath(opts);
98
- assert.equal(fs.existsSync(saltFile), true);
99
- if (process.platform !== 'win32') {
100
- assert.equal(fs.statSync(saltFile).mode & 0o777, 0o600);
101
- assert.equal(fs.statSync(encFile).mode & 0o777, 0o600);
102
- }
103
- });
104
-
105
- test('local vault detects tampering of encrypted ciphertext', (t) => {
106
- const home = createTempHome(t);
107
- const opts = { home, disableOsStore: true };
108
-
109
- setSecureProviderKey('anthropic', 'sk-ant-test-key-12345', opts);
110
-
111
- // Tamper with the ciphertext
112
- const encFile = localVaultPath(opts);
113
- const parsed = JSON.parse(fs.readFileSync(encFile, 'utf8'));
114
- const originalData = parsed.secrets.anthropic.data;
115
- // Flip the last hex byte
116
- const tamperedData = originalData.slice(0, -2) + (originalData.slice(-2) === 'aa' ? 'bb' : 'aa');
117
- parsed.secrets.anthropic.data = tamperedData;
118
- fs.writeFileSync(encFile, JSON.stringify(parsed));
119
-
120
- // Decryption must fail and return null safely rather than corrupt data
121
- const retrieved = getSecureProviderKey('anthropic', opts);
122
- assert.equal(retrieved, null);
123
- });
124
-
125
- test('local vault stores and retrieves Cloudflare accountId alongside token', (t) => {
126
- const home = createTempHome(t);
127
- const opts = { home, disableOsStore: true };
128
-
129
- setSecureProviderKey('cloudflare', { value: 'cf-token-123', accountId: 'abcdef0123456789abcdef0123456789' }, opts);
130
- const retrieved = getSecureProviderKey('cloudflare', opts);
131
-
132
- assert.equal(retrieved.value, 'cf-token-123');
133
- assert.equal(retrieved.accountId, 'abcdef0123456789abcdef0123456789');
134
- });
135
-
136
- test('hydrateSecureCredentials populates process.env for unconfigured providers without overwriting', (t) => {
137
- const home = createTempHome(t);
138
- const opts = { home, disableOsStore: true };
139
-
140
- setSecureProviderKey('gemini', 'gemini-key-val-789', opts);
141
-
142
- const mockEnv = {
143
- EXISTING_KEY: 'pre-existing',
144
- };
145
-
146
- const hydrated = hydrateSecureCredentials(mockEnv, opts);
147
- assert.ok(hydrated.includes('gemini'));
148
- assert.equal(mockEnv.GEMINI_API_KEY, 'gemini-key-val-789');
149
-
150
- // Second run does not overwrite
151
- mockEnv.GEMINI_API_KEY = 'user-override';
152
- hydrateSecureCredentials(mockEnv, opts);
153
- assert.equal(mockEnv.GEMINI_API_KEY, 'user-override');
154
- });
155
-
156
- test('resolveProviderCredential resolves keys from local secure vault across any directory', (t) => {
157
- const home = createTempHome(t);
158
- const opts = { home, disableOsStore: true };
159
-
160
- setProviderCredential('cursor', 'cur-key-secret-456', opts);
161
-
162
- const resolved = resolveProviderCredential('cursor', { env: {}, home, disableOsStore: true });
163
- assert.equal(resolved.configured, true);
164
- assert.equal(resolved.value, 'cur-key-secret-456');
165
-
166
- // Deleting removes it
167
- removeProviderCredential('cursor', opts);
168
- const afterRemove = resolveProviderCredential('cursor', { env: {}, home, disableOsStore: true });
169
- assert.equal(afterRemove.configured, false);
170
- });
171
-
172
- test('validateAndSaveProviderCredential rejects invalid key and does NOT persist it', async (t) => {
173
- const home = createTempHome(t);
174
- const opts = {
175
- home,
176
- disableOsStore: true,
177
- fetchImpl: async () => ({
178
- ok: false,
179
- status: 401,
180
- json: async () => ({ error: { message: 'Incorrect API key provided' } }),
181
- }),
182
- };
183
-
184
- const result = await validateAndSaveProviderCredential('openai', 'sk-invalid-test-key', opts);
185
- assert.equal(result.ok, false);
186
- assert.equal(result.saved, false);
187
- assert.match(result.error, /Incorrect API key/i);
188
-
189
- // Verify it was NOT stored in the vault!
190
- const retrieved = getSecureProviderKey('openai', opts);
191
- assert.equal(retrieved, null);
192
- });
193
-
194
- test('validateAndSaveProviderCredential verifies valid key and saves ONLY to local vault without plaintext file', async (t) => {
195
- const home = createTempHome(t);
196
- const opts = {
197
- home,
198
- disableOsStore: true,
199
- fetchImpl: async () => ({
200
- ok: true,
201
- status: 200,
202
- json: async () => ({
203
- data: [{ id: 'gpt-4o' }, { id: 'gpt-4o-mini' }],
204
- }),
205
- }),
206
- };
207
-
208
- const result = await validateAndSaveProviderCredential('openai', 'sk-valid-key-xyz', opts);
209
- assert.equal(result.ok, true);
210
- assert.equal(result.saved, true);
211
- assert.equal(result.model_count, 2);
212
-
213
- // Verify it was saved to local vault
214
- const retrieved = getSecureProviderKey('openai', opts);
215
- assert.equal(retrieved.value, 'sk-valid-key-xyz');
216
-
217
- // CRITICAL: Plaintext .env profile file MUST NOT be created automatically!
218
- const plaintextFile = path.join(home, '.agentsam', 'env.d', 'openai.env');
219
- assert.equal(fs.existsSync(plaintextFile), false, 'Plaintext .env file must NOT exist after secure provider setup');
220
- });
221
-
222
- test('exportProviderEnvProfile and agentsam providers export create plaintext .env file ONLY on explicit opt-in', async (t) => {
223
- const home = createTempHome(t);
224
- const opts = { home, disableOsStore: true };
225
-
226
- // Set up provider key in secure vault
227
- setProviderCredential('anthropic', 'sk-ant-test-export-key', opts);
228
-
229
- // Confirm NO plaintext file exists yet
230
- const plaintextFile = path.join(home, '.agentsam', 'env.d', 'anthropic.env');
231
- assert.equal(fs.existsSync(plaintextFile), false);
232
-
233
- // Explicit opt-in export via CLI command
234
- let output = '';
235
- const exported = await runProviders(['export', 'anthropic'], {
236
- ...opts,
237
- write: (text) => { output += text; },
238
- });
239
-
240
- assert.equal(exported.provider, 'anthropic');
241
- assert.equal(fs.existsSync(plaintextFile), true);
242
- const content = fs.readFileSync(plaintextFile, 'utf8');
243
- assert.match(content, /ANTHROPIC_API_KEY="sk-ant-test-export-key"/);
244
- assert.match(output, /Exported anthropic profile/);
245
- });
246
-
247
- test('renderModelsStatus shows tip: Select your preferred provider when providers are unconfigured', () => {
248
- const status = {
249
- providers: [
250
- { id: 'openai', label: 'OpenAI', configured: false, credential: 'OPENAI_API_KEY' },
251
- { id: 'anthropic', label: 'Anthropic', configured: false, credential: 'ANTHROPIC_API_KEY' },
252
- ],
253
- discovery: {},
254
- providerModels: {},
255
- local: { online: false, models: [] },
256
- };
257
-
258
- const output = stripAnsi(renderModelsStatus(status));
259
- assert.match(output, /Tip:\s*Select your preferred provider/i);
260
- });
261
-
262
- test('providerChoices returns valid choice list for select picker', () => {
263
- const choices = providerChoices();
264
- assert.ok(choices.length >= 6);
265
- assert.ok(choices.some((c) => c.value === 'openai'));
266
- assert.ok(choices.some((c) => c.value === 'anthropic'));
267
- assert.ok(choices.some((c) => c.value === 'gemini'));
268
- });
@@ -1,256 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import os from 'node:os';
4
- import path from 'node:path';
5
- import test from 'node:test';
6
-
7
- import {
8
- MCP_PRESETS,
9
- deleteMcpServer,
10
- fetchExternalClientRegistry,
11
- fetchMcpServerCatalog,
12
- getClientConfigPath,
13
- getClientRegistryCachePath,
14
- getServerCatalogCachePath,
15
- getSessionToolReceipts,
16
- inspectClientAdapter,
17
- isClientRegistered,
18
- listKnownServers,
19
- listMcpServers,
20
- listRegisteredClients,
21
- readMcpServer,
22
- recordToolReceipt,
23
- removeServerFromClient,
24
- resolveServerPreset,
25
- summarizeToolReceipts,
26
- syncServerToClient,
27
- writeMcpServer,
28
- } from '../../src/mcp/index.js';
29
- import { runMcp } from '../../src/commands/mcp.js';
30
-
31
- function tempHome() {
32
- return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-mcp-test-'));
33
- }
34
-
35
- test('MCP authority store manages servers under ~/.agentsam/mcp with safe permissions', () => {
36
- const home = tempHome();
37
- const config = {
38
- url: 'https://mcp.inneranimalmedia.com/mcp',
39
- auth: { type: 'bearer', token: 'iam_token_abc' },
40
- clients: ['cursor', 'claude'],
41
- };
42
-
43
- const written = writeMcpServer('inneranimalmedia', config, { home });
44
- assert.equal(written.name, 'inneranimalmedia');
45
- assert.equal(written.url, 'https://mcp.inneranimalmedia.com/mcp');
46
-
47
- const read = readMcpServer('inneranimalmedia', { home });
48
- assert.equal(read.name, 'inneranimalmedia');
49
- assert.equal(read.auth.token, 'iam_token_abc');
50
- assert.deepEqual(read.clients, ['cursor', 'claude']);
51
-
52
- const list = listMcpServers({ home });
53
- assert.equal(list.length, 1);
54
- assert.equal(list[0].name, 'inneranimalmedia');
55
-
56
- const deleted = deleteMcpServer('inneranimalmedia', { home });
57
- assert.equal(deleted, true);
58
- assert.equal(readMcpServer('inneranimalmedia', { home }), null);
59
- });
60
-
61
- test('MCP external client registry recognizes chatgpt, claude, cursor — not CF portals', async () => {
62
- const home = tempHome();
63
-
64
- // Baseline seed / cached client list
65
- const clients = listRegisteredClients({ home });
66
- const keys = clients.map((c) => c.client_key);
67
- assert.ok(keys.includes('chatgpt'), 'ChatGPT is recognized in the external client registry');
68
- assert.ok(keys.includes('cursor'), 'Cursor is recognized in the external client registry');
69
- assert.ok(keys.includes('claude'), 'Claude is recognized in the external client registry');
70
- assert.ok(keys.includes('agentsam'), 'AgentSam is recognized in the external client registry');
71
- assert.equal(keys.some((k) => k.startsWith('cf_')), false, 'CF MCP portals are servers, not clients');
72
-
73
- assert.equal(isClientRegistered('chatgpt', { home }), true);
74
- assert.equal(isClientRegistered('cursor', { home }), true);
75
- assert.equal(isClientRegistered('cf_bindings_mcp', { home }), false);
76
- assert.equal(isClientRegistered('nonexistent_client_xyz', { home }), false);
77
-
78
- // Cache path is created upon writing
79
- const cachePath = getClientRegistryCachePath({ home });
80
- assert.equal(cachePath.endsWith('client-registry-cache.json'), true);
81
- });
82
-
83
- test('MCP client adapters materialize Cursor, Claude, and ChatGPT configurations cleanly', () => {
84
- const home = tempHome();
85
- const serverConfig = {
86
- url: 'https://mcp.inneranimalmedia.com/mcp',
87
- auth: { type: 'bearer', token: 'oauth_cursor_123' },
88
- };
89
-
90
- // Pre-seed an existing server in Cursor config to ensure no clobbering
91
- const cursorConfigPath = getClientConfigPath('cursor', { home });
92
- fs.mkdirSync(path.dirname(cursorConfigPath), { recursive: true });
93
- fs.writeFileSync(
94
- cursorConfigPath,
95
- JSON.stringify({ mcpServers: { other_server: { url: 'http://localhost:8080' } } })
96
- );
97
-
98
- // Sync to Cursor
99
- const cursorResult = syncServerToClient('cursor', 'inneranimalmedia', serverConfig, { home });
100
- assert.equal(cursorResult.synced, true);
101
-
102
- const cursorContent = JSON.parse(fs.readFileSync(cursorConfigPath, 'utf8'));
103
- assert.ok(cursorContent.mcpServers.other_server, 'Preserved other server in Cursor config');
104
- assert.equal(cursorContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
105
- assert.equal(cursorContent.mcpServers.inneranimalmedia.headers.Authorization, 'Bearer oauth_cursor_123');
106
- assert.equal(cursorContent.mcpServers.inneranimalmedia.headers.Accept, 'application/json, text/event-stream');
107
-
108
- // Inspect Cursor adapter
109
- const inspection = inspectClientAdapter('cursor', 'inneranimalmedia', { home });
110
- assert.equal(inspection.configured, true);
111
- assert.equal(inspection.present, true);
112
-
113
- // Sync to Claude
114
- const claudeResult = syncServerToClient('claude', 'inneranimalmedia', serverConfig, { home });
115
- assert.equal(claudeResult.synced, true);
116
- const claudeConfigPath = getClientConfigPath('claude', { home });
117
- const claudeContent = JSON.parse(fs.readFileSync(claudeConfigPath, 'utf8'));
118
- assert.equal(claudeContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
119
-
120
- // Sync to ChatGPT
121
- const chatgptResult = syncServerToClient('chatgpt', 'inneranimalmedia', serverConfig, { home });
122
- assert.equal(chatgptResult.synced, true);
123
- const chatgptConfigPath = getClientConfigPath('chatgpt', { home });
124
- assert.ok(fs.existsSync(chatgptConfigPath));
125
- const chatgptContent = JSON.parse(fs.readFileSync(chatgptConfigPath, 'utf8'));
126
- assert.equal(chatgptContent.name, 'inneranimalmedia');
127
- assert.equal(chatgptContent.server_url, 'https://mcp.inneranimalmedia.com/mcp');
128
- assert.equal(chatgptContent.schema, 'agentsam.mcp.client-adapter.chatgpt.v1');
129
-
130
- // Sync to AgentSam family adapter (~/.agentsam/mcp.json)
131
- const agentsamResult = syncServerToClient('agentsam', 'inneranimalmedia', serverConfig, { home });
132
- assert.equal(agentsamResult.synced, true);
133
- const agentsamConfigPath = getClientConfigPath('agentsam', { home });
134
- assert.equal(agentsamConfigPath, path.join(home, '.agentsam', 'mcp.json'));
135
- assert.ok(fs.existsSync(agentsamConfigPath));
136
- const agentsamContent = JSON.parse(fs.readFileSync(agentsamConfigPath, 'utf8'));
137
- assert.equal(agentsamContent.mcpServers.inneranimalmedia.url, 'https://mcp.inneranimalmedia.com/mcp');
138
- assert.equal(agentsamContent.mcpServers.inneranimalmedia.headers.Authorization, 'Bearer oauth_cursor_123');
139
-
140
- // Remove from Cursor
141
- const removeResult = removeServerFromClient('cursor', 'inneranimalmedia', { home });
142
- assert.equal(removeResult.removed, true);
143
- const postRemove = JSON.parse(fs.readFileSync(cursorConfigPath, 'utf8'));
144
- assert.equal(postRemove.mcpServers.inneranimalmedia, undefined);
145
- assert.ok(postRemove.mcpServers.other_server, 'Still preserved other server');
146
-
147
- // Remove from AgentSam family adapter
148
- const removeAgentsam = removeServerFromClient('agentsam', 'inneranimalmedia', { home });
149
- assert.equal(removeAgentsam.removed, true);
150
- const postRemoveAgentsam = JSON.parse(fs.readFileSync(agentsamConfigPath, 'utf8'));
151
- assert.equal(postRemoveAgentsam.mcpServers.inneranimalmedia, undefined);
152
-
153
- // Remove from ChatGPT
154
- const removeChatgpt = removeServerFromClient('chatgpt', 'inneranimalmedia', { home });
155
- assert.equal(removeChatgpt.removed, true);
156
- assert.equal(fs.existsSync(chatgptConfigPath), false);
157
- });
158
-
159
- test('MCP server catalog resolves CF portal bundles + IAM without fabricated health', () => {
160
- const home = tempHome();
161
- const catalog = listKnownServers({ home });
162
- assert.ok(catalog.length >= 8);
163
-
164
- const cfApi = resolveServerPreset('cloudflare-api', { home });
165
- assert.ok(cfApi);
166
- assert.equal(cfApi.url, 'https://mcp.cloudflare.com/mcp');
167
- assert.equal(cfApi.provider, 'cloudflare');
168
- assert.equal(cfApi.kind, 'mcp_portal_bundle');
169
- assert.ok(cfApi.portal_manage_scopes.includes('mcp-portals.read'));
170
-
171
- const bindings = resolveServerPreset('cloudflare-bindings', { home });
172
- assert.ok(bindings);
173
- assert.ok(bindings.feature_packs.includes('data'));
174
-
175
- const iam = resolveServerPreset('inneranimalmedia', { home });
176
- assert.ok(iam);
177
- assert.equal(iam.url, 'https://mcp.inneranimalmedia.com/mcp');
178
- });
179
-
180
- test('MCP telemetry logs tool receipts and computes accurate summaries', () => {
181
- const home = tempHome();
182
-
183
- recordToolReceipt({ tool_key: 'github_read', source_client: 'cursor', duration_ms: 120 }, { home });
184
- recordToolReceipt({ tool_key: 'mcp:d1_query', source_client: 'cursor_mcp', duration_ms: 45 }, { home });
185
- recordToolReceipt({ tool_key: 'terminal_exec', source_client: 'agentsam', duration_ms: 800 }, { home });
186
- recordToolReceipt({ tool_key: 'mcp:tool_broken', error_code: 'TIMEOUT', duration_ms: 5000 }, { home });
187
-
188
- const receipts = getSessionToolReceipts({ home });
189
- assert.equal(receipts.length, 4);
190
-
191
- const summary = summarizeToolReceipts(receipts);
192
- assert.equal(summary.tool_call_count, 4);
193
- assert.equal(summary.mcp_call_count, 2);
194
- assert.equal(summary.github_call_count, 1);
195
- assert.equal(summary.d1_call_count, 1);
196
- assert.equal(summary.terminal_call_count, 1);
197
- assert.equal(summary.failure_count, 1);
198
- assert.equal(summary.success_count, 3);
199
- });
200
-
201
- test('agentsam mcp CLI handles add, list, status, doctor, and remove end-to-end', async () => {
202
- const home = tempHome();
203
- const logs = [];
204
- const write = (str) => logs.push(str);
205
-
206
- // Test --help output surfaces chatgpt and known catalog servers
207
- await runMcp(['--help'], { home, write });
208
- const helpText = logs.join('\n');
209
- assert.ok(helpText.includes('chatgpt'), 'Help text displays ChatGPT as a recognized client');
210
- assert.ok(helpText.includes('cloudflare-api'), 'Help text displays cloudflare-api preset');
211
- assert.ok(helpText.includes('bindings.mcp.cloudflare.com') || helpText.includes('cloudflare-bindings'), 'CF portal hostnames remain offerable');
212
- logs.length = 0;
213
-
214
- // Add inneranimalmedia preset for chatgpt client
215
- const addRes = await runMcp(
216
- ['add', 'inneranimalmedia', '--client', 'chatgpt', '--token', 'test_tok_777', '--json'],
217
- { home, write }
218
- );
219
- assert.equal(addRes.ok, true);
220
- assert.equal(addRes.server.name, 'inneranimalmedia');
221
- assert.equal(addRes.server.auth.token, 'test_tok_777');
222
- assert.equal(addRes.syncedAdapters[0].client, 'chatgpt');
223
-
224
- // List
225
- const listRes = await runMcp(['list', '--json'], { home, write });
226
- assert.equal(listRes.length, 1);
227
- assert.equal(listRes[0].name, 'inneranimalmedia');
228
-
229
- // List catalog
230
- const catalogRes = await runMcp(['list', '--catalog', '--json'], { home, write });
231
- assert.ok(catalogRes.length >= 8);
232
-
233
- // Status
234
- const statusRes = await runMcp(['status', 'inneranimalmedia', '--json'], { home, write });
235
- assert.equal(statusRes.name, 'inneranimalmedia');
236
- assert.equal(statusRes.hasAuth, true);
237
-
238
- // Doctor includes catalog / CF pack metadata
239
- const doctorRes = await runMcp(['doctor', 'inneranimalmedia', '--json'], { home, write });
240
- assert.equal(doctorRes.name, 'inneranimalmedia');
241
- assert.equal(doctorRes.authConfigured, true);
242
- assert.equal(doctorRes.catalog?.auth_type, 'bearer');
243
-
244
- // Cloudflare bundle scopes are pack-scoped (includes mcp-portals.*)
245
- const scopeRes = await runMcp(['scopes', 'cloudflare-bindings', '--json'], { home, write });
246
- assert.ok(scopeRes.oauth_scopes.includes('mcp-portals.read'));
247
- assert.ok(scopeRes.oauth_scopes.includes('mcp-portals.write'));
248
- assert.ok(scopeRes.oauth_scopes.includes('d1.read'));
249
-
250
- // Remove
251
- const removeRes = await runMcp(['remove', 'inneranimalmedia', '--client', 'all', '--json'], { home, write });
252
- assert.equal(removeRes.deletedAuthority, true);
253
-
254
- const emptyList = await runMcp(['list', '--json'], { home, write });
255
- assert.equal(emptyList.length, 0);
256
- });
@@ -1,11 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { runtimeOptions } from '../../src/commands/preferences.js';
4
-
5
- test('standalone users only see local execution', () => {
6
- assert.deepEqual(runtimeOptions({ accountConnected: false }).map((row) => row.value), ['local']);
7
- });
8
-
9
- test('IAM-connected users can choose enrolled remote and sandbox lanes', () => {
10
- assert.deepEqual(runtimeOptions({ accountConnected: true }).map((row) => row.value), ['local', 'remote', 'sandbox']);
11
- });
@@ -1,56 +0,0 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import fs from 'node:fs';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import {
7
- buildWindowsScheduledTaskXml,
8
- buildLaunchAgentPlist,
9
- writeWindowsScheduledTask,
10
- WINDOWS_TASK_NAME,
11
- } from '../../src/lib/setup/runtime-persist.js';
12
-
13
- test('buildWindowsScheduledTaskXml includes binary, listen, logon trigger', () => {
14
- const xml = buildWindowsScheduledTaskXml({
15
- binary: 'C:\\Users\\sam\\.agentsam\\bin\\agentsamd.exe',
16
- listen: '127.0.0.1:18765',
17
- workingDirectory: 'C:\\Users\\sam\\.agentsam\\bin',
18
- });
19
- assert.match(xml, /agentsamd\.exe/);
20
- assert.match(xml, /--listen 127\.0\.0\.1:18765/);
21
- assert.match(xml, /LogonTrigger/);
22
- assert.match(xml, /InteractiveToken/);
23
- assert.match(xml, /RestartOnFailure/);
24
- });
25
-
26
- test('buildLaunchAgentPlist includes KeepAlive and listen', () => {
27
- const plist = buildLaunchAgentPlist({
28
- binary: '/Users/sam/.agentsam/bin/agentsamd',
29
- listen: '127.0.0.1:18765',
30
- stdoutLog: '/tmp/out.log',
31
- stderrLog: '/tmp/err.log',
32
- });
33
- assert.match(plist, /com\.inneranimalmedia\.agentsamd/);
34
- assert.match(plist, /KeepAlive/);
35
- assert.match(plist, /127\.0\.0\.1:18765/);
36
- });
37
-
38
- test('writeWindowsScheduledTask writes XML without calling schtasks when skipRegister', async () => {
39
- const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-runtime-'));
40
- try {
41
- const result = await writeWindowsScheduledTask(
42
- home,
43
- path.join(home, '.agentsam', 'bin', 'agentsamd.exe'),
44
- '127.0.0.1:18765',
45
- { forcePlatform: 'win32', skipRegister: true },
46
- );
47
- assert.equal(result.kind, 'scheduled_task');
48
- assert.equal(result.taskName, WINDOWS_TASK_NAME);
49
- assert.equal(result.registered, false);
50
- assert.ok(fs.existsSync(result.xmlPath));
51
- const xml = fs.readFileSync(result.xmlPath, 'utf8');
52
- assert.match(xml, /agentsamd\.exe/);
53
- } finally {
54
- fs.rmSync(home, { recursive: true, force: true });
55
- }
56
- });