@inneranimalmedia/agentsam-sdk 2.6.7 → 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 (318) hide show
  1. package/README.md +37 -0
  2. package/docs/REPO_FILE_MAP.txt +132 -0
  3. package/migrations/d1/0018_goap_control_plane_remaster.sql +40 -0
  4. package/migrations/d1/0019_agentsam_agent_run_plan_todo.sql +14 -0
  5. package/migrations/d1/README_PORTABLE_CONTROL_PLANE.md +20 -9
  6. package/migrations/runtime/0002_goap_blackboard_v1.sql +15 -0
  7. package/migrations/runtime/0004_agent_run_plan_linkage.sql +8 -0
  8. package/native/agentsam-machine/cli/Cargo.toml +8 -1
  9. package/native/agentsam-machine/cli/README.md +21 -0
  10. package/native/agentsam-machine/core/Cargo.toml +7 -0
  11. package/native/agentsam-machine/core/README.md +14 -0
  12. package/native/agentsam-machine/core/build.rs +33 -0
  13. package/native/agentsam-machine/core/contracts/source-types.v1.json +353 -0
  14. package/native/agentsam-machine/core/src/lib.rs +6 -0
  15. package/native/agentsam-machine/core/src/source_types.rs +2 -2
  16. package/package.json +16 -6
  17. package/packages/agentsam-errors/package.json +1 -1
  18. package/packages/agentsam-errors/src/index.js +1 -0
  19. package/packages/agentsam-errors/src/tool.js +56 -0
  20. package/packages/agentsam-errors/test/tool.test.mjs +58 -0
  21. package/packages/agentsam-goap/README.md +52 -0
  22. package/packages/agentsam-goap/package.json +37 -0
  23. package/packages/agentsam-goap/src/adapters/d1-sqlite.js +570 -0
  24. package/packages/agentsam-goap/src/adapters/memory.js +199 -0
  25. package/packages/agentsam-goap/src/contracts.js +226 -0
  26. package/packages/agentsam-goap/src/control-plane.js +112 -0
  27. package/packages/agentsam-goap/src/errors.js +157 -0
  28. package/packages/agentsam-goap/src/index.js +5 -0
  29. package/packages/agentsam-goap/src/world.js +202 -0
  30. package/packages/agentsam-goap/test/goap-control-plane.test.mjs +245 -0
  31. package/packages/agentsam-goap/test/world.test.mjs +79 -0
  32. package/packages/agentsam-nav/dist/Nav.d.ts +43 -0
  33. package/packages/agentsam-nav/dist/NavCollapsible.d.ts +10 -0
  34. package/packages/agentsam-nav/dist/NavContent.d.ts +2 -0
  35. package/packages/agentsam-nav/dist/NavFooter.d.ts +2 -0
  36. package/packages/agentsam-nav/dist/NavGroup.d.ts +3 -0
  37. package/packages/agentsam-nav/dist/NavHeader.d.ts +2 -0
  38. package/packages/agentsam-nav/dist/NavMenu.d.ts +22 -0
  39. package/packages/agentsam-nav/dist/NavProvider.d.ts +35 -0
  40. package/packages/agentsam-nav/dist/NavTrigger.d.ts +2 -0
  41. package/packages/agentsam-nav/dist/Surfaces.d.ts +41 -0
  42. package/packages/agentsam-nav/dist/browser.d.ts +11 -0
  43. package/packages/agentsam-nav/dist/browser.global.js +135 -0
  44. package/packages/agentsam-nav/dist/browser.js +7290 -0
  45. package/packages/agentsam-nav/dist/contracts.d.ts +76 -0
  46. package/packages/agentsam-nav/dist/index.d.ts +11 -0
  47. package/packages/agentsam-nav/dist/index.js +7291 -0
  48. package/packages/agentsam-nav/dist/legacy.css +83 -0
  49. package/packages/agentsam-nav/dist/shell.css +113 -0
  50. package/packages/agentsam-nav/dist/theme.css +113 -0
  51. package/packages/agentsam-nav/dist/utils.d.ts +1 -0
  52. package/packages/agentsam-repository/src/goap.js +13 -14
  53. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  54. package/packages/agentsam-repository/src/tickets.js +15 -22
  55. package/packages/agentsam-repository/test/goap-tickets-workspace-state.test.mjs +19 -8
  56. package/packages/connectors/cloudflare/package.json +3 -1
  57. package/packages/identity/tests/lane1-packed-consumer.test.mjs +1 -1
  58. package/python/agentsam_sdk/repository/intelligence/discovery.py +27 -2
  59. package/python/agentsam_sdk/repository/intelligence/git.py +4 -0
  60. package/python/tests/test_repository_intelligence.py +30 -0
  61. package/src/cli/command-catalog.js +2 -1
  62. package/src/cli.js +10 -1
  63. package/src/commands/goap-world.js +134 -0
  64. package/src/commands/goap.js +11 -4
  65. package/src/commands/machine-binary.js +33 -27
  66. package/src/commands/machine-runtime.js +266 -0
  67. package/src/commands/machine.js +122 -51
  68. package/src/commands/package.js +530 -0
  69. package/src/commands/plan-ledger.js +370 -0
  70. package/src/commands/plan.js +183 -0
  71. package/src/commands/skill.js +78 -17
  72. package/src/knowledge/source.js +1 -1
  73. package/src/lib/slash-commands.js +1 -1
  74. package/src/local/runtime-store.js +24 -2
  75. package/src/local/sqlite.js +17 -0
  76. package/src/sam/operations/package-audit.js +41 -0
  77. package/src/sam/seed.js +2 -0
  78. package/skills/grok-auth/SKILL.md +0 -110
  79. package/skills/grok-auth/agentsam.skill.json +0 -25
  80. package/skills/grok-auth/references/grok-identity.md +0 -64
  81. package/skills/grok-auth/references/per-user-data.md +0 -49
  82. package/skills/grok-auth/references/prewired-and-env.md +0 -54
  83. package/skills/grok-auth/references/session-ui.md +0 -133
  84. package/skills/grok-auth/references/sign-in-methods.md +0 -55
  85. package/skills/grok-auth/references/wiring.md +0 -71
  86. package/skills/grok-building-games/SKILL.md +0 -213
  87. package/skills/grok-building-games/agentsam.skill.json +0 -25
  88. package/skills/grok-building-games/references/3d-libs.md +0 -64
  89. package/skills/grok-building-games/references/ai-pathfinding.md +0 -122
  90. package/skills/grok-building-games/references/audio.md +0 -129
  91. package/skills/grok-building-games/references/babylon.md +0 -202
  92. package/skills/grok-building-games/references/collision-physics.md +0 -122
  93. package/skills/grok-building-games/references/ecs-architecture.md +0 -111
  94. package/skills/grok-building-games/references/game-feel-juice.md +0 -110
  95. package/skills/grok-building-games/references/genres/board-card-chess.md +0 -89
  96. package/skills/grok-building-games/references/genres/endless-runner.md +0 -83
  97. package/skills/grok-building-games/references/genres/fps.md +0 -105
  98. package/skills/grok-building-games/references/genres/platformer-2d.md +0 -97
  99. package/skills/grok-building-games/references/genres/puzzle-match3-tetris.md +0 -131
  100. package/skills/grok-building-games/references/genres/racing-kart.md +0 -106
  101. package/skills/grok-building-games/references/genres/topdown-twin-stick.md +0 -97
  102. package/skills/grok-building-games/references/genres/tower-defense.md +0 -84
  103. package/skills/grok-building-games/references/genres/voxel-minecraft.md +0 -89
  104. package/skills/grok-building-games/references/input.md +0 -139
  105. package/skills/grok-building-games/references/phaser.md +0 -277
  106. package/skills/grok-building-games/references/procedural-generation.md +0 -141
  107. package/skills/grok-building-games/references/save-persistence.md +0 -108
  108. package/skills/grok-building-games/references/threejs-foundational.md +0 -148
  109. package/skills/grok-controls/SKILL.md +0 -274
  110. package/skills/grok-controls/agentsam.skill.json +0 -25
  111. package/skills/grok-design-ui/SKILL.md +0 -122
  112. package/skills/grok-design-ui/agentsam.skill.json +0 -25
  113. package/skills/grok-design-ui/references/animations.md +0 -379
  114. package/skills/grok-design-ui/references/performance.md +0 -88
  115. package/skills/grok-design-ui/references/refined-ui.md +0 -384
  116. package/skills/grok-design-ui/references/surfaces.md +0 -247
  117. package/skills/grok-design-ui/references/typography.md +0 -123
  118. package/skills/grok-game-animation-frames/SKILL.md +0 -84
  119. package/skills/grok-game-animation-frames/agentsam.skill.json +0 -25
  120. package/skills/grok-game-asset-core/SKILL.md +0 -69
  121. package/skills/grok-game-asset-core/agentsam.skill.json +0 -25
  122. package/skills/grok-game-character-consistency/SKILL.md +0 -69
  123. package/skills/grok-game-character-consistency/agentsam.skill.json +0 -25
  124. package/skills/grok-game-tilesets/SKILL.md +0 -65
  125. package/skills/grok-game-tilesets/agentsam.skill.json +0 -25
  126. package/skills/grok-game-ui-icons/SKILL.md +0 -56
  127. package/skills/grok-game-ui-icons/agentsam.skill.json +0 -25
  128. package/skills/grok-generate2dmap/LICENSE +0 -21
  129. package/skills/grok-generate2dmap/SKILL.md +0 -120
  130. package/skills/grok-generate2dmap/SOURCE.md +0 -6
  131. package/skills/grok-generate2dmap/agentsam.skill.json +0 -25
  132. package/skills/grok-generate2dmap/references/deliverables.md +0 -101
  133. package/skills/grok-generate2dmap/references/layered-map-contract.md +0 -209
  134. package/skills/grok-generate2dmap/references/map-strategies.md +0 -341
  135. package/skills/grok-generate2dmap/references/object-production-gate.md +0 -24
  136. package/skills/grok-generate2dmap/references/pipeline.md +0 -149
  137. package/skills/grok-generate2dmap/references/prop-pack-contract.md +0 -174
  138. package/skills/grok-generate2dmap/references/side-scroll-stages.md +0 -29
  139. package/skills/grok-generate2dmap/scripts/compose_layered_preview.py +0 -157
  140. package/skills/grok-generate2dmap/scripts/extract_prop_pack.py +0 -369
  141. package/skills/grok-generate2dsprite/LICENSE +0 -21
  142. package/skills/grok-generate2dsprite/SKILL.md +0 -313
  143. package/skills/grok-generate2dsprite/SOURCE.md +0 -6
  144. package/skills/grok-generate2dsprite/agentsam.skill.json +0 -25
  145. package/skills/grok-generate2dsprite/references/modes.md +0 -124
  146. package/skills/grok-generate2dsprite/references/prompt-rules.md +0 -315
  147. package/skills/grok-generate2dsprite/scripts/generate2dsprite.py +0 -1031
  148. package/skills/grok-generate2dsprite/scripts/make_layout_guide.py +0 -109
  149. package/skills/grok-imagine/SKILL.md +0 -201
  150. package/skills/grok-imagine/agentsam.skill.json +0 -25
  151. package/skills/grok-multiplayer-p2p/SKILL.md +0 -111
  152. package/skills/grok-multiplayer-p2p/agentsam.skill.json +0 -25
  153. package/skills/grok-multiplayer-p2p/references/react-binding.md +0 -144
  154. package/skills/grok-multiplayer-p2p/references/signaling-relay.md +0 -269
  155. package/skills/grok-neon/SKILL.md +0 -157
  156. package/skills/grok-neon/agentsam.skill.json +0 -25
  157. package/skills/grok-og/SKILL.md +0 -102
  158. package/skills/grok-og/agentsam.skill.json +0 -25
  159. package/skills/grok-og/references/brand-pass.md +0 -53
  160. package/skills/grok-og/references/custom-card.md +0 -107
  161. package/skills/grok-og/references/favicon-and-icons.md +0 -48
  162. package/skills/grok-og/references/og-type-contract.md +0 -18
  163. package/skills/grok-og/references/placeholder-card.md +0 -21
  164. package/skills/grok-og/references/x-banner.md +0 -41
  165. package/skills/grok-threejs/SKILL.md +0 -67
  166. package/skills/grok-threejs/agentsam.skill.json +0 -25
  167. package/skills/grok-threejs/references/llms-full.txt +0 -2780
  168. package/skills/grok-video2dsprite/LICENSE +0 -21
  169. package/skills/grok-video2dsprite/SKILL.md +0 -236
  170. package/skills/grok-video2dsprite/SOURCE.md +0 -6
  171. package/skills/grok-video2dsprite/agentsam.skill.json +0 -25
  172. package/skills/grok-video2dsprite/references/pipeline.md +0 -90
  173. package/skills/grok-video2dsprite/references/prompt-rules.md +0 -63
  174. package/skills/grok-video2dsprite/scripts/video2dsprite.py +0 -490
  175. package/skills/grok-xai-api/SKILL.md +0 -152
  176. package/skills/grok-xai-api/agentsam.skill.json +0 -25
  177. package/test/account-session.test.mjs +0 -101
  178. package/test/agent-capabilities.test.mjs +0 -67
  179. package/test/app-authority-context.test.mjs +0 -32
  180. package/test/app-building-skills.test.mjs +0 -61
  181. package/test/apps-scaffold-contract.test.mjs +0 -115
  182. package/test/blender-cad.test.mjs +0 -146
  183. package/test/cad-docker.test.mjs +0 -96
  184. package/test/capabilities.test.mjs +0 -133
  185. package/test/cli/api-key-env-whoami.test.mjs +0 -129
  186. package/test/cli/catalog-authority.test.mjs +0 -64
  187. package/test/cli/codebaseindex-plan-ux.test.mjs +0 -37
  188. package/test/cli/eval-live.test.mjs +0 -219
  189. package/test/cli/go.test.mjs +0 -128
  190. package/test/cli/local-vault-and-provider-setup.test.mjs +0 -268
  191. package/test/cli/machine-command.test.mjs +0 -34
  192. package/test/cli/mcp-client.test.mjs +0 -256
  193. package/test/cli/preferences-runtime.test.mjs +0 -11
  194. package/test/cli/runtime-persist.test.mjs +0 -56
  195. package/test/cli/runtime-ui.test.mjs +0 -141
  196. package/test/cli/rust-command.test.mjs +0 -21
  197. package/test/cli/skill-npm-and-env.test.mjs +0 -52
  198. package/test/cli/status-actions.test.mjs +0 -88
  199. package/test/cli/wireframes-go-registry.test.mjs +0 -139
  200. package/test/cli-preferences.test.mjs +0 -46
  201. package/test/cloudflare-connector.test.mjs +0 -93
  202. package/test/cloudflare-runtime.test.mjs +0 -82
  203. package/test/context.test.mjs +0 -159
  204. package/test/credentials-audit.test.mjs +0 -113
  205. package/test/deploy-health-scan.test.mjs +0 -95
  206. package/test/deploy-receipt.test.mjs +0 -91
  207. package/test/dockerize.test.mjs +0 -93
  208. package/test/error-diagnostics.test.mjs +0 -124
  209. package/test/eval-context.test.mjs +0 -37
  210. package/test/execution-approvals.test.mjs +0 -27
  211. package/test/fixtures/cad/courtyard-house.json +0 -208
  212. package/test/fixtures/knowledge-rpc-worker.mjs +0 -16
  213. package/test/fixtures/project-authority/customer-app/.agentsam/app.json +0 -5
  214. package/test/fixtures/project-authority/customer-app/apps/my-product/index.ts +0 -1
  215. package/test/fixtures/project-authority/customer-app/wrangler.toml +0 -17
  216. package/test/gcloud-auth.test.mjs +0 -111
  217. package/test/go/build-source-identity.test.mjs +0 -31
  218. package/test/go/cloudflare-probe.test.mjs +0 -317
  219. package/test/go/distribution.test.mjs +0 -28
  220. package/test/google-cloud-connection.test.mjs +0 -83
  221. package/test/google-cloud-inventory.test.mjs +0 -64
  222. package/test/indexing-provider.test.mjs +0 -29
  223. package/test/init-options.test.mjs +0 -35
  224. package/test/integration/ai-access-onboarding.test.mjs +0 -47
  225. package/test/integration/app-command.test.mjs +0 -85
  226. package/test/integration/autorag-project-authority.integration.test.mjs +0 -51
  227. package/test/integration/autorag-runtime-discovery.test.mjs +0 -107
  228. package/test/integration/cad-discovery.test.mjs +0 -158
  229. package/test/integration/cad-docker-executor.test.mjs +0 -249
  230. package/test/integration/cad-execution.test.mjs +0 -184
  231. package/test/integration/cad-project-app.test.mjs +0 -31
  232. package/test/integration/cad-project-d1.test.mjs +0 -25
  233. package/test/integration/cad-project-native.test.mjs +0 -24
  234. package/test/integration/cad-project-workflow.test.mjs +0 -9
  235. package/test/integration/cad-project.test.mjs +0 -85
  236. package/test/integration/cli-help.test.mjs +0 -41
  237. package/test/integration/cms-app-scaffold.test.mjs +0 -77
  238. package/test/integration/cms-site-tenancy-contract.test.mjs +0 -268
  239. package/test/integration/codebaseindex-ingest.test.mjs +0 -255
  240. package/test/integration/core-client.integration.test.mjs +0 -55
  241. package/test/integration/database-hosted-honesty.test.mjs +0 -49
  242. package/test/integration/desktop-keychain-boundary.test.mjs +0 -45
  243. package/test/integration/error-runtime-rpc.test.mjs +0 -71
  244. package/test/integration/features-resolve.test.mjs +0 -147
  245. package/test/integration/hosted-work-host-authority.test.mjs +0 -47
  246. package/test/integration/icon-registry.test.mjs +0 -67
  247. package/test/integration/ingest-discover-models.test.mjs +0 -30
  248. package/test/integration/inspect-path-cli.test.mjs +0 -46
  249. package/test/integration/install-script.test.mjs +0 -110
  250. package/test/integration/inventory-core.test.mjs +0 -53
  251. package/test/integration/inventory-eligibility.test.mjs +0 -59
  252. package/test/integration/inventory-evidence.test.mjs +0 -125
  253. package/test/integration/knowledge-rpc.test.mjs +0 -112
  254. package/test/integration/local-fs.test.mjs +0 -113
  255. package/test/integration/local-provider-bridge.test.mjs +0 -65
  256. package/test/integration/local-studio-settings-production.test.mjs +0 -40
  257. package/test/integration/lockfile-sync.test.mjs +0 -26
  258. package/test/integration/merkle-cli.test.mjs +0 -61
  259. package/test/integration/merkle-persistence-identity.test.mjs +0 -48
  260. package/test/integration/plugins-cloudflare.integration.test.mjs +0 -28
  261. package/test/integration/provider-env-cli.test.mjs +0 -60
  262. package/test/integration/provider-factory.test.mjs +0 -197
  263. package/test/integration/repository-company-graph.test.mjs +0 -90
  264. package/test/integration/runtime-migrations.test.mjs +0 -87
  265. package/test/integration/runtime-status.integration.test.mjs +0 -227
  266. package/test/integration/sam-activity-recovery.test.mjs +0 -147
  267. package/test/integration/sam-decision.test.mjs +0 -584
  268. package/test/integration/sam-kernel.test.mjs +0 -99
  269. package/test/integration/sam-planning-astar.test.mjs +0 -279
  270. package/test/integration/scaffold-cloudflare.test.mjs +0 -46
  271. package/test/integration/skill-runtime.test.mjs +0 -240
  272. package/test/integration/storage-architecture.test.mjs +0 -154
  273. package/test/integration/store-discovery.test.mjs +0 -44
  274. package/test/integration/studio-fs-pty-e2e.test.mjs +0 -294
  275. package/test/integration/terminal-exec.integration.test.mjs +0 -86
  276. package/test/integration/theme-package-registry.test.mjs +0 -31
  277. package/test/integration/tool-runtime.test.mjs +0 -124
  278. package/test/integration/tool-schema.test.mjs +0 -59
  279. package/test/jr-dev-skill.test.mjs +0 -26
  280. package/test/knowledge-context-pack.test.mjs +0 -19
  281. package/test/knowledge-postgres.test.mjs +0 -40
  282. package/test/knowledge-service.test.mjs +0 -110
  283. package/test/knowledge.test.mjs +0 -206
  284. package/test/live/terminal-transport.live.test.mjs +0 -24
  285. package/test/local-sessions.test.mjs +0 -57
  286. package/test/local-studio-deploy.test.mjs +0 -83
  287. package/test/loopback-oauth.test.mjs +0 -53
  288. package/test/merkle-render.test.mjs +0 -31
  289. package/test/mini.test.mjs +0 -140
  290. package/test/model-catalog.test.mjs +0 -70
  291. package/test/models.test.mjs +0 -309
  292. package/test/npm10-lock.test.mjs +0 -29
  293. package/test/ollama.test.mjs +0 -137
  294. package/test/open-url.test.mjs +0 -64
  295. package/test/openai-responses.test.mjs +0 -155
  296. package/test/portable-context.test.mjs +0 -94
  297. package/test/project-config.test.mjs +0 -81
  298. package/test/project-rules.test.mjs +0 -44
  299. package/test/provider-credentials.test.mjs +0 -106
  300. package/test/rehydrate.test.mjs +0 -25
  301. package/test/release-hygiene.test.mjs +0 -42
  302. package/test/repository-snapshot-view.test.mjs +0 -112
  303. package/test/responses-runner.test.mjs +0 -465
  304. package/test/runtime-activity.test.mjs +0 -98
  305. package/test/sdk-worker-contract.test.mjs +0 -72
  306. package/test/security.test.mjs +0 -266
  307. package/test/setup-planner.test.mjs +0 -74
  308. package/test/setup-runtime.test.mjs +0 -51
  309. package/test/shell.test.mjs +0 -281
  310. package/test/skills.test.mjs +0 -22
  311. package/test/smoke.mjs +0 -122
  312. package/test/telemetry.test.mjs +0 -79
  313. package/test/terminal/local-pty.mock.test.mjs +0 -153
  314. package/test/terminal-machine-identity.test.mjs +0 -88
  315. package/test/theme-portability.test.mjs +0 -14
  316. package/test/tools-search.test.mjs +0 -73
  317. package/test/unit/website-assets-bindings.test.mjs +0 -60
  318. package/test/whoami-resume.test.mjs +0 -157
