@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,141 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { createInlineActivity, INTERRUPT_HINT, renderShimmer } from '../../src/ui/cli/activity.js';
4
- import { renderCliFooter, renderDiffPreview } from '../../src/ui/cli/footer.js';
5
- import { createCliRuntimePresenter, normalizeRuntimeEventEnvelope, RUNTIME_EVENT_ENVELOPE_SCHEMA } from '../../src/ui/cli/runtime-events.js';
6
- import { renderWaitingInput } from '../../src/ui/cli/waiting.js';
7
-
8
- const stripAnsi = (text) => String(text || '').replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
9
-
10
- test('CLI footer reports unknown context honestly', () => {
11
- const text = renderCliFooter({
12
- model: 'claude-test',
13
- usageSnapshot: {
14
- current_context: { input_tokens: 1234, window_tokens: 0 },
15
- cumulative: { input_tokens: 5000, output_tokens: 600, cached_input_tokens: 2000 },
16
- },
17
- });
18
- assert.match(text, /claude-test/);
19
- assert.match(text, /ctx 1\.2k \/ unknown/);
20
- assert.match(text, /↑5k ↓600/);
21
- assert.match(text, /cache 2k/);
22
- });
23
-
24
- test('CLI footer shows project identity, branch, and shortcut hints', () => {
25
- const text = stripAnsi(renderCliFooter({
26
- project: 'agentsam-sdk',
27
- cwd: '/Users/sam/agentsam-sdk',
28
- branch: 'feat/cli-interactive-presence',
29
- model: 'claude-test',
30
- }));
31
- assert.match(text, /agentsam-sdk/);
32
- assert.match(text, /feat\/cli-interactive-presence/);
33
- assert.match(text, /ctrl-c to cancel/);
34
- assert.match(text, /\/ commands/);
35
- });
36
-
37
- test('diff preview colors hunks and keeps NO_COLOR output readable', () => {
38
- const diff = [
39
- 'diff --git a/src/ui/cli/footer.js b/src/ui/cli/footer.js',
40
- '--- a/src/ui/cli/footer.js',
41
- '+++ b/src/ui/cli/footer.js',
42
- '@@ -1,3 +1,4 @@',
43
- ' import pc from \'picocolors\';',
44
- '-const old = 1;',
45
- '+const next = 2;',
46
- ' keep',
47
- ].join('\n');
48
- const colored = renderDiffPreview(diff, { color: true });
49
- assert.match(colored, /\x1b\[/);
50
- assert.match(stripAnsi(colored), /\+const next = 2;/);
51
- const plain = renderDiffPreview(diff, { color: false });
52
- assert.doesNotMatch(plain, /\x1b\[/);
53
- assert.match(plain, /-const old = 1;/);
54
- assert.equal(stripAnsi(renderDiffPreview('', { color: false })).trim(), 'no changes');
55
- });
56
-
57
- test('inline activity shows elapsed time and ctrl-c cancel hint', () => {
58
- let output = '';
59
- let now = 0;
60
- let tick = null;
61
- const activity = createInlineActivity({
62
- write: (value) => { output += value; },
63
- interactive: true,
64
- env: { NO_COLOR: '1' },
65
- now: () => now,
66
- setInterval: (fn) => { tick = fn; return 1; },
67
- clearInterval() {},
68
- });
69
- activity.start('Working');
70
- now = 1500;
71
- tick();
72
- const clean = stripAnsi(output);
73
- assert.match(clean, /Working/);
74
- assert.match(clean, /1\.5s/);
75
- assert.match(clean, new RegExp(INTERRUPT_HINT.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
76
- activity.clear();
77
- });
78
-
79
- test('shimmer uses color when allowed and stays plain under NO_COLOR', () => {
80
- const colored = renderShimmer('Working', 4, { env: { COLORTERM: 'truecolor' } });
81
- assert.match(colored, /\x1b\[38;2;/);
82
- assert.match(stripAnsi(colored), /Working/);
83
- const fallback = renderShimmer('Working', 4, { env: { TERM: 'xterm-256color' } });
84
- assert.match(fallback, /\x1b\[38;5;/);
85
- const plain = renderShimmer('Working', 4, { env: { NO_COLOR: '1', COLORTERM: 'truecolor' } });
86
- assert.equal(plain, 'Working');
87
- });
88
-
89
- test('runtime event envelope is the single standalone/platform producer contract', () => {
90
- const envelope = normalizeRuntimeEventEnvelope({
91
- schema_version: 1,
92
- type: 'tool.started',
93
- timestamp: '2026-09-18T00:00:00.000Z',
94
- run_id: 'run_1',
95
- sequence: 3,
96
- payload: { capability_id: 'repo.inspect' },
97
- });
98
- assert.equal(envelope.schema, RUNTIME_EVENT_ENVELOPE_SCHEMA);
99
- assert.equal(envelope.schema_version, 1);
100
- assert.equal(envelope.type, 'tool.started');
101
- assert.equal(envelope.run_id, 'run_1');
102
- assert.equal(envelope.sequence, 3);
103
- assert.deepEqual(envelope.payload, { capability_id: 'repo.inspect' });
104
- assert.throws(() => normalizeRuntimeEventEnvelope({ payload: {} }), /type is required/);
105
- });
106
-
107
- test('runtime presenter turns events into one-line activity and waiting handoff', () => {
108
- let output = '';
109
- let now = 1_000;
110
- const timers = [];
111
- const activity = createInlineActivity({
112
- write: (value) => { output += value; },
113
- interactive: false,
114
- now: () => now,
115
- setInterval: (fn) => { timers.push(fn); return timers.length; },
116
- clearInterval() {},
117
- });
118
- const state = {};
119
- const presenter = createCliRuntimePresenter({ activity, write: (value) => { output += value; }, state });
120
- activity.start('Thinking');
121
- presenter.handle({ type: 'tool.started', payload: { capability_id: 'repo.inspect' } });
122
- presenter.handle({ type: 'usage.snapshot', payload: { current_context: { input_tokens: 10, window_tokens: 100 }, cumulative: {} } });
123
- presenter.handle({ type: 'context.compaction.started', payload: { provider: 'test' } });
124
- now += 500;
125
- presenter.handle({ type: 'context.compaction.completed', payload: { provider: 'test', tokens_before: 80, tokens_after: 20, summary_text: 'kept state' } });
126
- presenter.handle({ type: 'runtime.waiting_input', payload: { reason: 'authentication', auth_url: 'https://example.test/auth', user_code: 'ABCD' } });
127
- assert.equal(state.usageSnapshot.current_context.input_tokens, 10);
128
- assert.equal(state.lastCompaction.tokens_before, 80);
129
- assert.match(output, /Waiting for you/);
130
- assert.match(output, /https:\/\/example\.test\/auth/);
131
- assert.match(output, /ABCD/);
132
- assert.match(presenter.compactionReceipt(), /80 → 20/);
133
- });
134
-
135
- test('waiting renderer gives CLI-native auth instructions', () => {
136
- const text = renderWaitingInput({ awaiting_input_reason: 'otp', auth_url: 'https://example.test/login', user_code: '123456' });
137
- assert.match(text, /Waiting for you/);
138
- assert.match(text, /otp/);
139
- assert.match(text, /Open/);
140
- assert.match(text, /123456/);
141
- });
@@ -1,21 +0,0 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import fs from 'node:fs';
4
- import path from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
- import { getCliCommand } from '../../src/cli/command-catalog.js';
7
-
8
- const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
9
-
10
- test('rust/wasm command aliases resolve to one catalog authority', () => {
11
- const rust = getCliCommand('rust');
12
- assert.equal(rust?.id, 'rust');
13
- assert.equal(getCliCommand('wasm')?.id, 'rust');
14
- assert.equal(getCliCommand('rapid-rust')?.id, 'rust');
15
- });
16
-
17
- test('rapid rust root bin and native crate ship in source tree', () => {
18
- assert.equal(fs.existsSync(path.join(root, 'bin/agentsam-rapid-rust')), true);
19
- assert.equal(fs.existsSync(path.join(root, 'packages/agentsam-rapid-rust/Cargo.toml')), true);
20
- assert.equal(fs.existsSync(path.join(root, 'scripts/build_rapid_rust_cli.py')), true);
21
- });
@@ -1,52 +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 { spawnSync } from 'node:child_process';
6
- import test from 'node:test';
7
- import { resolveNpmSkillPackage } from '../../src/commands/skill.js';
8
- import { installSkillFromPath } from '../../src/skills/index.js';
9
- import { runEnv } from '../../src/commands/env.js';
10
-
11
- function tmpHome() {
12
- return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-finish-'));
13
- }
14
-
15
- test('resolveNpmSkillPackage extracts agentsam.skill.json via npm pack', (t) => {
16
- // Build a tiny local package and pack it by path (no registry).
17
- const pkgRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-npm-skill-'));
18
- fs.writeFileSync(
19
- path.join(pkgRoot, 'package.json'),
20
- JSON.stringify({ name: 'tmp-agentsam-skill-fixture', version: '0.0.0', private: true }),
21
- );
22
- fs.writeFileSync(
23
- path.join(pkgRoot, 'agentsam.skill.json'),
24
- JSON.stringify({
25
- schema: 'agentsam.skill.v1',
26
- id: 'npm-fixture',
27
- name: 'NPM Fixture',
28
- slash: { suggested: '/npm-fixture' },
29
- instructions: { source: 'inline', inline: '# npm fixture' },
30
- execution: { mode: 'turn' },
31
- }),
32
- );
33
- const resolved = resolveNpmSkillPackage(pkgRoot, { spawnSyncImpl: spawnSync });
34
- assert.ok(fs.existsSync(path.join(resolved, 'agentsam.skill.json')));
35
-
36
- const home = tmpHome();
37
- const installed = installSkillFromPath(resolved, { home });
38
- assert.equal(installed.id, 'npm-fixture');
39
- assert.equal(installed.trigger, '/npm-fixture');
40
- });
41
-
42
- test('env boot-line prints source load-agent-env command', async () => {
43
- const home = tmpHome();
44
- const lines = [];
45
- const result = await runEnv(['boot-line', 'cursor', 'inneranimalmedia'], {
46
- home,
47
- write: (t) => lines.push(t),
48
- });
49
- assert.equal(result.command, 'source ~/.agentsam/load-agent-env.sh');
50
- assert.ok(lines.join('').includes('load-agent-env.sh'));
51
- assert.ok(lines.join('').includes('agentsam env shell'));
52
- });
@@ -1,88 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- buildStatusActionPlan,
5
- formatStatusNextSteps,
6
- } from '../../src/status/actions.js';
7
- import { renderLocalStatus } from '../../src/ui/ansi.js';
8
-
9
- test('healthy Cloudflare deployment wins over localhost', () => {
10
- const runtime = {
11
- ready: true,
12
- checks: {
13
- account: true,
14
- models: true,
15
- terminal: true,
16
- cloudflare: true,
17
- },
18
- local: {
19
- deployTarget: 'cloudflare',
20
- api: {
21
- online: false,
22
- url: 'http://127.0.0.1:8787/api/health',
23
- },
24
- db: {
25
- ready: true,
26
- exists: true,
27
- },
28
- },
29
- cloudflare: {
30
- configured: true,
31
- worker_name: 'agentsam-sdk',
32
- health: {
33
- ok: true,
34
- status: 200,
35
- url: 'https://agentsam.inneranimalmedia.com/health',
36
- },
37
- },
38
- };
39
-
40
- const plan = buildStatusActionPlan(runtime);
41
- const text = formatStatusNextSteps(plan);
42
-
43
- assert.match(plan.headline, /Live project healthy/);
44
- assert.ok(plan.actions.some((action) =>
45
- action.command === 'https://agentsam.inneranimalmedia.com'
46
- ));
47
- assert.ok(plan.actions.some((action) =>
48
- action.command === 'agentsam cloudflare status'
49
- ));
50
- assert.doesNotMatch(text, /npm run dev/);
51
- assert.match(text, /open https:\/\/agentsam\.inneranimalmedia\.com/);
52
- });
53
-
54
- test('compact local card prefers live deployment', () => {
55
- const text = renderLocalStatus({
56
- configured: true,
57
- project: 'agentsam-sdk',
58
- lane: 'custom',
59
- agent: 'default',
60
- git: {
61
- branch: 'main',
62
- revision: 'abcdef123456',
63
- dirty: false,
64
- },
65
- db: {
66
- ready: true,
67
- tables: [],
68
- },
69
- api: {
70
- online: false,
71
- url: 'http://127.0.0.1:8787/api/health',
72
- },
73
- pty: {
74
- online: true,
75
- url: 'http://127.0.0.1:3099/health',
76
- },
77
- deployTarget: 'cloudflare',
78
- live: {
79
- online: true,
80
- url: 'https://agentsam.inneranimalmedia.com/health',
81
- },
82
- });
83
-
84
- assert.match(text, /● live/);
85
- assert.match(text, /open https:\/\/agentsam\.inneranimalmedia\.com/);
86
- assert.match(text, /agentsam cloudflare status/);
87
- assert.doesNotMatch(text, /npm run dev/);
88
- });
@@ -1,139 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { renderArchitectureExplorer, renderOperationInspector, drawBox } from '../../src/ui/wireframes.js';
4
- import { applyInnerAnimalMediaOfficialGoProductRegistry, buildGoProductRegistrySql } from '../../src/go/official-registry.js';
5
-
6
- test('architecture explorer is boxed reasoning scenery', () => {
7
- const view = renderArchitectureExplorer({
8
- repo: 'agentsam-sdk',
9
- focus: { package: 'protocol', owns: 'wire contracts', runtime: 'none', imported_by: 'client', files: '.proto' },
10
- });
11
- assert.match(view, /┌/);
12
- assert.match(view, /package: protocol/);
13
- assert.match(view, /DEPENDENCY MAP/);
14
- assert.match(view, /\[contracts\]/);
15
- });
16
-
17
- test('operation inspector shows intent timeline', () => {
18
- const view = renderOperationInspector({
19
- operation: 'model.export',
20
- op_id: 'op_01H',
21
- active_index: 2,
22
- step: { name: 'converter', artifact: 'GLB' },
23
- receipt: { 'input document revision': 84, 'output artifact hash': 'abc' },
24
- });
25
- assert.match(view, /model\.export/);
26
- assert.match(view, /intent/);
27
- assert.match(view, /converter/);
28
- assert.match(view, /GLB/);
29
- assert.match(view, /input document revision/);
30
- });
31
-
32
- test('drawBox pads visible ANSI width', () => {
33
- const box = drawBox(['hello'], { width: 20, title: 't' });
34
- assert.match(box, /┌/);
35
- assert.match(box, /└/);
36
- });
37
-
38
- test('buildGoProductRegistrySql upserts product + relationships without inventing tables', () => {
39
- const sql = buildGoProductRegistrySql({
40
- product: 'agentsam-go-worker',
41
- status: 'deployed',
42
- url: 'https://agentsam-go-worker.example.workers.dev',
43
- commit: 'abc123',
44
- health: 'healthy',
45
- });
46
- assert.match(sql, /INSERT INTO agentsam_products/);
47
- assert.match(sql, /ON CONFLICT\(slug\) DO UPDATE/);
48
- assert.match(sql, /INSERT INTO asset_relationships/);
49
- assert.match(sql, /sourced_from/);
50
- assert.match(sql, /runs_on/);
51
- assert.match(sql, /deployed_as/);
52
- assert.doesNotMatch(sql, /CREATE TABLE/);
53
- assert.doesNotMatch(sql, /account_id/);
54
- });
55
-
56
-
57
- test('InnerAnimalMedia remote registry requires the explicit official-release guard', () => {
58
- const preferred = process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
59
- const legacy = process.env.AGENTSAM_IAM_OFFICIAL_RELEASE;
60
-
61
- delete process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
62
- delete process.env.AGENTSAM_IAM_OFFICIAL_RELEASE;
63
-
64
- try {
65
- assert.throws(
66
- () => applyInnerAnimalMediaOfficialGoProductRegistry({
67
- productRoot: '/tmp/agentsam-test-state',
68
- officialRelease: true,
69
- skipRemote: true,
70
- }),
71
- /inneranimalmedia_registry_official_release_required/,
72
- );
73
- } finally {
74
- if (preferred == null) {
75
- delete process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
76
- } else {
77
- process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE = preferred;
78
- }
79
-
80
- if (legacy == null) {
81
- delete process.env.AGENTSAM_IAM_OFFICIAL_RELEASE;
82
- } else {
83
- process.env.AGENTSAM_IAM_OFFICIAL_RELEASE = legacy;
84
- }
85
- }
86
- });
87
-
88
- test('InnerAnimalMedia official registry normalizes deployed lifecycle status to D1 production', () => {
89
- const prior = process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
90
- process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE = '1';
91
- try {
92
- const result = applyInnerAnimalMediaOfficialGoProductRegistry({
93
- productRoot: null,
94
- officialRelease: true,
95
- status: 'deployed',
96
- dryRun: true,
97
- skipRemote: true,
98
- });
99
- assert.match(result.sql, /'production'/);
100
- assert.doesNotMatch(result.sql, /'deployed',\n 'AgentSam Go runtime/);
101
- } finally {
102
- if (prior == null) delete process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
103
- else process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE = prior;
104
- }
105
- });
106
-
107
-
108
- test('legacy AGENTSAM_IAM_OFFICIAL_RELEASE guard remains backward compatible', () => {
109
- const preferred = process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
110
- const legacy = process.env.AGENTSAM_IAM_OFFICIAL_RELEASE;
111
-
112
- delete process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
113
- process.env.AGENTSAM_IAM_OFFICIAL_RELEASE = '1';
114
-
115
- try {
116
- const result = applyInnerAnimalMediaOfficialGoProductRegistry({
117
- productRoot: null,
118
- officialRelease: true,
119
- status: 'deployed',
120
- dryRun: true,
121
- skipRemote: true,
122
- });
123
-
124
- assert.equal(result.ok, true);
125
- assert.match(result.sql, /'production'/);
126
- } finally {
127
- if (preferred == null) {
128
- delete process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE;
129
- } else {
130
- process.env.AGENTSAM_INNERANIMALMEDIA_OFFICIAL_RELEASE = preferred;
131
- }
132
-
133
- if (legacy == null) {
134
- delete process.env.AGENTSAM_IAM_OFFICIAL_RELEASE;
135
- } else {
136
- process.env.AGENTSAM_IAM_OFFICIAL_RELEASE = legacy;
137
- }
138
- }
139
- });
@@ -1,46 +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
- import { CLI_PREFERENCES_SCHEMA, detectCliProject, readCliPreferences, writeCliPreferences } from '../src/lib/cli-preferences.js';
7
- import { renderBootSummary } from '../src/ui/boot.js';
8
-
9
- test('CLI preferences persist local model/runtime controls without becoming routing authority', () => {
10
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-cli-prefs-'));
11
- fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name: 'demo-project' }));
12
- const written = writeCliPreferences(root, {
13
- trustedDirectory: true,
14
- runtime: 'sandbox',
15
- terminal: 'zsh',
16
- modelPreference: 'openai:gpt-6-astra',
17
- reasoningEffort: 'high',
18
- serviceTier: 'fast',
19
- });
20
- assert.equal(written.schemaVersion, CLI_PREFERENCES_SCHEMA);
21
- assert.equal(written.modelAuthority, 'preference-only');
22
- assert.equal(written.trustedDirectory, true);
23
- assert.deepEqual(readCliPreferences(root), written);
24
- const identity = detectCliProject(root);
25
- assert.equal(identity.project, 'demo-project');
26
- assert.equal(identity.root, root);
27
- const summary = renderBootSummary({ identity, preferences: written });
28
- assert.match(summary, /Agent Sam/);
29
- assert.match(summary, /demo-project/);
30
- assert.match(summary, /openai:gpt-6-astra/);
31
- assert.match(summary, /high/);
32
- assert.match(summary, /fast/);
33
- });
34
-
35
- test('legacy v1 local preferences migrate in memory without inventing trust', () => {
36
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-cli-legacy-'));
37
- fs.mkdirSync(path.join(root, '.agentsam'));
38
- fs.writeFileSync(path.join(root, '.agentsam', 'cli.json'), JSON.stringify({
39
- schemaVersion: 'agentsam-cli-preferences-v1', runtime: 'local', terminal: 'zsh', modelPreference: 'auto', modelAuthority: 'preference-only',
40
- }));
41
- const read = readCliPreferences(root);
42
- assert.equal(read.schemaVersion, CLI_PREFERENCES_SCHEMA);
43
- assert.equal(read.trustedDirectory, false);
44
- assert.equal(read.reasoningEffort, 'auto');
45
- assert.equal(read.serviceTier, 'default');
46
- });
@@ -1,93 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { describe, it } from 'node:test';
3
- import { handleCloudflareConnectionRequest } from '../packages/connectors/cloudflare/src/routes.js';
4
- import { rejectUntrustedOwnerHints } from '../packages/connectors/cloudflare/src/owner.js';
5
-
6
- function req(url, { method = 'GET', headers = {}, body } = {}) {
7
- return new Request(url, { method, headers, body });
8
- }
9
-
10
- describe('cloudflare connector routes', () => {
11
- it('rejects unauthenticated status', async () => {
12
- const res = await handleCloudflareConnectionRequest(
13
- req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare'),
14
- {},
15
- );
16
- assert.equal(res.status, 401);
17
- const json = await res.json();
18
- assert.equal(json.error, 'unauthenticated');
19
- });
20
-
21
- it('rejects browser-submitted owner hints', () => {
22
- const url = new URL('https://agentsam.inneranimalmedia.com/api/connections/cloudflare?account_id=evil');
23
- assert.throws(
24
- () => rejectUntrustedOwnerHints(req(url.toString()), url, {}),
25
- /untrusted_owner_hint/,
26
- );
27
- });
28
-
29
- it('returns 503 on start when only fixture credentials exist', async () => {
30
- const env = {
31
- CLOUDFLARE_OAUTH_CLIENT_ID: 'sillynotreal',
32
- fixtureSessions: new Map([['sess_1', 'user-sam']]),
33
- };
34
- const res = await handleCloudflareConnectionRequest(
35
- req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare/start', {
36
- headers: { cookie: 'agentsam_session=sess_1' },
37
- }),
38
- env,
39
- );
40
- assert.equal(res.status, 503);
41
- const json = await res.json();
42
- assert.equal(json.error, 'not_configured');
43
- assert.equal(json.fixture, true);
44
- });
45
-
46
- it('status stays safe and does not treat fixture as production configured', async () => {
47
- const env = {
48
- CLOUDFLARE_OAUTH_CLIENT_ID: 'sillynotreal',
49
- fixtureSessions: new Map([['sess_1', 'user-sam']]),
50
- };
51
- const res = await handleCloudflareConnectionRequest(
52
- req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare', {
53
- headers: { authorization: 'Bearer sess_1' },
54
- }),
55
- env,
56
- );
57
- assert.equal(res.status, 200);
58
- const json = await res.json();
59
- assert.equal(json.ok, true);
60
- assert.equal(json.configured, false);
61
- assert.equal(json.fixture, true);
62
- assert.equal(JSON.stringify(json).includes('sillynotreal-secret'), false);
63
- });
64
-
65
- it('rejects owner_id in the JSON body', async () => {
66
- const env = { fixtureSessions: new Map([['sess_1', 'user-sam']]) };
67
- const res = await handleCloudflareConnectionRequest(
68
- req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare/disconnect', {
69
- method: 'POST',
70
- headers: { cookie: 'agentsam_session=sess_1', 'content-type': 'application/json' },
71
- body: JSON.stringify({ owner_id: 'evil' }),
72
- }),
73
- env,
74
- );
75
- assert.equal(res.status, 400);
76
- const json = await res.json();
77
- assert.equal(json.error, 'untrusted_owner_hint');
78
- });
79
-
80
- it('rejects callback without a stored oauth state', async () => {
81
- const env = {
82
- CLOUDFLARE_OAUTH_CLIENT_ID: 'real-client-id',
83
- oauthState: new Map(),
84
- };
85
- const res = await handleCloudflareConnectionRequest(
86
- req('https://agentsam.inneranimalmedia.com/api/connections/cloudflare/callback?code=abc&state=missing'),
87
- env,
88
- );
89
- assert.equal(res.status, 403);
90
- const json = await res.json();
91
- assert.equal(json.error, 'cloudflare_connection_forbidden');
92
- });
93
- });
@@ -1,82 +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
- import { buildWranglerInvocation, listWranglerNativeCommands, runWranglerNative, summarizeCloudflareCpuProfile, summarizeCloudflareCpuProfileFile } from '../src/cloudflare/index.js';
7
- import { createCapabilityAdapter } from '../src/agent/capability-adapter.js';
8
-
9
- function tempRoot() { return fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-cf-')); }
10
-
11
- test('Cloudflare native command catalog exposes bounded read operations and never an auth-token secret read', () => {
12
- const ids = listWranglerNativeCommands().map((row) => row.id);
13
- assert.deepEqual(ids, ['whoami', 'deployments.list', 'versions.list', 'versions.view', 'types.check', 'queues.list', 'tunnel.list', 'tunnel.info']);
14
- assert.ok(!ids.some((id) => id.includes('token') || id.includes('secret') || id === 'deploy'));
15
- });
16
-
17
- test('Wrangler version view requires an exact version and keeps secret values unavailable', () => {
18
- const root = tempRoot();
19
- const plan = buildWranglerInvocation('versions.view', { cwd: root, name: 'demo', version_id: 'ver_123' });
20
- assert.deepEqual(plan.args, ['versions', 'view', 'ver_123', '--json', '--name', 'demo']);
21
- assert.throws(() => buildWranglerInvocation('versions.view', { cwd: root, name: 'demo' }), /version_id_required/);
22
- });
23
-
24
- test('Wrangler native invocation is argv-based and cwd/config scoped', () => {
25
- const root = tempRoot();
26
- fs.writeFileSync(path.join(root, 'wrangler.jsonc'), '{}');
27
- const plan = buildWranglerInvocation('deployments.list', { cwd: root, name: 'demo' });
28
- assert.equal(plan.cwd, root);
29
- assert.deepEqual(plan.args.slice(0, 4), ['deployments', 'list', '--json', '--name']);
30
- assert.equal(plan.args[4], 'demo');
31
- assert.ok(plan.args.includes('--config'));
32
- assert.throws(() => buildWranglerInvocation('whoami', { cwd: root, config: '../outside.toml' }), /outside_cwd/);
33
- });
34
-
35
- test('Wrangler native result preserves JSON and real exit code on failure', async () => {
36
- const root = tempRoot();
37
- const success = await runWranglerNative('whoami', { cwd: root }, { run: async () => ({ code: 0, stdout: JSON.stringify({ email: 'dev@example.com' }), stderr: '' }) });
38
- assert.equal(success.data.email, 'dev@example.com');
39
- await assert.rejects(
40
- runWranglerNative('versions.list', { cwd: root }, { run: async () => ({ code: 7, stdout: '', stderr: 'upstream failed' }) }),
41
- (error) => error.diagnostic?.exit_code === 7 && error.diagnostic?.code === 'wrangler_exit_nonzero',
42
- );
43
- await assert.rejects(
44
- runWranglerNative('deployments.list', { cwd: root }, { run: async () => ({ code: 1, stdout: '', stderr: 'Authentication error [code: 10000]\nRequest ID: req_cf_1\nCF-Ray: ray-123' }) }),
45
- (error) => error.diagnostic?.code === '10000' && error.diagnostic?.request_id === 'req_cf_1' && error.diagnostic?.ray_id === 'ray-123',
46
- );
47
- });
48
-
49
- test('CPU profile summary ranks self-time hotspots and explicitly rejects production timer inference', () => {
50
- const profile = {
51
- nodes: [
52
- { id: 1, callFrame: { functionName: 'fetch', url: 'worker.js', lineNumber: 0, columnNumber: 0 } },
53
- { id: 2, callFrame: { functionName: 'heavyLoop', url: 'worker.js', lineNumber: 10, columnNumber: 2 } },
54
- { id: 3, callFrame: { functionName: '(garbage collector)', url: '', lineNumber: -1, columnNumber: -1 } },
55
- ],
56
- samples: [1, 2, 2, 3],
57
- timeDeltas: [100, 1200, 800, 400],
58
- };
59
- const summary = summarizeCloudflareCpuProfile(profile);
60
- assert.equal(summary.top_frames[0].function, 'heavyLoop');
61
- assert.equal(summary.top_frames[0].self_us, 2000);
62
- assert.equal(summary.garbage_collection_ms, 0.4);
63
- assert.match(summary.timer_semantics, /do not advance during CPU-only execution/);
64
- });
65
-
66
- test('CPU profile file cannot escape runtime cwd', () => {
67
- const root = tempRoot();
68
- fs.writeFileSync(path.join(root, 'profile.cpuprofile'), JSON.stringify({ nodes: [], samples: [], timeDeltas: [] }));
69
- assert.equal(summarizeCloudflareCpuProfileFile({ cwd: root, file: 'profile.cpuprofile' }).file, 'profile.cpuprofile');
70
- assert.throws(() => summarizeCloudflareCpuProfileFile({ cwd: root, file: '../profile.cpuprofile' }), /outside_cwd/);
71
- });
72
-
73
- test('explicitly executable experimental Cloudflare capabilities enter cards-first discovery without exposing unavailable commands', () => {
74
- const adapter = createCapabilityAdapter();
75
- const rows = adapter.toolDescriptors();
76
- const ids = rows.map((row) => row.name);
77
- assert.ok(ids.includes('cloudflare.wrangler.native'));
78
- assert.ok(ids.includes('cloudflare.cpu.profile'));
79
- assert.ok(!ids.includes('cloudflare.cpu.audit'));
80
- assert.ok(!ids.includes('blender.build'));
81
- assert.equal(rows.find((row) => row.name === 'cloudflare.wrangler.native').risk, 'read');
82
- });