@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
@@ -0,0 +1,202 @@
1
+ import {
2
+ GOAP_SCHEMAS,
3
+ normalizeActionSpec,
4
+ normalizeBlackboard,
5
+ normalizeGoal,
6
+ } from './contracts.js';
7
+ import { goapInputError } from './errors.js';
8
+
9
+ const TODO_TO_GOAL_STATUS = Object.freeze({
10
+ open: 'proposed',
11
+ running: 'active',
12
+ blocked: 'blocked',
13
+ complete: 'satisfied',
14
+ cancelled: 'cancelled',
15
+ });
16
+
17
+ const PRIORITY_COST = Object.freeze({
18
+ critical: 1,
19
+ high: 2,
20
+ medium: 3,
21
+ low: 4,
22
+ });
23
+
24
+ function clean(value) {
25
+ return value == null ? '' : String(value).trim();
26
+ }
27
+
28
+ function array(value) {
29
+ return Array.isArray(value) ? value : [];
30
+ }
31
+
32
+ function object(value) {
33
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
34
+ }
35
+
36
+ function taskById(plan) {
37
+ return new Map(array(plan?.tasks).map((task) => [task.id, task]));
38
+ }
39
+
40
+ function blockersFor(plan, task) {
41
+ const byId = taskById(plan);
42
+ return array(task?.metadata?.depends_on)
43
+ .map((id) => byId.get(id) || { id, title: null, status: 'missing' })
44
+ .filter((dependency) => dependency.status !== 'complete')
45
+ .map((dependency) => ({
46
+ id: dependency.id,
47
+ title: dependency.title || null,
48
+ status: dependency.status,
49
+ }));
50
+ }
51
+
52
+ export function projectPlanActions(plan = {}) {
53
+ const available = [];
54
+ const blocked = [];
55
+
56
+ for (const task of array(plan.tasks)) {
57
+ if (task.status !== 'open') continue;
58
+ const blockers = blockersFor(plan, task);
59
+ const action = {
60
+ id: task.id,
61
+ title: task.title,
62
+ status: task.status,
63
+ spec: normalizeActionSpec({
64
+ preconditions: array(task.metadata?.depends_on).map((todoId) => ({
65
+ fact: 'todo.complete',
66
+ todo_id: todoId,
67
+ value: true,
68
+ })),
69
+ effects: [{
70
+ fact: 'todo.complete',
71
+ todo_id: task.id,
72
+ value: true,
73
+ }],
74
+ cost: PRIORITY_COST[task.priority] ?? 3,
75
+ metadata: {
76
+ kind: task.metadata?.kind || 'work',
77
+ priority: task.priority || 'medium',
78
+ sort_order: Number(task.sort_order ?? 50),
79
+ },
80
+ }),
81
+ };
82
+
83
+ if (blockers.length) blocked.push({ ...action, blockers });
84
+ else available.push(action);
85
+ }
86
+
87
+ return { available, blocked };
88
+ }
89
+
90
+ export function projectGoapWorld({
91
+ repository = {},
92
+ plan,
93
+ activeTodo = null,
94
+ actions = null,
95
+ knowledge = {},
96
+ evidence = null,
97
+ accountId = null,
98
+ revision = 1,
99
+ updatedAt = null,
100
+ } = {}) {
101
+ const repositoryId = clean(repository.repository_id ?? repository.repositoryId);
102
+ if (!repositoryId) {
103
+ throw goapInputError('repository.repository_id is required for GOAP world projection', {
104
+ stage: 'project_world',
105
+ details: { field: 'repository.repository_id' },
106
+ });
107
+ }
108
+ if (!plan?.id) {
109
+ throw goapInputError('plan.id is required for GOAP world projection', {
110
+ stage: 'project_world',
111
+ details: { field: 'plan.id' },
112
+ });
113
+ }
114
+
115
+ const projectedActions = actions || projectPlanActions(plan);
116
+ const todo = activeTodo || null;
117
+ const goalId = todo?.id || plan.id;
118
+ const goalTitle = todo?.title || plan.title || plan.id;
119
+ const goalStatus = todo
120
+ ? (TODO_TO_GOAL_STATUS[todo.status] || 'proposed')
121
+ : (Number(plan.tasks_done || 0) === Number(plan.tasks_total || -1) ? 'satisfied' : 'active');
122
+
123
+ const state = {
124
+ plan: {
125
+ id: plan.id,
126
+ title: plan.title || null,
127
+ status: plan.status || null,
128
+ tasks_done: Number(plan.tasks_done || 0),
129
+ tasks_total: Number(plan.tasks_total || array(plan.tasks).length),
130
+ },
131
+ todo: todo ? {
132
+ id: todo.id,
133
+ title: todo.title || null,
134
+ status: todo.status || null,
135
+ priority: todo.priority || null,
136
+ kind: todo.metadata?.kind || 'work',
137
+ depends_on: array(todo.metadata?.depends_on),
138
+ acceptance: array(todo.metadata?.acceptance),
139
+ evidence: array(todo.metadata?.evidence),
140
+ } : null,
141
+ repository: {
142
+ repository_id: repositoryId,
143
+ branch: repository.branch || null,
144
+ revision_sha: repository.revision_sha || repository.revisionSha || null,
145
+ dirty: repository.dirty ?? null,
146
+ merkle_root: repository.merkle_root || null,
147
+ },
148
+ knowledge: { ...object(knowledge) },
149
+ actions: projectedActions,
150
+ evidence: evidence || null,
151
+ };
152
+
153
+ const blackboard = normalizeBlackboard({
154
+ id: 'world:' + repositoryId,
155
+ account_id: clean(accountId) || null,
156
+ repository_id: repositoryId,
157
+ current_goal_id: goalId,
158
+ state,
159
+ revision,
160
+ locked_by: 'project_local_plan',
161
+ checkpoint_sha: repository.revision_sha || repository.revisionSha || null,
162
+ last_action: 'world_snapshot_projected',
163
+ updated_at: updatedAt,
164
+ });
165
+
166
+ const goal = normalizeGoal({
167
+ id: goalId,
168
+ account_id: clean(accountId),
169
+ repository_id: repositoryId,
170
+ title: goalTitle,
171
+ goal_status: goalStatus,
172
+ priority: todo?.priority || null,
173
+ spec: {
174
+ desired: [{
175
+ fact: todo ? 'todo.complete' : 'plan.complete',
176
+ [todo ? 'todo_id' : 'plan_id']: goalId,
177
+ value: true,
178
+ }],
179
+ constraints: array(todo?.metadata?.depends_on).map((todoId) => ({
180
+ fact: 'todo.complete',
181
+ todo_id: todoId,
182
+ value: true,
183
+ })),
184
+ metadata: {
185
+ source: 'project_local_plan',
186
+ plan_id: plan.id,
187
+ todo_id: todo?.id || null,
188
+ },
189
+ },
190
+ updated_at: updatedAt,
191
+ });
192
+
193
+ return {
194
+ schema: GOAP_SCHEMAS.world,
195
+ source: 'project_local_plan',
196
+ repository_id: repositoryId,
197
+ blackboard,
198
+ goal,
199
+ actions: projectedActions,
200
+ evidence: evidence || null,
201
+ };
202
+ }
@@ -0,0 +1,245 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import {
5
+ AgentSamError,
6
+ ERROR_REASON,
7
+ planRecovery,
8
+ } from '@inneranimalmedia/agentsam-errors';
9
+ import {
10
+ GOAP_SCHEMAS,
11
+ MemoryGoapAdapter,
12
+ createD1SqliteGoapAdapter,
13
+ createGoapControlPlane,
14
+ goalStatusFromTicket,
15
+ ticketStatusFromGoal,
16
+ } from '../src/index.js';
17
+
18
+ const scope = {
19
+ account_id: 'acct_test',
20
+ repository_id: 'github:example/repo',
21
+ workspace_id: 'ws_test',
22
+ };
23
+
24
+ test('status mapping preserves database statuses while exposing logical GOAP states', () => {
25
+ assert.equal(goalStatusFromTicket('backlog'), 'proposed');
26
+ assert.equal(goalStatusFromTicket('in_review'), 'verifying');
27
+ assert.equal(ticketStatusFromGoal('satisfied'), 'shipped');
28
+ });
29
+
30
+ test('memory adapter atomically activates goal with CAS and append-only cursor', async () => {
31
+ const adapter = new MemoryGoapAdapter({
32
+ blackboards: [{
33
+ ...scope,
34
+ id: 'bb_1',
35
+ current_goal_id: null,
36
+ state: { build: { valid: false } },
37
+ revision: 4,
38
+ }],
39
+ goals: [{
40
+ ...scope,
41
+ id: 'tkt_1',
42
+ title: 'Make build valid',
43
+ status: 'backlog',
44
+ goal_spec_json: { desired: [{ fact: 'build.valid', op: 'eq', value: true }] },
45
+ }],
46
+ });
47
+
48
+ const service = createGoapControlPlane({ ports: adapter.ports(), clock: () => 100 });
49
+ const activated = await service.activateGoal({
50
+ scope,
51
+ goalId: 'tkt_1',
52
+ expectedRevision: 4,
53
+ actor: { type: 'test', id: 'runner' },
54
+ });
55
+
56
+ assert.equal(activated.blackboard.revision, 5);
57
+ assert.equal(activated.blackboard.current_goal_id, 'tkt_1');
58
+ assert.equal(activated.goal.status, 'active');
59
+ assert.equal(activated.events.length, 1);
60
+ assert.equal(activated.events[0].type, 'goal.activated');
61
+ assert.equal(activated.events[0].payload.blackboard_revision, 5);
62
+ assert.match(activated.events[0].cursor, /^memory:/);
63
+
64
+ await assert.rejects(
65
+ service.activateGoal({ scope, goalId: 'tkt_1', expectedRevision: 4 }),
66
+ (error) => {
67
+ assert.equal(error instanceof AgentSamError, true);
68
+ assert.equal(error.reason, ERROR_REASON.STALE_VERSION);
69
+ assert.equal(error.code, 'ABORTED');
70
+ assert.equal(error.envelope.tool, 'goap');
71
+ assert.equal(planRecovery(error.envelope).disposition, 'retry');
72
+ return true;
73
+ },
74
+ );
75
+ });
76
+
77
+ function d1Like(db) {
78
+ return {
79
+ prepare(sql) {
80
+ const statement = db.prepare(sql);
81
+ return {
82
+ bind(...values) {
83
+ return {
84
+ async first() {
85
+ return statement.get(...values) ?? null;
86
+ },
87
+ async all() {
88
+ return { results: statement.all(...values) };
89
+ },
90
+ async run() {
91
+ return statement.run(...values);
92
+ },
93
+ };
94
+ },
95
+ };
96
+ },
97
+ async batch(statements) {
98
+ db.exec('BEGIN IMMEDIATE');
99
+ try {
100
+ const results = [];
101
+ for (const statement of statements) results.push(await statement.run());
102
+ db.exec('COMMIT');
103
+ return results;
104
+ } catch (error) {
105
+ try { db.exec('ROLLBACK'); } catch {}
106
+ throw error;
107
+ }
108
+ },
109
+ };
110
+ }
111
+
112
+ function createSqlite({ eventOwnership = true } = {}) {
113
+ const sqlite = new DatabaseSync(':memory:');
114
+ const eventOwnershipColumns = eventOwnership ? 'account_id TEXT, repository_id TEXT,' : '';
115
+ sqlite.exec([
116
+ 'CREATE TABLE agentsam_workspace_state (',
117
+ 'id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, repository_id TEXT NOT NULL,',
118
+ 'current_task_id TEXT, state_json TEXT NOT NULL DEFAULT \'{}\',',
119
+ 'state_schema TEXT NOT NULL DEFAULT \'agentsam.blackboard.v1\',',
120
+ 'revision INTEGER NOT NULL DEFAULT 1, locked_by TEXT, lock_expires_at INTEGER,',
121
+ 'checkpoint_sha TEXT, last_agent_action TEXT, updated_at INTEGER NOT NULL);',
122
+ 'CREATE TABLE agentsam_tickets (',
123
+ 'id TEXT PRIMARY KEY, title TEXT NOT NULL, status TEXT NOT NULL, priority TEXT,',
124
+ 'account_id TEXT NOT NULL, repository_id TEXT NOT NULL, goal_schema TEXT,',
125
+ 'goal_spec_json TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL);',
126
+ 'CREATE TABLE agentsam_ticket_events (',
127
+ 'id TEXT PRIMARY KEY, ticket_id TEXT NOT NULL, event_type TEXT NOT NULL, detail TEXT,',
128
+ 'created_at INTEGER NOT NULL, actor_type TEXT, actor_id TEXT, ' + eventOwnershipColumns,
129
+ 'payload_json TEXT NOT NULL DEFAULT \'{}\', workflow_run_id TEXT, execution_step_id TEXT,',
130
+ 'schema_version TEXT NOT NULL DEFAULT \'agentsam.event.v1\');',
131
+ ].join('\n'));
132
+ sqlite.prepare(
133
+ 'INSERT INTO agentsam_workspace_state ' +
134
+ '(id, workspace_id, repository_id, current_task_id, state_json, revision, updated_at) ' +
135
+ 'VALUES (?, ?, ?, NULL, \'{}\', 7, 1)',
136
+ ).run('bb_sql', scope.workspace_id, scope.repository_id);
137
+ sqlite.prepare(
138
+ 'INSERT INTO agentsam_tickets ' +
139
+ '(id, title, status, account_id, repository_id, goal_schema, goal_spec_json, created_at, updated_at) ' +
140
+ 'VALUES (?, ?, \'backlog\', ?, ?, ?, ?, 1, 1)',
141
+ ).run(
142
+ 'tkt_sql',
143
+ 'Ship portable GOAP',
144
+ scope.account_id,
145
+ scope.repository_id,
146
+ GOAP_SCHEMAS.goal,
147
+ JSON.stringify({ schema: GOAP_SCHEMAS.goal, desired: [] }),
148
+ );
149
+ return sqlite;
150
+ }
151
+
152
+
153
+ test('repository_join blackboard ownership rejects cross-account reads on shared stores', async () => {
154
+ const sqlite = createSqlite();
155
+ sqlite.exec(
156
+ 'CREATE TABLE code_repositories (id TEXT PRIMARY KEY, account_id TEXT NOT NULL);',
157
+ );
158
+ sqlite.prepare(
159
+ 'INSERT INTO code_repositories (id, account_id) VALUES (?, ?)',
160
+ ).run(scope.repository_id, scope.account_id);
161
+
162
+ const ports = createD1SqliteGoapAdapter({
163
+ db: d1Like(sqlite),
164
+ blackboardOwnership: 'repository_join',
165
+ });
166
+
167
+ const owned = await ports.blackboardStore.get(scope);
168
+ assert.equal(owned.repository_id, scope.repository_id);
169
+
170
+ const foreign = await ports.blackboardStore.get({
171
+ ...scope,
172
+ account_id: 'acct_other',
173
+ });
174
+ assert.equal(foreign, null);
175
+
176
+ sqlite.close();
177
+ });
178
+
179
+ test('D1/SQLite adapter atomically guards stale revisions with canonical AgentSam errors', async () => {
180
+ const sqlite = createSqlite();
181
+ const ports = createD1SqliteGoapAdapter({ db: d1Like(sqlite) });
182
+ const service = createGoapControlPlane({ ports, clock: () => 1234 });
183
+
184
+ await assert.rejects(
185
+ service.activateGoal({ scope, goalId: 'tkt_sql', expectedRevision: 6 }),
186
+ (error) => {
187
+ assert.equal(error instanceof AgentSamError, true);
188
+ assert.equal(error.reason, ERROR_REASON.STALE_VERSION);
189
+ assert.equal(error.envelope.domain, 'tool');
190
+ assert.equal(error.envelope.tool, 'goap');
191
+ return true;
192
+ },
193
+ );
194
+
195
+ assert.equal(sqlite.prepare('SELECT revision FROM agentsam_workspace_state').get().revision, 7);
196
+ assert.equal(sqlite.prepare('SELECT status FROM agentsam_tickets').get().status, 'backlog');
197
+ assert.equal(sqlite.prepare('SELECT COUNT(*) AS n FROM agentsam_ticket_events').get().n, 0);
198
+
199
+ const result = await service.activateGoal({
200
+ scope,
201
+ goalId: 'tkt_sql',
202
+ expectedRevision: 7,
203
+ actor: { type: 'test', id: 'sqlite' },
204
+ });
205
+
206
+ assert.equal(result.blackboard.revision, 8);
207
+ assert.equal(result.blackboard.current_goal_id, 'tkt_sql');
208
+ assert.equal(result.goal.status, 'active');
209
+ assert.equal(result.events[0].type, 'goal.activated');
210
+ assert.match(result.events[0].cursor, /^sqlite:/);
211
+
212
+ const eventRow = sqlite.prepare(
213
+ 'SELECT account_id, repository_id, payload_json, schema_version FROM agentsam_ticket_events LIMIT 1',
214
+ ).get();
215
+ assert.equal(eventRow.account_id, scope.account_id);
216
+ assert.equal(eventRow.repository_id, scope.repository_id);
217
+ assert.equal(eventRow.schema_version, GOAP_SCHEMAS.event);
218
+ assert.equal(JSON.parse(eventRow.payload_json).blackboard_revision, 8);
219
+
220
+ sqlite.close();
221
+ });
222
+
223
+ test('ticket_join event ownership supports the legacy platform event table', async () => {
224
+ const sqlite = createSqlite({ eventOwnership: false });
225
+ const ports = createD1SqliteGoapAdapter({
226
+ db: d1Like(sqlite),
227
+ eventOwnership: 'ticket_join',
228
+ cursorPrefix: 'd1',
229
+ });
230
+ const service = createGoapControlPlane({ ports, clock: () => 2000 });
231
+
232
+ const result = await service.activateGoal({
233
+ scope,
234
+ goalId: 'tkt_sql',
235
+ expectedRevision: 7,
236
+ });
237
+
238
+ assert.equal(result.blackboard.revision, 8);
239
+ assert.equal(result.goal.status, 'active');
240
+ assert.equal(result.events.length, 1);
241
+ assert.match(result.events[0].cursor, /^d1:/);
242
+ assert.equal(sqlite.prepare('SELECT COUNT(*) AS n FROM agentsam_ticket_events').get().n, 1);
243
+
244
+ sqlite.close();
245
+ });
@@ -0,0 +1,79 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { projectGoapWorld, projectPlanActions } from '../src/world.js';
4
+
5
+ const plan = {
6
+ id: 'plan_1',
7
+ title: 'Ship portable loop',
8
+ status: 'active',
9
+ tasks_done: 1,
10
+ tasks_total: 3,
11
+ tasks: [
12
+ {
13
+ id: 'todo_done',
14
+ title: 'Freeze contract',
15
+ status: 'complete',
16
+ priority: 'high',
17
+ sort_order: 10,
18
+ metadata: { kind: 'decision', depends_on: [] },
19
+ },
20
+ {
21
+ id: 'todo_active',
22
+ title: 'Project world',
23
+ status: 'running',
24
+ priority: 'critical',
25
+ sort_order: 20,
26
+ metadata: { kind: 'implement', depends_on: ['todo_done'], acceptance: [], evidence: [] },
27
+ },
28
+ {
29
+ id: 'todo_next',
30
+ title: 'Verify loop',
31
+ status: 'open',
32
+ priority: 'high',
33
+ sort_order: 30,
34
+ metadata: { kind: 'verify', depends_on: ['todo_active'] },
35
+ },
36
+ ],
37
+ };
38
+
39
+ test('projectPlanActions converts TODO dependencies into GOAP preconditions', () => {
40
+ const actions = projectPlanActions(plan);
41
+ assert.equal(actions.available.length, 0);
42
+ assert.equal(actions.blocked.length, 1);
43
+ assert.equal(actions.blocked[0].id, 'todo_next');
44
+ assert.equal(actions.blocked[0].blockers[0].id, 'todo_active');
45
+ assert.deepEqual(actions.blocked[0].spec.preconditions[0], {
46
+ fact: 'todo.complete',
47
+ todo_id: 'todo_active',
48
+ value: true,
49
+ });
50
+ });
51
+
52
+ test('projectGoapWorld emits canonical world, blackboard, goal, and action contracts', () => {
53
+ const world = projectGoapWorld({
54
+ repository: {
55
+ repository_id: 'github:example/repo',
56
+ branch: 'main',
57
+ revision_sha: 'abc123',
58
+ dirty: false,
59
+ merkle_root: 'sha256:merkle',
60
+ },
61
+ plan,
62
+ activeTodo: plan.tasks[1],
63
+ knowledge: { status: 'current', generation_id: 'gen_1' },
64
+ evidence: { primitive: 'repository.audit', chars: 900 },
65
+ revision: 7,
66
+ updatedAt: 123,
67
+ });
68
+
69
+ assert.equal(world.schema, 'agentsam.goap.world.v1');
70
+ assert.equal(world.blackboard.schema, 'agentsam.blackboard.v1');
71
+ assert.equal(world.blackboard.current_goal_id, 'todo_active');
72
+ assert.equal(world.blackboard.revision, 7);
73
+ assert.equal(world.blackboard.state.repository.merkle_root, 'sha256:merkle');
74
+ assert.equal(world.goal.schema, 'agentsam.goal.v1');
75
+ assert.equal(world.goal.id, 'todo_active');
76
+ assert.equal(world.goal.status, 'active');
77
+ assert.equal(world.goal.spec.desired[0].fact, 'todo.complete');
78
+ assert.equal(world.actions.blocked[0].id, 'todo_next');
79
+ });
@@ -0,0 +1,43 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import { NavCollapsible, NavCollapsibleContent, NavCollapsibleTrigger } from './NavCollapsible.js';
3
+ import { NavContent } from './NavContent.js';
4
+ import { NavFooter } from './NavFooter.js';
5
+ import { NavGroup, NavGroupLabel } from './NavGroup.js';
6
+ import { NavHeader } from './NavHeader.js';
7
+ import { NavMenu, NavMenuButton, NavMenuChevron, NavMenuItem, NavMenuSub, NavMenuSubButton } from './NavMenu.js';
8
+ import { NavProvider } from './NavProvider.js';
9
+ import { NavTrigger } from './NavTrigger.js';
10
+ import { NavScope, NavSidenav, NavTopbar, NavTopbarLogo, NavTopbarSpacer, NavProjectContext, NavAccountSwitcher, NavFilesResources, NavPinnedSummary, NavConversationActions, NavShareButton, NavOverflowMenu, NavModeSwitcher } from './Surfaces.js';
11
+ declare function NavRoot({ className, children, ...props }: HTMLAttributes<HTMLElement>): import("react").JSX.Element;
12
+ export declare const Nav: typeof NavRoot & {
13
+ Scope: typeof NavScope;
14
+ Sidenav: typeof NavSidenav;
15
+ Topbar: typeof NavTopbar;
16
+ TopbarLogo: typeof NavTopbarLogo;
17
+ TopbarSpacer: typeof NavTopbarSpacer;
18
+ ProjectContext: typeof NavProjectContext;
19
+ AccountSwitcher: typeof NavAccountSwitcher;
20
+ FilesResources: typeof NavFilesResources;
21
+ PinnedSummary: typeof NavPinnedSummary;
22
+ ConversationActions: typeof NavConversationActions;
23
+ ShareButton: typeof NavShareButton;
24
+ OverflowMenu: typeof NavOverflowMenu;
25
+ ModeSwitcher: typeof NavModeSwitcher;
26
+ Provider: typeof NavProvider;
27
+ Header: typeof NavHeader;
28
+ Content: typeof NavContent;
29
+ Footer: typeof NavFooter;
30
+ Group: typeof NavGroup;
31
+ GroupLabel: typeof NavGroupLabel;
32
+ Menu: typeof NavMenu;
33
+ MenuItem: typeof NavMenuItem;
34
+ MenuButton: typeof NavMenuButton;
35
+ MenuSub: typeof NavMenuSub;
36
+ MenuSubButton: typeof NavMenuSubButton;
37
+ MenuChevron: typeof NavMenuChevron;
38
+ Collapsible: typeof NavCollapsible;
39
+ CollapsibleTrigger: typeof NavCollapsibleTrigger;
40
+ CollapsibleContent: typeof NavCollapsibleContent;
41
+ Trigger: typeof NavTrigger;
42
+ };
43
+ export {};
@@ -0,0 +1,10 @@
1
+ import { type ButtonHTMLAttributes, type HTMLAttributes, type ReactElement, type ReactNode } from 'react';
2
+ export declare function NavCollapsible({ children, defaultOpen }: {
3
+ children: ReactNode;
4
+ defaultOpen?: boolean;
5
+ }): import("react").JSX.Element;
6
+ export declare function NavCollapsibleTrigger({ render, children, className, ...props }: ButtonHTMLAttributes<HTMLButtonElement> & {
7
+ render?: ReactElement;
8
+ children?: ReactNode;
9
+ }): import("react").JSX.Element;
10
+ export declare function NavCollapsibleContent({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavContent({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavGroup({ className, ...props }: HTMLAttributes<HTMLElement>): import("react").JSX.Element;
3
+ export declare function NavGroupLabel({ className, ...props }: HTMLAttributes<HTMLParagraphElement>): import("react").JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { HTMLAttributes } from 'react';
2
+ export declare function NavHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import type { ButtonHTMLAttributes, HTMLAttributes, ReactNode } from 'react';
2
+ export declare function NavMenu({ className, ...props }: HTMLAttributes<HTMLUListElement>): import("react").JSX.Element;
3
+ export declare function NavMenuItem({ className, ...props }: HTMLAttributes<HTMLLIElement>): import("react").JSX.Element;
4
+ export type NavMenuButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
5
+ icon?: unknown;
6
+ active?: boolean;
7
+ itemId?: string;
8
+ children: ReactNode;
9
+ };
10
+ export declare function NavMenuButton({ icon: Icon, active, itemId, className, children, ...props }: NavMenuButtonProps): import("react").JSX.Element;
11
+ export declare function NavMenuSub({ className, ...props }: HTMLAttributes<HTMLUListElement>): import("react").JSX.Element;
12
+ export type NavMenuSubButtonProps = {
13
+ href?: string;
14
+ active?: boolean;
15
+ className?: string;
16
+ children?: unknown;
17
+ onClick?: (event: React.MouseEvent<HTMLAnchorElement>) => void;
18
+ };
19
+ export declare function NavMenuSubButton({ active, className, children, ...props }: NavMenuSubButtonProps): import("react").JSX.Element;
20
+ export declare function NavMenuChevron({ className }: {
21
+ className?: string;
22
+ }): import("react").JSX.Element;
@@ -0,0 +1,35 @@
1
+ import { type PropsWithChildren } from 'react';
2
+ import type { NavTheme, NavValue, NavTokens } from './contracts.js';
3
+ export type NavContextValue = {
4
+ data: NavValue;
5
+ tokens: NavTokens;
6
+ theme: NavTheme;
7
+ accentColor: string;
8
+ menu: string | null;
9
+ setMenu: (menu: string | null) => void;
10
+ open: boolean;
11
+ isMobile: boolean;
12
+ isPeeking: boolean;
13
+ peekable: boolean;
14
+ resizable: boolean;
15
+ width: number;
16
+ mobileBreakpoint: number;
17
+ setOpen: (open: boolean) => void;
18
+ toggle: () => void;
19
+ close: () => void;
20
+ setPeeking: (peeking: boolean) => void;
21
+ setWidth: (width: number) => void;
22
+ scrollToItem: (itemId: string) => void;
23
+ };
24
+ export type NavProviderProps = PropsWithChildren<{
25
+ value?: NavValue;
26
+ tokens?: NavTokens;
27
+ theme?: NavTheme;
28
+ accentColor?: string;
29
+ defaultOpen?: boolean;
30
+ mobileBreakpoint?: number;
31
+ peekable?: boolean;
32
+ resizable?: boolean;
33
+ }>;
34
+ export declare function NavProvider({ children, value: data, tokens, theme, accentColor, defaultOpen, mobileBreakpoint, peekable, resizable, }: NavProviderProps): import("react").JSX.Element;
35
+ export declare function useNav(): NavContextValue;
@@ -0,0 +1,2 @@
1
+ import type { ButtonHTMLAttributes } from 'react';
2
+ export declare function NavTrigger({ className, 'aria-label': ariaLabel, ...props }: ButtonHTMLAttributes<HTMLButtonElement>): import("react").JSX.Element;