@@ -1,28 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import {
4
- AGENTSAM_MCP_PLUGIN_MANIFEST,
5
- INNERANIMALMEDIA_CLOUDFLARE_OAUTH_PLUGIN_MANIFEST,
6
- } from '../../src/plugins/index.js';
7
-
8
- test('Cloudflare OAuth installations have distinct client and callback contracts', () => {
9
- assert.equal(AGENTSAM_MCP_PLUGIN_MANIFEST.plugin_key, 'agentsam-mcp');
10
- assert.equal(AGENTSAM_MCP_PLUGIN_MANIFEST.auth_type, 'oauth');
11
- assert.equal(AGENTSAM_MCP_PLUGIN_MANIFEST.oauth_connect_url, '/api/connections/cloudflare/start');
12
- assert.equal(
13
- AGENTSAM_MCP_PLUGIN_MANIFEST.config.callback_url,
14
- 'https://agentsam.inneranimalmedia.com/api/connections/cloudflare/callback',
15
- );
16
- assert.equal(AGENTSAM_MCP_PLUGIN_MANIFEST.config.token_auth_method, 'none_pkce');
17
-
18
- assert.equal(INNERANIMALMEDIA_CLOUDFLARE_OAUTH_PLUGIN_MANIFEST.plugin_key, 'inneranimalmedia-cf-oauth');
19
- assert.equal(INNERANIMALMEDIA_CLOUDFLARE_OAUTH_PLUGIN_MANIFEST.auth_type, 'oauth_via_iam');
20
- assert.equal(
21
- INNERANIMALMEDIA_CLOUDFLARE_OAUTH_PLUGIN_MANIFEST.oauth_connect_url,
22
- 'https://inneranimalmedia.com/api/oauth/cloudflare/start',
23
- );
24
- assert.equal(
25
- INNERANIMALMEDIA_CLOUDFLARE_OAUTH_PLUGIN_MANIFEST.config.callback_url,
26
- 'https://inneranimalmedia.com/api/oauth/cloudflare/callback',
27
- );
28
- });
@@ -1,60 +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
-
8
- const repoRoot = path.resolve(new URL('../..', import.meta.url).pathname);
9
- /** Repo bin first — clean CI has no global `agentsam`; loader requires it on PATH. */
10
- function testEnv(home, extra = {}) {
11
- return {
12
- ...process.env,
13
- ...extra,
14
- HOME: home,
15
- PATH: `${path.join(repoRoot, 'bin')}${path.delimiter}${process.env.PATH || ''}`,
16
- };
17
- }
18
-
19
- test('agentsam env init creates provider profile and reusable source loader', { skip: process.platform === 'win32' }, t => {
20
- const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-env-cli-'));
21
- t.after(() => fs.rmSync(home, { recursive: true, force: true }));
22
- const env = testEnv(home);
23
- const result = spawnSync(process.execPath, ['src/cli.js', 'env', 'init', 'openai'], { cwd: repoRoot, env, encoding: 'utf8' });
24
- assert.equal(result.status, 0, result.stderr);
25
- assert.match(result.stdout, /source ~\/.agentsam\/load-agent-env\.sh(?:\s|$)/);
26
- assert.doesNotMatch(result.stdout, /source ~\/.agentsam\/load-agent-env\.sh openai/);
27
- assert.equal(fs.statSync(path.join(home, '.agentsam', 'env.d', 'openai.env')).mode & 0o777, 0o600);
28
- assert.equal(fs.statSync(path.join(home, '.agentsam', 'load-agent-env.sh')).mode & 0o777, 0o700);
29
- });
30
-
31
-
32
- test('Cloudflare env init backfills exactly one Wrangler account without printing credentials', async t => {
33
- const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-env-cf-'));
34
- t.after(() => fs.rmSync(home, { recursive: true, force: true }));
35
- const { runEnv } = await import('../../src/commands/env.js');
36
- let output = '';
37
- await runEnv(['init', 'cloudflare'], {
38
- home, env: { HOME: home }, write: text => { output += text; },
39
- spawnSyncImpl: () => ({ status: 0, stdout: JSON.stringify({ accounts: [{ id: '11111111111111111111111111111111', name: 'Example' }] }), stderr: '' }),
40
- });
41
- const profile = fs.readFileSync(path.join(home, '.agentsam', 'env.d', 'cloudflare.env'), 'utf8');
42
- assert.match(profile, /CLOUDFLARE_ACCOUNT_ID="11111111111111111111111111111111"/);
43
- assert.match(profile, /CLOUDFLARE_API_TOKEN=""/);
44
- assert.match(output, /account detected\/configured/);
45
- assert.doesNotMatch(output, /CLOUDFLARE_API_TOKEN=.*[^ ]/);
46
- });
47
-
48
-
49
- test('generated loader exports the selected provider profile into the caller shell', { skip: process.platform === 'win32' }, t => {
50
- const home = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-env-source-'));
51
- t.after(() => fs.rmSync(home, { recursive: true, force: true }));
52
- const env = testEnv(home);
53
- let result = spawnSync(process.execPath, ['src/cli.js', 'env', 'init', 'openai'], { cwd: repoRoot, env, encoding: 'utf8' });
54
- assert.equal(result.status, 0, result.stderr);
55
- fs.writeFileSync(path.join(home, '.agentsam', 'env.d', 'openai.env'), 'export OPENAI_API_KEY="sentinel-provider-key"\
56
- ', { mode: 0o600 });
57
- // Use bash -c (not -lc): a login shell resets PATH and drops the repo bin/agentsam needed on clean CI.
58
- result = spawnSync('bash', ['-c', 'source "$HOME/.agentsam/load-agent-env.sh" openai && test "$OPENAI_API_KEY" = "sentinel-provider-key"'], { env, encoding: 'utf8' });
59
- assert.equal(result.status, 0, result.stderr);
60
- });
@@ -1,197 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { createProviderAdapter } from '../../src/providers/index.js';
4
-
5
- function response(body, status = 200, headers = {}) {
6
- return {
7
- ok: status >= 200 && status < 300,
8
- status,
9
- headers: { get(name) { return headers[String(name).toLowerCase()] || null; } },
10
- async json() { return body; },
11
- async text() { return JSON.stringify(body); },
12
- };
13
- }
14
-
15
- test('OpenAI-compatible adapter accepts provider-discovered records and preserves cache key', async () => {
16
- let body;
17
- const record = {
18
- model_key: 'openai:account-model',
19
- provider: 'openai',
20
- provider_model_id: 'account-model',
21
- context_window: 128000,
22
- max_output_tokens: 8192,
23
- reasoning_efforts: ['auto'],
24
- service_tiers: ['default'],
25
- capabilities: { responses: true },
26
- pricing: null,
27
- };
28
- const provider = createProviderAdapter({
29
- modelRecord: record,
30
- credential: { value: 'key' },
31
- fetchImpl: async (url, init) => {
32
- assert.match(url, /\/v1\/responses$/);
33
- body = JSON.parse(init.body);
34
- return response({
35
- id: 'resp_1',
36
- status: 'completed',
37
- output_text: 'hello',
38
- output: [],
39
- usage: { input_tokens: 12, output_tokens: 3, input_tokens_details: { cached_tokens: 5 } },
40
- });
41
- },
42
- });
43
- const result = await provider.create({
44
- model: record.provider_model_id,
45
- modelRecord: record,
46
- input: 'hi',
47
- reasoningEffort: 'auto',
48
- serviceTier: 'default',
49
- promptCacheKey: 'session-1',
50
- });
51
- assert.equal(body.prompt_cache_key, 'session-1');
52
- assert.equal(body.reasoning, undefined);
53
- assert.equal(result.output_text, 'hello');
54
- assert.equal(result.provider_state.previous_response_id, 'resp_1');
55
- assert.equal(result.usage_snapshot.current_context.window_tokens, 128000);
56
- });
57
-
58
-
59
-
60
- test('xAI adapter supports native compaction without requiring a live API key in tests', async () => {
61
- const requests = [];
62
- const record = {
63
- model_key: 'grok:grok-test',
64
- provider: 'grok',
65
- provider_model_id: 'grok-test',
66
- context_window: 256000,
67
- max_output_tokens: 8192,
68
- reasoning_efforts: ['auto'],
69
- service_tiers: ['default'],
70
- capabilities: { responses: true, compaction: true, prompt_caching: true },
71
- pricing: null,
72
- };
73
- const provider = createProviderAdapter({
74
- modelRecord: record,
75
- credential: { value: 'xai-key' },
76
- fetchImpl: async (url, init) => {
77
- const body = JSON.parse(init.body);
78
- requests.push({ url, body });
79
- if (url.endsWith('/responses/compact')) {
80
- return response({
81
- id: 'cmp_1',
82
- object: 'response.compaction',
83
- output: [{ type: 'compaction', id: 'cmp_1', encrypted_content: 'opaque' }],
84
- usage: { input_tokens: 1000, output_tokens: 120, input_tokens_details: { cached_tokens: 0 } },
85
- });
86
- }
87
- return response({
88
- id: 'resp_xai_1',
89
- status: 'completed',
90
- output_text: 'first answer',
91
- output: [{ type: 'message', role: 'assistant', content: [{ type: 'output_text', text: 'first answer' }] }],
92
- usage: { input_tokens: 50, output_tokens: 10, input_tokens_details: { cached_tokens: 20 } },
93
- });
94
- },
95
- });
96
-
97
- const first = await provider.create({
98
- modelRecord: record,
99
- input: 'hello',
100
- instructions: 'stable system prefix',
101
- promptCacheKey: 'session-xai',
102
- });
103
- assert.equal(first.provider_state.previous_response_id, 'resp_xai_1');
104
- assert.equal(Array.isArray(first.provider_state.compaction_input), true);
105
- assert.equal(first.provider_state.compaction_input[0].role, 'system');
106
-
107
- const compacted = await provider.compact({
108
- modelRecord: record,
109
- providerState: first.provider_state,
110
- tokensBefore: 1000,
111
- });
112
- assert.match(requests.at(-1).url, /\/v1\/responses\/compact$/);
113
- assert.equal(Array.isArray(requests.at(-1).body.input), true);
114
- assert.equal(requests.at(-1).body.previous_response_id, undefined);
115
- assert.deepEqual(compacted.provider_state.compaction_input, [
116
- { type: 'compaction', id: 'cmp_1', encrypted_content: 'opaque' },
117
- ]);
118
- assert.equal(compacted.provider_state.previous_response_id, null);
119
-
120
- await provider.create({
121
- modelRecord: record,
122
- providerState: compacted.provider_state,
123
- input: 'continue after compaction',
124
- promptCacheKey: 'session-xai',
125
- });
126
- assert.deepEqual(requests.at(-1).body.input, [
127
- { type: 'compaction', id: 'cmp_1', encrypted_content: 'opaque' },
128
- { role: 'user', content: 'continue after compaction' },
129
- ]);
130
- });
131
-
132
-
133
- test('Anthropic adapter keeps append-only provider state and tool calls', async () => {
134
- const record = {
135
- model_key: 'anthropic:claude-test', provider: 'anthropic', provider_model_id: 'claude-test',
136
- context_window: 200000, max_output_tokens: 4096, reasoning_efforts: ['auto'], service_tiers: ['default'], pricing: null,
137
- };
138
- const provider = createProviderAdapter({
139
- modelRecord: record,
140
- credential: { value: 'key' },
141
- fetchImpl: async () => response({
142
- id: 'msg_1', stop_reason: 'tool_use',
143
- content: [{ type: 'tool_use', id: 'toolu_1', name: 'as_test', input: { a: 1 } }],
144
- usage: { input_tokens: 20, output_tokens: 5, cache_read_input_tokens: 7 },
145
- }),
146
- });
147
- const result = await provider.create({
148
- modelRecord: record,
149
- input: 'do it',
150
- instructions: 'stable prefix',
151
- tools: [{ type: 'function', name: 'as_test', description: 'test', parameters: { type: 'object', properties: {} } }],
152
- });
153
- assert.equal(result.tool_calls[0].call_id, 'toolu_1');
154
- assert.equal(result.provider_state.messages.at(-1).role, 'assistant');
155
- assert.equal(result.usage_snapshot.cumulative.cached_input_tokens, 7);
156
- });
157
-
158
- test('Gemini adapter maps provider token limits and function calls into AgentSam shape', async () => {
159
- const record = {
160
- model_key: 'gemini:gemini-test', provider: 'gemini', provider_model_id: 'gemini-test',
161
- context_window: 1000000, max_output_tokens: 8192, reasoning_efforts: ['auto'], service_tiers: ['default'], pricing: null,
162
- };
163
- const provider = createProviderAdapter({
164
- modelRecord: record,
165
- credential: { value: 'key' },
166
- fetchImpl: async () => response({
167
- responseId: 'gem_1',
168
- candidates: [{ finishReason: 'STOP', content: { role: 'model', parts: [{ functionCall: { name: 'as_test', args: { x: 2 } } }] } }],
169
- usageMetadata: { promptTokenCount: 30, candidatesTokenCount: 8, cachedContentTokenCount: 10, thoughtsTokenCount: 2 },
170
- }),
171
- });
172
- const result = await provider.create({ modelRecord: record, input: 'go', tools: [{ type: 'function', name: 'as_test', parameters: { type: 'object' } }] });
173
- assert.equal(result.tool_calls[0].name, 'as_test');
174
- assert.equal(result.usage_snapshot.current_context.window_tokens, 1000000);
175
- assert.equal(result.usage_snapshot.cumulative.reasoning_tokens, 2);
176
- });
177
-
178
- test('Cloudflare adapter executes account-scoped Workers AI through the connected account', async () => {
179
- let seen;
180
- const record = {
181
- model_key: 'cloudflare:@cf/test/model', provider: 'cloudflare', provider_model_id: '@cf/test/model',
182
- context_window: null, max_output_tokens: null, reasoning_efforts: ['auto'], service_tiers: ['default'], pricing: null,
183
- };
184
- const provider = createProviderAdapter({
185
- modelRecord: record,
186
- credential: { value: 'cf-token', account_id: '1234567890abcdef1234567890abcdef' },
187
- fetchImpl: async (url, init) => {
188
- seen = { url, headers: init.headers, body: JSON.parse(init.body) };
189
- return response({ id: 'cf_1', choices: [{ finish_reason: 'stop', message: { role: 'assistant', content: 'done' } }], usage: { prompt_tokens: 9, completion_tokens: 2 } });
190
- },
191
- });
192
- const result = await provider.create({ modelRecord: record, input: 'go' });
193
- assert.match(seen.url, /accounts\/1234567890abcdef1234567890abcdef\/ai\/v1\/chat\/completions$/);
194
- assert.equal(seen.headers['cf-aig-gateway-id'], 'default');
195
- assert.equal(seen.body.model, '@cf/test/model');
196
- assert.equal(result.output_text, 'done');
197
- });
@@ -1,90 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
- import { test } from 'node:test';
5
- import {
6
- COMPANY_REPOSITORY_GRAPH_SCHEMA_VERSION,
7
- createRepositoryContract,
8
- createRepositoryDependency,
9
- createRepositoryIdentity,
10
- } from '../../packages/agentsam-repository/src/contracts.js';
11
-
12
- const root = path.resolve(import.meta.dirname, '../..');
13
-
14
- function schema(relative) {
15
- return JSON.parse(fs.readFileSync(path.join(root, relative), 'utf8'));
16
- }
17
-
18
- test('portable repository identity is account-independent', () => {
19
- const identity = createRepositoryIdentity({
20
- repository_id: 'repo_agentsam_sdk',
21
- full_name: 'SamPrimeaux/agentsam-sdk',
22
- role: 'contract/runtime SDK',
23
- default_branch: 'main',
24
- });
25
- assert.equal(identity.schema_version, COMPANY_REPOSITORY_GRAPH_SCHEMA_VERSION);
26
- assert.equal(identity.repository_id, 'repo_agentsam_sdk');
27
- assert.equal(Object.hasOwn(identity, 'account_id'), false);
28
- assert.throws(() => createRepositoryIdentity({
29
- repository_id: 'repo_x', full_name: 'owner/repo', role: 'test', account_id: 'au_test',
30
- }), /must not embed account_id/);
31
- });
32
-
33
- test('repository contracts use account and repository SSOT only', () => {
34
- const record = createRepositoryContract({
35
- id: 'rct_runtime_receipts_v2',
36
- account_id: 'au_test',
37
- repository_id: 'repo_agentsam_sdk',
38
- contract_key: 'runtime-receipts',
39
- contract_version: '2',
40
- contract_type: 'schema',
41
- name: 'Runtime receipts',
42
- manifest_path: 'protocol/telemetry',
43
- contract_hash: `sha256:${'1'.repeat(64)}`,
44
- });
45
- assert.equal(record.account_id, 'au_test');
46
- assert.equal(record.contract_type, 'schema');
47
- assert.equal(record.status, 'active');
48
- assert.throws(() => createRepositoryContract({
49
- ...record, id: 'bad', workspace_id: 'ws_old',
50
- }), /legacy ownership field/);
51
- });
52
-
53
- test('repository dependencies encode cross-repo criticality and failure policy', () => {
54
- const edge = createRepositoryDependency({
55
- id: 'rdep_iam_execos',
56
- account_id: 'au_test',
57
- source_repository_id: 'repo_inneranimalmedia',
58
- target_repository_id: 'repo_execos',
59
- dependency_type: 'runtime',
60
- criticality: 'critical',
61
- required_version: '1',
62
- required_contract_hash: `sha256:${'2'.repeat(64)}`,
63
- failure_policy: 'block_deploy',
64
- });
65
- assert.equal(edge.dependency_type, 'runtime');
66
- assert.equal(edge.criticality, 'critical');
67
- assert.equal(edge.failure_policy, 'block_deploy');
68
- assert.throws(() => createRepositoryDependency({ ...edge, criticality: 'whatever' }), /unsupported criticality/);
69
- assert.throws(() => createRepositoryDependency({ ...edge, owner_user_id: 'usr_old' }), /legacy ownership field/);
70
- });
71
-
72
- test('published JSON schemas expose the same ownership boundary', () => {
73
- const identity = schema('protocol/repository/repository-identity.schema.json');
74
- const contract = schema('protocol/repository/repository-contract.schema.json');
75
- const dependency = schema('protocol/repository/repository-dependency.schema.json');
76
-
77
- assert.equal(identity.additionalProperties, false);
78
- assert.equal(Object.hasOwn(identity.properties, 'account_id'), false);
79
- assert.ok(contract.required.includes('account_id'));
80
- assert.ok(contract.required.includes('repository_id'));
81
- assert.ok(dependency.required.includes('account_id'));
82
- assert.ok(dependency.required.includes('source_repository_id'));
83
- assert.ok(dependency.required.includes('target_repository_id'));
84
-
85
- for (const item of [identity, contract, dependency]) {
86
- for (const legacy of ['tenant_id', 'workspace_id', 'user_id', 'owner_user_id']) {
87
- assert.equal(Object.hasOwn(item.properties, legacy), false, `${legacy} must not be part of ${item.title}`);
88
- }
89
- }
90
- });
@@ -1,87 +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 { createLocalSqliteDatabase } from '../../src/local/sqlite.js';
7
- import { applyRuntimeMigrations } from '../../src/local/migrations.js';
8
-
9
- const repoRoot = path.resolve(new URL('../..', import.meta.url).pathname);
10
-
11
- test('portable runtime migration installs AgentSam CLI state tables idempotently', async (t) => {
12
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-runtime-migration-'));
13
- t.after(() => fs.rmSync(root, { recursive: true, force: true }));
14
- const db = await createLocalSqliteDatabase(path.join(root, 'agentsam.sqlite'));
15
- try {
16
- const first = await applyRuntimeMigrations(db);
17
- const migrationCount = fs.readdirSync(path.join(repoRoot, 'migrations', 'runtime'))
18
- .filter((name) => /^\d+.*\.sql$/i.test(name)).length;
19
- assert.equal(first.applied, migrationCount);
20
-
21
- const tables = await db.prepare(
22
- "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'agentsam_%' ORDER BY name"
23
- ).all();
24
- const names = new Set(tables.results.map((row) => row.name));
25
- for (const name of [
26
- 'agentsam_agent_run',
27
- 'agentsam_approval_queue',
28
- 'agentsam_compaction_events',
29
- 'agentsam_context_digest',
30
- 'agentsam_cron_runs',
31
- 'agentsam_plans',
32
- 'agentsam_project_sessions',
33
- 'agentsam_schema_migrations',
34
- 'agentsam_todo',
35
- ]) assert.equal(names.has(name), true, name);
36
-
37
- const timers = await db.prepare(
38
- "SELECT name FROM sqlite_master WHERE type='table' AND name='active_timers'"
39
- ).first();
40
- assert.equal(timers.name, 'active_timers');
41
-
42
- const second = await applyRuntimeMigrations(db);
43
- assert.equal(second.applied, 0);
44
- assert.equal(second.results[0].status, 'already_applied');
45
- } finally {
46
- db.close();
47
- }
48
- });
49
-
50
- test('ephemeral context digests expire and refresh while durable digests stay durable', async (t) => {
51
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'agentsam-digest-migration-'));
52
- t.after(() => fs.rmSync(root, { recursive: true, force: true }));
53
- const db = await createLocalSqliteDatabase(path.join(root, 'agentsam.sqlite'));
54
- try {
55
- await applyRuntimeMigrations(db);
56
-
57
- await db.prepare(
58
- "INSERT INTO agentsam_context_digest (id,digest_type,source_hash,digest_hash,digest_text) VALUES (?,?,?,?,?)"
59
- ).bind('repo_1', 'repo', 's1', 'h1', 'durable').run();
60
- const durable = await db.prepare(
61
- 'SELECT expires_at_unix FROM agentsam_context_digest WHERE id=?'
62
- ).bind('repo_1').first();
63
- assert.equal(durable.expires_at_unix, null);
64
-
65
- await db.prepare(
66
- "INSERT INTO agentsam_context_digest (id,digest_type,source_hash,digest_hash,digest_text) VALUES (?,?,?,?,?)"
67
- ).bind('session_1', 'session', 's2', 'h2', 'ephemeral').run();
68
- const initial = await db.prepare(
69
- 'SELECT expires_at_unix FROM agentsam_context_digest WHERE id=?'
70
- ).bind('session_1').first();
71
- assert.equal(Number(initial.expires_at_unix) > 0, true);
72
-
73
- await db.prepare(
74
- 'UPDATE agentsam_context_digest SET expires_at_unix = unixepoch() + 60 WHERE id=?'
75
- ).bind('session_1').run();
76
- await db.prepare(
77
- 'UPDATE agentsam_context_digest SET hit_count = hit_count + 1 WHERE id=?'
78
- ).bind('session_1').run();
79
- const refreshed = await db.prepare(
80
- 'SELECT expires_at_unix, hit_count FROM agentsam_context_digest WHERE id=?'
81
- ).bind('session_1').first();
82
- assert.equal(refreshed.hit_count, 1);
83
- assert.equal(Number(refreshed.expires_at_unix) > Math.floor(Date.now() / 1000) + 2_500_000, true);
84
- } finally {
85
- db.close();
86
- }
87
- });