experimental-ash 0.28.0 → 0.28.1

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 (329) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/docs/internals/hooks.md +1 -1
  3. package/dist/src/channel/adapter.js +1 -1
  4. package/dist/src/channel/compiled-channel.js +1 -1
  5. package/dist/src/channel/http.js +1 -1
  6. package/dist/src/channel/schedule.js +1 -1
  7. package/dist/src/channel/send.js +1 -1
  8. package/dist/src/channel/session-callback.js +1 -1
  9. package/dist/src/channel/session.js +1 -1
  10. package/dist/src/cli/commands/channels.js +1 -1
  11. package/dist/src/cli/dev/environment.js +1 -1
  12. package/dist/src/cli/dev/input-requests.js +1 -1
  13. package/dist/src/cli/dev/repl.js +1 -1
  14. package/dist/src/cli/dev/terminal.js +1 -1
  15. package/dist/src/cli/dev/url.js +1 -1
  16. package/dist/src/compiler/artifacts.js +1 -1
  17. package/dist/src/compiler/manifest.js +1 -1
  18. package/dist/src/compiler/model-catalog.js +1 -1
  19. package/dist/src/compiler/module-map.js +1 -1
  20. package/dist/src/compiler/normalize-subagent.js +1 -1
  21. package/dist/src/compiler/remote-agent-node.js +1 -1
  22. package/dist/src/compiler/workspace-resources.js +1 -1
  23. package/dist/src/context/accessors.js +1 -1
  24. package/dist/src/context/container.js +1 -1
  25. package/dist/src/context/hook-lifecycle.d.ts +3 -3
  26. package/dist/src/context/hook-lifecycle.js +1 -1
  27. package/dist/src/context/key.js +1 -1
  28. package/dist/src/context/keys.d.ts +31 -10
  29. package/dist/src/context/keys.js +1 -1
  30. package/dist/src/context/node.js +1 -1
  31. package/dist/src/context/providers/connection.js +1 -1
  32. package/dist/src/context/providers/sandbox.js +1 -1
  33. package/dist/src/context/providers/session.js +1 -1
  34. package/dist/src/context/run-step.js +1 -1
  35. package/dist/src/context/serialize.js +1 -1
  36. package/dist/src/discover/connections.js +1 -1
  37. package/dist/src/discover/diagnostics.js +1 -1
  38. package/dist/src/discover/discover-subagent.js +1 -1
  39. package/dist/src/discover/filesystem.js +1 -1
  40. package/dist/src/discover/grammar.js +1 -1
  41. package/dist/src/discover/lib.js +1 -1
  42. package/dist/src/discover/manifest.js +1 -1
  43. package/dist/src/discover/sandbox.js +1 -1
  44. package/dist/src/discover/schedules.js +1 -1
  45. package/dist/src/discover/skills.js +1 -1
  46. package/dist/src/evals/runner/discover.js +1 -1
  47. package/dist/src/evals/runner/execute-suite.js +1 -1
  48. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  49. package/dist/src/evals/scores/index.js +1 -1
  50. package/dist/src/execution/await-authorization-orchestrator.js +1 -1
  51. package/dist/src/execution/connection-auth-steps.js +1 -1
  52. package/dist/src/execution/runtime-context.d.ts +1 -1
  53. package/dist/src/execution/runtime-context.js +1 -1
  54. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  55. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  56. package/dist/src/execution/sandbox/glob-tool.js +1 -1
  57. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  58. package/dist/src/execution/sandbox/read-file-tool.js +1 -1
  59. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  60. package/dist/src/execution/sandbox/ripgrep-probe.js +1 -1
  61. package/dist/src/execution/sandbox/truncate-output.js +1 -1
  62. package/dist/src/execution/session-callback-step.js +1 -1
  63. package/dist/src/execution/session.js +1 -1
  64. package/dist/src/execution/subagent-adapter.js +1 -1
  65. package/dist/src/execution/tool-compaction.js +1 -1
  66. package/dist/src/execution/turn-workflow.js +1 -1
  67. package/dist/src/execution/web-fetch/html.js +1 -1
  68. package/dist/src/execution/web-fetch/tool.js +1 -1
  69. package/dist/src/execution/workflow-entry.js +1 -1
  70. package/dist/src/execution/workflow-runtime.js +1 -1
  71. package/dist/src/execution/workflow-steps.js +1 -1
  72. package/dist/src/harness/attachment-staging.js +1 -1
  73. package/dist/src/harness/compaction.js +2 -2
  74. package/dist/src/harness/emission.js +1 -1
  75. package/dist/src/harness/input-requests.js +1 -1
  76. package/dist/src/harness/instrumentation-config.js +1 -1
  77. package/dist/src/harness/model-call-error.js +1 -1
  78. package/dist/src/harness/otel-integration.js +1 -1
  79. package/dist/src/harness/prompt-cache.js +1 -1
  80. package/dist/src/harness/provider-tools.js +1 -1
  81. package/dist/src/harness/proxy-input-requests.js +1 -1
  82. package/dist/src/harness/runtime-actions.js +1 -1
  83. package/dist/src/harness/step-hooks.js +1 -1
  84. package/dist/src/harness/tool-loop.js +1 -1
  85. package/dist/src/harness/tool-result-pruning.js +1 -1
  86. package/dist/src/internal/application/cache-metadata.js +1 -1
  87. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  88. package/dist/src/internal/application/import-specifier.js +1 -1
  89. package/dist/src/internal/application/package.js +1 -1
  90. package/dist/src/internal/attachments/refs.js +1 -1
  91. package/dist/src/internal/attachments/sandbox-refs.js +1 -1
  92. package/dist/src/internal/attachments/url-refs.js +1 -1
  93. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  94. package/dist/src/internal/authored-definition/connection.js +1 -1
  95. package/dist/src/internal/authored-module-loader.js +1 -1
  96. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  97. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  98. package/dist/src/internal/helpers/markdown.js +2 -2
  99. package/dist/src/internal/json-schema.js +1 -1
  100. package/dist/src/internal/logging.js +1 -1
  101. package/dist/src/internal/nitro/host/channel-routes.js +1 -1
  102. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +1 -1
  103. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  104. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  105. package/dist/src/internal/nitro/host/schedule-task-routes.js +1 -1
  106. package/dist/src/internal/nitro/host/server-external-packages.js +1 -1
  107. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  108. package/dist/src/internal/nitro/routes/index.js +3 -3
  109. package/dist/src/internal/nitro/routes/workflow-route-helpers.js +1 -1
  110. package/dist/src/internal/node-esm-compat-banner.js +1 -1
  111. package/dist/src/internal/package-name.js +1 -1
  112. package/dist/src/internal/vercel-agent-summary.js +1 -1
  113. package/dist/src/internal/workflow-bundle/ash-service-route-output.js +1 -1
  114. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  115. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  116. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  117. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  118. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  119. package/dist/src/internal/workflow-bundle/workflow-transformer.js +1 -1
  120. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/ajv.js +1 -1
  121. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js +1 -1
  122. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js +2 -2
  123. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js +1 -1
  124. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js +1 -1
  125. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/index.js +1 -1
  126. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js +1 -1
  127. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/ref_error.js +1 -1
  128. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/resolve.js +1 -1
  129. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js +1 -1
  130. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js +1 -1
  131. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js +1 -1
  132. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js +2 -2
  133. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/defaults.js +1 -1
  134. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js +1 -1
  135. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/keyword.js +1 -1
  136. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/subschema.js +1 -1
  137. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js +1 -1
  138. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/equal.js +1 -1
  139. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/uri.js +1 -1
  140. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +1 -1
  141. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +1 -1
  142. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/allOf.js +1 -1
  143. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/contains.js +1 -1
  144. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +2 -2
  145. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/if.js +1 -1
  146. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/index.js +1 -1
  147. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items.js +1 -1
  148. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items2020.js +1 -1
  149. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/not.js +1 -1
  150. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +1 -1
  151. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +1 -1
  152. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +1 -1
  153. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/properties.js +1 -1
  154. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +1 -1
  155. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +1 -1
  156. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/code.js +1 -1
  157. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/index.js +1 -1
  158. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/ref.js +1 -1
  159. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/index.js +1 -1
  160. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/draft7.js +1 -1
  161. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/format.js +1 -1
  162. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/const.js +1 -1
  163. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/enum.js +1 -1
  164. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/index.js +1 -1
  165. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitItems.js +1 -1
  166. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitLength.js +1 -1
  167. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +1 -1
  168. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +1 -1
  169. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +1 -1
  170. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/pattern.js +1 -1
  171. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/required.js +1 -1
  172. package/dist/src/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +1 -1
  173. package/dist/src/node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/index.js +1 -1
  174. package/dist/src/node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/lib/schemes.js +1 -1
  175. package/dist/src/node_modules/.pnpm/fast-uri@3.1.2/node_modules/fast-uri/lib/utils.js +1 -1
  176. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/_vendor/partial-json-parser/parser.js +2 -2
  177. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/auth/workload-identity-auth.js +1 -1
  178. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/azure.js +1 -1
  179. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/client.js +2 -2
  180. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/detect-platform.js +1 -1
  181. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/errors.js +1 -1
  182. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/headers.js +1 -1
  183. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/qs/formats.js +1 -1
  184. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/qs/stringify.js +1 -1
  185. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/qs/utils.js +1 -1
  186. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/request-options.js +1 -1
  187. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/to-file.js +1 -1
  188. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/uploads.js +1 -1
  189. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/base64.js +1 -1
  190. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/bytes.js +1 -1
  191. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/env.js +1 -1
  192. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/log.js +1 -1
  193. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/path.js +1 -1
  194. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/sleep.js +1 -1
  195. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/uuid.js +1 -1
  196. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/internal/utils/values.js +1 -1
  197. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/lib/AbstractChatCompletionRunner.js +1 -1
  198. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/lib/Util.js +1 -1
  199. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/lib/chatCompletionUtils.js +1 -1
  200. package/dist/src/node_modules/.pnpm/openai@6.39.0_ws@8.21.0_zod@3.25.76/node_modules/openai/version.js +1 -1
  201. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Options.js +1 -1
  202. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/Refs.js +1 -1
  203. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +1 -1
  204. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parseDef.js +1 -1
  205. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +1 -1
  206. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +1 -1
  207. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +1 -1
  208. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +1 -1
  209. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +1 -1
  210. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +1 -1
  211. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +1 -1
  212. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +1 -1
  213. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/selectParser.js +1 -1
  214. package/dist/src/node_modules/.pnpm/zod-to-json-schema@3.25.2_zod@3.25.76/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +1 -1
  215. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/ZodError.js +1 -1
  216. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.js +1 -1
  217. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseUtil.js +1 -1
  218. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.js +1 -1
  219. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.js +1 -1
  220. package/dist/src/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +1 -1
  221. package/dist/src/packages/ash-scaffold/src/channels.js +2 -2
  222. package/dist/src/packages/ash-scaffold/src/module-files.js +1 -1
  223. package/dist/src/protocol/message.js +1 -1
  224. package/dist/src/protocol/routes.js +1 -1
  225. package/dist/src/public/channels/ash.js +2 -2
  226. package/dist/src/public/channels/auth.js +1 -1
  227. package/dist/src/public/channels/discord/api.js +1 -1
  228. package/dist/src/public/channels/discord/defaults.js +1 -1
  229. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  230. package/dist/src/public/channels/discord/hitl.js +1 -1
  231. package/dist/src/public/channels/discord/inbound.js +1 -1
  232. package/dist/src/public/channels/discord/verify.js +1 -1
  233. package/dist/src/public/channels/discord/verifyInbound.js +1 -1
  234. package/dist/src/public/channels/slack/api.js +1 -1
  235. package/dist/src/public/channels/slack/attachments.js +1 -1
  236. package/dist/src/public/channels/slack/constants.js +1 -1
  237. package/dist/src/public/channels/slack/defaults.js +2 -2
  238. package/dist/src/public/channels/slack/hitl.js +1 -1
  239. package/dist/src/public/channels/slack/interactions.js +1 -1
  240. package/dist/src/public/channels/slack/limits.js +1 -1
  241. package/dist/src/public/channels/slack/mrkdwn.js +1 -1
  242. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  243. package/dist/src/public/channels/slack/verify.js +1 -1
  244. package/dist/src/public/channels/teams/api.js +1 -1
  245. package/dist/src/public/channels/teams/attachments.js +1 -1
  246. package/dist/src/public/channels/teams/defaults.js +1 -1
  247. package/dist/src/public/channels/teams/hitl.js +1 -1
  248. package/dist/src/public/channels/teams/inbound.js +1 -1
  249. package/dist/src/public/channels/teams/limits.js +1 -1
  250. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  251. package/dist/src/public/channels/teams/verify.js +1 -1
  252. package/dist/src/public/channels/telegram/api.js +1 -1
  253. package/dist/src/public/channels/telegram/attachments.js +1 -1
  254. package/dist/src/public/channels/telegram/defaults.js +1 -1
  255. package/dist/src/public/channels/telegram/hitl.js +1 -1
  256. package/dist/src/public/channels/telegram/inbound.js +1 -1
  257. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  258. package/dist/src/public/channels/telegram/verify.js +1 -1
  259. package/dist/src/public/channels/twilio/defaults.js +1 -1
  260. package/dist/src/public/channels/twilio/inbound.js +1 -1
  261. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  262. package/dist/src/public/channels/twilio/verify.js +1 -1
  263. package/dist/src/public/channels/upload-policy.js +1 -1
  264. package/dist/src/public/definitions/channel.js +1 -1
  265. package/dist/src/public/definitions/tool.js +1 -1
  266. package/dist/src/public/next/index.js +1 -1
  267. package/dist/src/public/next/server.js +1 -1
  268. package/dist/src/public/next/vercel-json.js +1 -1
  269. package/dist/src/public/tool-result-narrowing.js +1 -1
  270. package/dist/src/public/tools/defaults.js +1 -1
  271. package/dist/src/react/use-ash-agent.js +1 -1
  272. package/dist/src/runtime/actions/types.js +1 -1
  273. package/dist/src/runtime/agent/bootstrap-model-utils.js +1 -1
  274. package/dist/src/runtime/agent/bootstrap-model.js +1 -1
  275. package/dist/src/runtime/agent/bootstrap.js +1 -1
  276. package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
  277. package/dist/src/runtime/channels/registry.js +1 -1
  278. package/dist/src/runtime/connections/authorization-tokens.js +1 -1
  279. package/dist/src/runtime/connections/callback-route.js +1 -1
  280. package/dist/src/runtime/connections/principal-context.js +1 -1
  281. package/dist/src/runtime/connections/principal.js +1 -1
  282. package/dist/src/runtime/framework-channels/index.js +1 -1
  283. package/dist/src/runtime/framework-tools/ask-question.js +1 -1
  284. package/dist/src/runtime/framework-tools/bash.js +1 -1
  285. package/dist/src/runtime/framework-tools/connection-search.js +1 -1
  286. package/dist/src/runtime/framework-tools/file-state.js +1 -1
  287. package/dist/src/runtime/framework-tools/glob.js +1 -1
  288. package/dist/src/runtime/framework-tools/grep.js +1 -1
  289. package/dist/src/runtime/framework-tools/index.js +1 -1
  290. package/dist/src/runtime/framework-tools/pending-connection-tool-calls.js +1 -1
  291. package/dist/src/runtime/framework-tools/read-file.js +1 -1
  292. package/dist/src/runtime/framework-tools/skill.js +1 -1
  293. package/dist/src/runtime/framework-tools/todo.js +2 -2
  294. package/dist/src/runtime/framework-tools/web-fetch.js +1 -1
  295. package/dist/src/runtime/framework-tools/web-search.js +1 -1
  296. package/dist/src/runtime/framework-tools/write-file.js +1 -1
  297. package/dist/src/runtime/governance/auth/jwt-ecdsa.js +1 -1
  298. package/dist/src/runtime/governance/auth/oidc.js +1 -1
  299. package/dist/src/runtime/governance/auth/token-claims.js +1 -1
  300. package/dist/src/runtime/graph.js +1 -1
  301. package/dist/src/runtime/input/types.js +1 -1
  302. package/dist/src/runtime/loaders/compile-metadata.js +1 -1
  303. package/dist/src/runtime/loaders/manifest.js +1 -1
  304. package/dist/src/runtime/loaders/module-map.js +1 -1
  305. package/dist/src/runtime/prompt/compose.js +2 -2
  306. package/dist/src/runtime/prompt/connections.js +1 -1
  307. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  308. package/dist/src/runtime/resolve-hook.js +1 -1
  309. package/dist/src/runtime/sandbox/keys.js +1 -1
  310. package/dist/src/runtime/sandbox/registry.js +1 -1
  311. package/dist/src/runtime/schedules/register.js +1 -1
  312. package/dist/src/runtime/session-callback-route.js +1 -1
  313. package/dist/src/runtime/sessions/auth.js +1 -1
  314. package/dist/src/runtime/sessions/compiled-agent-cache.js +1 -1
  315. package/dist/src/runtime/sessions/runtime-context-keys.d.ts +11 -0
  316. package/dist/src/runtime/sessions/runtime-context-keys.js +1 -0
  317. package/dist/src/runtime/sessions/runtime-session.js +1 -1
  318. package/dist/src/runtime/skills/fragment-context.js +1 -1
  319. package/dist/src/runtime/skills/sandbox-access.js +1 -1
  320. package/dist/src/runtime/subagents/registry.js +1 -1
  321. package/dist/src/runtime/workspace/types.js +1 -1
  322. package/dist/src/services/dev-client/request-headers.js +1 -1
  323. package/dist/src/services/dev-client/vercel-auth-error.js +1 -1
  324. package/dist/src/shared/json-schemas.js +1 -1
  325. package/dist/src/shared/json.js +1 -1
  326. package/dist/src/shared/skill-package.js +1 -1
  327. package/package.json +1 -1
  328. package/dist/src/context/seed-keys.d.ts +0 -39
  329. package/dist/src/context/seed-keys.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # experimental-ash
2
2
 
3
+ ## 0.28.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 9be5b5c: Fix `TypeError: Cannot read properties of undefined (reading 'name')` thrown from `resolveRuntimeAgentNode` on Vercel deployments by splitting `#context/keys.ts` along its layering seam and dropping the rolldown setting that hid the bug.
8
+
9
+ A static-import cycle through `BundleKey.codec` (`#context/keys` → `#runtime/sessions/compiled-agent-cache` → `#runtime/resolve-agent-graph` → `#runtime/framework-tools/index` → `#runtime/framework-tools/bash` → `#execution/sandbox/bash-tool` → `#execution/sandbox/require-sandbox` → `#context/keys`) interacted badly with the rolldown build's `topLevelVar: true` setting. When Nitro re-bundled ash's dist into a single concatenated `_libs/experimental-ash.mjs` for a Vercel function, it could land `var BASH_TOOL_DEFINITION = {...}` _after_ the `ALL_FRAMEWORK_TOOLS` array that referenced it. `var` hoisting then silently filled the slot with `undefined` (no TDZ `ReferenceError`), and every downstream `.map(t => t.name)` over that array crashed inside `resolveRuntimeAgentNode`.
10
+
11
+ The structural fix: `#context/keys.ts` was doing two unrelated jobs in one file. The leaf job (declaring `SandboxKey`, `SessionKey`, etc.) is widely imported across the codebase. The heavy job (owning the `ChannelKey` and `BundleKey` codecs that materialize values by calling back into the runtime) drags in the entire runtime layer. Because JS evaluates modules whole, every leaf caller was paying the heavy job's transitive import cost, which is how the cycle got seeded.
12
+
13
+ - Split `#context/keys.ts` into two files. `#context/keys.ts` now only declares leaf context keys (no codec, no runtime imports — safe to import from any tier). `#runtime/sessions/runtime-context-keys.ts` owns `ChannelKey`, `BundleKey`, and `CompiledBundle` next to the modules whose state they carry.
14
+ - Drop `topLevelVar: true` from `packages/ash/scripts/build-rolldown.mjs`. The setting was masking module-evaluation cycles; with `let`/`const` they now surface as a loud `ReferenceError` at module load instead of silent `undefined` reads.
15
+
3
16
  ## 0.28.0
4
17
 
5
18
  ### Minor Changes
@@ -129,7 +129,7 @@ catches them and emits the recoverable `turn.failed` cascade.
129
129
 
130
130
  ## `SessionPreparedKey`
131
131
 
132
- Lives in `src/context/seed-keys.ts`. JSON-safe boolean, no codec. Set
132
+ Lives in `src/context/keys.ts`. JSON-safe boolean, no codec. Set
133
133
  **before** the `lifecycle.session` chain runs so a thrown hook leaves
134
134
  the flag set — the next turn does not retry. Compaction does not clear
135
135
  the flag.
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";var log=createLogger(`channel.adapter`);function defaultDeliverResult(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message,modelContext:e.modelContext};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses,modelContext:e.modelContext};if(e.modelContext!==void 0&&e.modelContext.length>0)return{modelContext:e.modelContext}}function getAdapterKind(e){return e.kind}async function callAdapterEventHandler(e,t,n){let r=e[t.type];if(r===void 0)return t;try{await r(`data`in t?t.data:void 0,n)}catch(n){log.error(`adapter event handler threw — event swallowed`,{adapterKind:getAdapterKind(e),eventType:t.type,error:n})}return t}export{callAdapterEventHandler,defaultDeliverResult,getAdapterKind};
1
+ import{createLogger}from"#internal/logging.js";const log=createLogger(`channel.adapter`);function defaultDeliverResult(e){if(e.message!==void 0)return{inputResponses:e.inputResponses,message:e.message,modelContext:e.modelContext};if(e.inputResponses!==void 0&&e.inputResponses.length>0)return{inputResponses:e.inputResponses,modelContext:e.modelContext};if(e.modelContext!==void 0&&e.modelContext.length>0)return{modelContext:e.modelContext}}function getAdapterKind(e){return e.kind}async function callAdapterEventHandler(e,t,n){let r=e[t.type];if(r===void 0)return t;try{await r(`data`in t?t.data:void 0,n)}catch(n){log.error(`adapter event handler threw — event swallowed`,{adapterKind:getAdapterKind(e),eventType:t.type,error:n})}return t}export{callAdapterEventHandler,defaultDeliverResult,getAdapterKind};
@@ -1 +1 @@
1
- var CHANNEL_SENTINEL=`ash:channel`;function isCompiledChannel(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}export{CHANNEL_SENTINEL,isCompiledChannel};
1
+ const CHANNEL_SENTINEL=`ash:channel`;function isCompiledChannel(e){return typeof e==`object`&&!!e&&e.__kind===`ash:channel`}export{CHANNEL_SENTINEL,isCompiledChannel};
@@ -1 +1 @@
1
- var HTTP_ADAPTER_KIND=`http`,HTTP_ADAPTER={kind:HTTP_ADAPTER_KIND};export{HTTP_ADAPTER,HTTP_ADAPTER_KIND};
1
+ const HTTP_ADAPTER_KIND=`http`,HTTP_ADAPTER={kind:HTTP_ADAPTER_KIND};export{HTTP_ADAPTER,HTTP_ADAPTER_KIND};
@@ -1 +1 @@
1
- import{createSession}from"#channel/session.js";import{createCrossChannelReceiveFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{expectFunction}from"#internal/authored-module.js";var SCHEDULE_APP_AUTH={attributes:{},authenticator:`app`,principalId:`ash:app`,principalType:`runtime`},SCHEDULE_ADAPTER_KIND=`schedule`,SCHEDULE_ADAPTER={kind:SCHEDULE_ADAPTER_KIND},ScheduleDispatcher=class{runtime;channels;constructor(e){this.runtime=e.runtime,this.channels=e.channels}async trigger(e){let r=[],a=[],o=createCrossChannelReceiveFn(this.runtime,toCrossChannelTargets(this.channels)),s={appAuth:SCHEDULE_APP_AUTH,receive:async(e,t)=>{let n=await o(e,t);return r.push(n),n},waitUntil(e){a.push(e)}};if(e.run)await e.run(s);else if(e.markdown!==void 0){let t=await this.runMarkdown(e.markdown);r.push(t)}else throw Error(`Schedule "${e.scheduleId}" has neither "run" nor "markdown" — at least one must be set.`);return{sessions:r,waitUntilTasks:a}}async runMarkdown(t){let n=await this.runtime.run({adapter:SCHEDULE_ADAPTER,auth:SCHEDULE_APP_AUTH,input:{message:t},mode:`task`});return createSession(n.sessionId,n.continuationToken,this.runtime)}};function expectScheduleRun(e,t,n){let i=e;if(typeof i!=`object`||!i)throw Error(`Schedule export "${n??`default`}" from "${t}" must be an object.`);return expectFunction(i.run,`Expected the schedule export "${n??`default`}" from "${t}" to export a \`run\` handler function.`)}export{SCHEDULE_ADAPTER,SCHEDULE_ADAPTER_KIND,SCHEDULE_APP_AUTH,ScheduleDispatcher,expectScheduleRun};
1
+ import{createSession}from"#channel/session.js";import{createCrossChannelReceiveFn,toCrossChannelTargets}from"#channel/cross-channel-receive.js";import{expectFunction}from"#internal/authored-module.js";const SCHEDULE_APP_AUTH={attributes:{},authenticator:`app`,principalId:`ash:app`,principalType:`runtime`},SCHEDULE_ADAPTER_KIND=`schedule`,SCHEDULE_ADAPTER={kind:SCHEDULE_ADAPTER_KIND};var ScheduleDispatcher=class{runtime;channels;constructor(e){this.runtime=e.runtime,this.channels=e.channels}async trigger(e){let r=[],a=[],o=createCrossChannelReceiveFn(this.runtime,toCrossChannelTargets(this.channels)),s={appAuth:SCHEDULE_APP_AUTH,receive:async(e,t)=>{let n=await o(e,t);return r.push(n),n},waitUntil(e){a.push(e)}};if(e.run)await e.run(s);else if(e.markdown!==void 0){let t=await this.runMarkdown(e.markdown);r.push(t)}else throw Error(`Schedule "${e.scheduleId}" has neither "run" nor "markdown" — at least one must be set.`);return{sessions:r,waitUntilTasks:a}}async runMarkdown(t){let n=await this.runtime.run({adapter:SCHEDULE_ADAPTER,auth:SCHEDULE_APP_AUTH,input:{message:t},mode:`task`});return createSession(n.sessionId,n.continuationToken,this.runtime)}};function expectScheduleRun(e,t,n){let i=e;if(typeof i!=`object`||!i)throw Error(`Schedule export "${n??`default`}" from "${t}" must be an object.`);return expectFunction(i.run,`Expected the schedule export "${n??`default`}" from "${t}" to export a \`run\` handler function.`)}export{SCHEDULE_ADAPTER,SCHEDULE_ADAPTER_KIND,SCHEDULE_APP_AUTH,ScheduleDispatcher,expectScheduleRun};
@@ -1 +1 @@
1
- import{createSession}from"#channel/session.js";import{createErrorId,createLogger}from"#internal/logging.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{serializeUrlFilePart}from"#internal/attachments/url-refs.js";import{toErrorMessage}from"#shared/errors.js";var log=createLogger(`channel.send`);function createSendFn(n,r,i){return async(a,o)=>{let s=o.auth,c=o.callback,l=o.mode??`conversation`,u=o.state,d=o.continuationToken,f=`${i}:${d}`,{message:p,inputResponses:m,modelContext:h}=normalizeSendInput(a),g=serializeUrlFilePartsInMessage(p);try{let{sessionId:t}=await n.deliver({auth:s,continuationToken:f,payload:{inputResponses:m,message:g,modelContext:h}});return createSession(t,d,n)}catch(e){isRuntimeNoActiveSessionError(e)||log.warn(`deliver failed, falling back to starting a new session`,{continuationToken:f,errorId:createErrorId(),message:toErrorMessage(e)})}if(m&&m.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let _=u?{...r,state:{...r.state,...u}}:r;return createSession((await n.run({adapter:_,auth:s,capabilities:l===`conversation`?{requestInput:!0}:void 0,callback:c,continuationToken:f,input:{message:g??``,modelContext:h},mode:l})).sessionId,d,n)}}function serializeUrlFilePartsInMessage(e){if(e===void 0||typeof e==`string`)return e;let t=!1,n=e.map(e=>e.type===`file`&&e.data instanceof URL&&e.data.protocol!==`data:`?(t=!0,{...e,data:serializeUrlFilePart(e.data)}):e);return t?n:e}function normalizeSendInput(e){return typeof e==`string`||Array.isArray(e)?{message:e}:e}export{createSendFn};
1
+ import{createSession}from"#channel/session.js";import{createErrorId,createLogger}from"#internal/logging.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{serializeUrlFilePart}from"#internal/attachments/url-refs.js";import{toErrorMessage}from"#shared/errors.js";const log=createLogger(`channel.send`);function createSendFn(n,r,i){return async(a,o)=>{let s=o.auth,c=o.callback,l=o.mode??`conversation`,u=o.state,d=o.continuationToken,f=`${i}:${d}`,{message:p,inputResponses:m,modelContext:h}=normalizeSendInput(a),g=serializeUrlFilePartsInMessage(p);try{let{sessionId:t}=await n.deliver({auth:s,continuationToken:f,payload:{inputResponses:m,message:g,modelContext:h}});return createSession(t,d,n)}catch(e){isRuntimeNoActiveSessionError(e)||log.warn(`deliver failed, falling back to starting a new session`,{continuationToken:f,errorId:createErrorId(),message:toErrorMessage(e)})}if(m&&m.length>0)throw Error(`Cannot deliver inputResponses — the target session was not found via continuation token.`);let _=u?{...r,state:{...r.state,...u}}:r;return createSession((await n.run({adapter:_,auth:s,capabilities:l===`conversation`?{requestInput:!0}:void 0,callback:c,continuationToken:f,input:{message:g??``,modelContext:h},mode:l})).sessionId,d,n)}}function serializeUrlFilePartsInMessage(e){if(e===void 0||typeof e==`string`)return e;let t=!1,n=e.map(e=>e.type===`file`&&e.data instanceof URL&&e.data.protocol!==`data:`?(t=!0,{...e,data:serializeUrlFilePart(e.data)}):e);return t?n:e}function normalizeSendInput(e){return typeof e==`string`||Array.isArray(e)?{message:e}:e}export{createSendFn};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{createAshCallbackRoutePath}from"#protocol/routes.js";var sessionCallbackSchema=z.object({callId:z.string().min(1),subagentName:z.string().min(1),token:z.string().min(1),url:z.string().min(1)}).strict().superRefine((e,t)=>{let n;try{n=new URL(e.url)}catch{t.addIssue({code:`custom`,message:`Callback url must be absolute.`,path:[`url`]});return}readCallbackUrlToken(n)!==e.token&&t.addIssue({code:`custom`,message:`Callback url token must match callback token.`,path:[`url`]})});function parseSessionCallback(e){let t=sessionCallbackSchema.safeParse(e);return t.success?{callback:t.data,ok:!0}:{cause:t.error,message:formatSessionCallbackParseError(t.error),ok:!1}}function readCallbackUrlToken(e){let n=createAshCallbackRoutePath(``);if(!e.pathname.startsWith(n))return null;let r=e.pathname.slice(n.length);if(r.length===0||r.includes(`/`))return null;try{return decodeURIComponent(r)}catch{return null}}function formatSessionCallbackParseError(e){return`Invalid callback metadata: ${e.issues.map(e=>`${e.path.length===0?`callback`:`callback.${e.path.join(`.`)}`}: ${e.message}`).join(`; `)}`}export{parseSessionCallback};
1
+ import{z}from"#compiled/zod/index.js";import{createAshCallbackRoutePath}from"#protocol/routes.js";const sessionCallbackSchema=z.object({callId:z.string().min(1),subagentName:z.string().min(1),token:z.string().min(1),url:z.string().min(1)}).strict().superRefine((e,t)=>{let n;try{n=new URL(e.url)}catch{t.addIssue({code:`custom`,message:`Callback url must be absolute.`,path:[`url`]});return}readCallbackUrlToken(n)!==e.token&&t.addIssue({code:`custom`,message:`Callback url token must match callback token.`,path:[`url`]})});function parseSessionCallback(e){let t=sessionCallbackSchema.safeParse(e);return t.success?{callback:t.data,ok:!0}:{cause:t.error,message:formatSessionCallbackParseError(t.error),ok:!1}}function readCallbackUrlToken(e){let n=createAshCallbackRoutePath(``);if(!e.pathname.startsWith(n))return null;let r=e.pathname.slice(n.length);if(r.length===0||r.includes(`/`))return null;try{return decodeURIComponent(r)}catch{return null}}function formatSessionCallbackParseError(e){return`Invalid callback metadata: ${e.issues.map(e=>`${e.path.length===0?`callback`:`callback.${e.path.join(`.`)}`}: ${e.message}`).join(`; `)}`}export{parseSessionCallback};
@@ -1 +1 @@
1
- import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/seed-keys.js";function createSession(e,t,n){return{id:e,continuationToken:t,async getEventStream(t){return n.getEventStream(e,t)}}}function createGetSessionFn(e){return t=>createSession(t,``,e)}function buildSessionHandle(i){return{get id(){return i.get(SessionIdKey)??``},get continuationToken(){return i.get(ContinuationTokenKey)??``},get auth(){return i.get(AuthKey)??null},get initiatorAuth(){return i.get(InitiatorAuthKey)??null},setContinuationToken(e){let n=i.get(ContinuationTokenKey)??``,r=namespaceContinuationToken(n,e);n!==r&&i.set(ContinuationTokenKey,r)}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}export{buildSessionHandle,createGetSessionFn,createSession};
1
+ import{AuthKey,ContinuationTokenKey,InitiatorAuthKey,SessionIdKey}from"#context/keys.js";function createSession(e,t,n){return{id:e,continuationToken:t,async getEventStream(t){return n.getEventStream(e,t)}}}function createGetSessionFn(e){return t=>createSession(t,``,e)}function buildSessionHandle(i){return{get id(){return i.get(SessionIdKey)??``},get continuationToken(){return i.get(ContinuationTokenKey)??``},get auth(){return i.get(AuthKey)??null},get initiatorAuth(){return i.get(InitiatorAuthKey)??null},setContinuationToken(e){let n=i.get(ContinuationTokenKey)??``,r=namespaceContinuationToken(n,e);n!==r&&i.set(ContinuationTokenKey,r)}}}function namespaceContinuationToken(e,t){let n=e.indexOf(`:`);if(n<=0)throw Error(`Cannot set session continuation token without an existing namespaced continuation token. Start the session with a placeholder continuationToken.`);return`${e.slice(0,n+1)}${t}`}export{buildSessionHandle,createGetSessionFn,createSession};
@@ -1,3 +1,3 @@
1
- import{isAshProject}from"../../packages/ash-scaffold/src/project.js";import{SLACK_CHANNEL_DEFAULT_ROUTE,ensureChannel,listAuthoredChannels}from"../../packages/ash-scaffold/src/channels.js";import"../../packages/ash-scaffold/src/index.js";import{relative}from"node:path";import{createInterface}from"node:readline/promises";var NOT_AN_AGENT_MESSAGE="No Ash agent in this directory. Run `pnpm create experimental-ash-agent`, then run this command from inside the new project.",KNOWN_CHANNEL_KINDS=[`slack`];function isChannelKind(e){return KNOWN_CHANNEL_KINDS.includes(e)}function parseChannelKind(e){if(!isChannelKind(e))throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`);return e}async function promptChannelKind(){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error("Pass a channel kind: `ash channels add slack`.");let e=createInterface({input:process.stdin,output:process.stdout});try{let t=(await e.question(`Channel to add (slack): `)).trim();return t.length===0?`slack`:parseChannelKind(t)}finally{e.close()}}function renderSlackNextSteps(e){return[`Next steps:`,` pnpm i`,` vercel deploy --prod`,` # If Connect returns a different UID, use it below and in agent/channels/slack.ts.`,` vercel connect create slack --name ${e} --triggers`,` vercel connect detach slack/${e} --yes`,` vercel connect attach slack/${e} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes`].join(`
1
+ import{isAshProject}from"../../packages/ash-scaffold/src/project.js";import{SLACK_CHANNEL_DEFAULT_ROUTE,ensureChannel,listAuthoredChannels}from"../../packages/ash-scaffold/src/channels.js";import"../../packages/ash-scaffold/src/index.js";import{relative}from"node:path";import{createInterface}from"node:readline/promises";const NOT_AN_AGENT_MESSAGE="No Ash agent in this directory. Run `pnpm create experimental-ash-agent`, then run this command from inside the new project.",KNOWN_CHANNEL_KINDS=[`slack`];function isChannelKind(e){return KNOWN_CHANNEL_KINDS.includes(e)}function parseChannelKind(e){if(!isChannelKind(e))throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`);return e}async function promptChannelKind(){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error("Pass a channel kind: `ash channels add slack`.");let e=createInterface({input:process.stdin,output:process.stdout});try{let t=(await e.question(`Channel to add (slack): `)).trim();return t.length===0?`slack`:parseChannelKind(t)}finally{e.close()}}function renderSlackNextSteps(e){return[`Next steps:`,` pnpm i`,` vercel deploy --prod`,` # If Connect returns a different UID, use it below and in agent/channels/slack.ts.`,` vercel connect create slack --name ${e} --triggers`,` vercel connect detach slack/${e} --yes`,` vercel connect attach slack/${e} --triggers --trigger-path ${SLACK_CHANNEL_DEFAULT_ROUTE} --yes`].join(`
2
2
  `)}function renderExistingSlackChannelNextSteps(e){return[`Next steps:`,` Review ${e} for the configured Slack connector UID.`,` Run Vercel Connect commands only for the UID already used by that file.`].join(`
3
3
  `)}function formatProjectPath(e,t){let n=relative(e,t);return n.length===0||n.startsWith(`..`)?t:n}function logPackageJsonMutations(e,t,n){for(let r of n.packageJsonUpdated)e.log(`Updated ${formatProjectPath(t,r.path)} with ${r.dependencies.join(`, `)}.`)}function assertUnhandledChannelMutation(e){throw Error(`Unhandled channel mutation result: ${JSON.stringify(e)}`)}async function runChannelsAddCommand(t,r,i){if(!await isAshProject(r)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{let e=i.kind===void 0?await promptChannelKind():parseChannelKind(i.kind),a=await ensureChannel({projectRoot:r,kind:e,force:i.options.force});switch(logPackageJsonMutations(t,r,a),a.action){case`created`:t.log(`Scaffolded channel: ${e}`),t.log(renderSlackNextSteps(a.slackConnectorSlug));break;case`overwritten`:t.log(`Overwrote channel: ${e}`),t.log(renderSlackNextSteps(a.slackConnectorSlug));break;case`skipped`:{let n=a.filesSkipped[0];t.log(`Channel "${e}" already exists; left existing files unchanged.`),t.log(renderExistingSlackChannelNextSteps(formatProjectPath(r,n)));break}default:assertUnhandledChannelMutation(a)}}catch(e){t.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}async function runChannelsListCommand(t,n,i){if(!await isAshProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let a=await listAuthoredChannels(n);if(i.json){t.log(JSON.stringify({channels:a},null,2));return}if(a.length===0){t.log("No channels defined. Run `ash channels add slack` to add one.");return}for(let e of a)t.log(e)}export{runChannelsAddCommand,runChannelsListCommand};
@@ -1 +1 @@
1
- import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{isObject}from"#shared/guards.js";var DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}var developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(n){let r=resolve(n);return DEVELOPMENT_ENV_FILE_NAMES.map(t=>join(r,t))}function loadDevelopmentEnvironmentFiles(e){getDevelopmentEnvironmentLoader(e).reload()}function getDevelopmentEnvironmentLoader(e){let n=resolve(e),r=developmentEnvironmentLoaders.get(n);if(r!==void 0)return r;let i=createDevelopmentEnvironmentLoader(n);return developmentEnvironmentLoaders.set(n,i),i}function createDevelopmentEnvironmentLoader(e){let t=new Set(Object.keys(process.env)),n=new Map;return{reload(){let r=readDevelopmentEnvironmentValues(e);for(let[e,i]of n)r.has(e)||t.has(e)||(process.env[e]===i&&delete process.env[e],n.delete(e));for(let[e,i]of r)t.has(e)||(process.env[e]=i,n.set(e,i))}}}function readDevelopmentEnvironmentValues(t){let i=new Map;for(let o of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let a=parseEnv(readFileSync(join(t,o),`utf8`));for(let[e,t]of Object.entries(a))t!==void 0&&i.set(e,t)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return i}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles};
1
+ import{join,resolve}from"node:path";import{readFileSync}from"node:fs";import{parseEnv}from"node:util";import{isObject}from"#shared/guards.js";const DEVELOPMENT_ENV_FILE_NAMES=[`.env.development.local`,`.env.local`,`.env.development`,`.env`];function isMissingEnvironmentFileError(e){return isObject(e)&&e.code===`ENOENT`}const developmentEnvironmentLoaders=new Map;function getDevelopmentEnvironmentFilePaths(n){let r=resolve(n);return DEVELOPMENT_ENV_FILE_NAMES.map(t=>join(r,t))}function loadDevelopmentEnvironmentFiles(e){getDevelopmentEnvironmentLoader(e).reload()}function getDevelopmentEnvironmentLoader(e){let n=resolve(e),r=developmentEnvironmentLoaders.get(n);if(r!==void 0)return r;let i=createDevelopmentEnvironmentLoader(n);return developmentEnvironmentLoaders.set(n,i),i}function createDevelopmentEnvironmentLoader(e){let t=new Set(Object.keys(process.env)),n=new Map;return{reload(){let r=readDevelopmentEnvironmentValues(e);for(let[e,i]of n)r.has(e)||t.has(e)||(process.env[e]===i&&delete process.env[e],n.delete(e));for(let[e,i]of r)t.has(e)||(process.env[e]=i,n.set(e,i))}}}function readDevelopmentEnvironmentValues(t){let i=new Map;for(let o of[...DEVELOPMENT_ENV_FILE_NAMES].reverse())try{let a=parseEnv(readFileSync(join(t,o),`utf8`));for(let[e,t]of Object.entries(a))t!==void 0&&i.set(e,t)}catch(e){if(!isMissingEnvironmentFileError(e))throw e}return i}export{DEVELOPMENT_ENV_FILE_NAMES,getDevelopmentEnvironmentFilePaths,loadDevelopmentEnvironmentFiles};
@@ -1 +1 @@
1
- import{renderCliTaggedLine}from"#cli/ui/output.js";import{resolveTextToResponse}from"#channel/resolve-text.js";var ESCAPED_RUNTIME_INPUT_PROMPT=Symbol(`ash.cli.runtime-input.escaped`);function extractPendingRuntimeInputRequests(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n?.type===`input.requested`)return n.data.requests}return[]}async function promptForRuntimeInputRequests(t){let n=[];t.print(renderCliTaggedLine(t.theme,{message:`pending input request${t.requests.length===1?``:`s`}: reply now, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`info`}));for(let e of t.requests){let r=await promptForRuntimeInputRequest({ask:t.ask,print:t.print,request:e,theme:t.theme});if(r.kind!==`submitted`)return r;n.push(r.inputResponse)}return{inputResponses:n,kind:`submitted`}}function isApprovalRequest(e){return e.display===`confirmation`}async function promptForRuntimeInputRequest(e){return isApprovalRequest(e.request)?await promptForApprovalInputRequest({ask:e.ask,print:e.print,request:e.request,theme:e.theme}):await promptForQuestionInputRequest({ask:e.ask,print:e.print,request:e.request,theme:e.theme})}async function promptForApprovalInputRequest(t){for(t.print(renderCliTaggedLine(t.theme,{message:`approve tool "${t.request.action.toolName}"? (yes/no)`,tag:`approval`,tone:`warning`})),t.print(renderCliTaggedLine(t.theme,{message:JSON.stringify(t.request.action.input,null,2),tag:`tool`,tone:`muted`}));;){let r=await t.ask(`approval> `);if(r===void 0)return{kind:`aborted`};if(r===ESCAPED_RUNTIME_INPUT_PROMPT)return{kind:`deferred`};let i=r.trim().toLowerCase();if(i===`skip`||i===`/skip`)return{kind:`deferred`};if(i===`a`||i===`approve`||i===`y`||i===`yes`)return{inputResponse:{optionId:`approve`,requestId:t.request.requestId},kind:`submitted`};if(i===`d`||i===`deny`||i===`n`||i===`no`)return{inputResponse:{optionId:`deny`,requestId:t.request.requestId},kind:`submitted`};t.print(renderCliTaggedLine(t.theme,{message:`enter "yes" to approve, "no" to deny, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`warning`}))}}async function promptForQuestionInputRequest(r){r.print(renderCliTaggedLine(r.theme,{message:r.request.prompt,tag:`question`,tone:`info`}));for(let[t,n]of(r.request.options??[]).entries())r.print(renderCliTaggedLine(r.theme,{message:`${t+1}. ${n.label}${n.description===void 0?``:` - ${n.description}`}`,tag:`option`,tone:`muted`}));let i=r.request.allowFreeform===!0||(r.request.options?.length??0)===0;for(;;){let a=await r.ask(`answer> `);if(a===void 0)return{kind:`aborted`};if(a===ESCAPED_RUNTIME_INPUT_PROMPT)return{kind:`deferred`};let o=a.trim();if(o===`skip`||o===`/skip`)return{kind:`deferred`};let s=resolveTextToResponse(o,r.request);if(s!==void 0)return{inputResponse:s,kind:`submitted`};r.print(renderCliTaggedLine(r.theme,{message:r.request.options===void 0||r.request.options.length===0?`enter a response, press Escape, or type "skip" to return to the normal prompt`:i?`enter an option number/id, freeform text, press Escape, or type "skip" to return to the normal prompt`:`enter an option number/id, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`warning`}))}}export{ESCAPED_RUNTIME_INPUT_PROMPT,extractPendingRuntimeInputRequests,promptForRuntimeInputRequests};
1
+ import{renderCliTaggedLine}from"#cli/ui/output.js";import{resolveTextToResponse}from"#channel/resolve-text.js";const ESCAPED_RUNTIME_INPUT_PROMPT=Symbol(`ash.cli.runtime-input.escaped`);function extractPendingRuntimeInputRequests(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n?.type===`input.requested`)return n.data.requests}return[]}async function promptForRuntimeInputRequests(t){let n=[];t.print(renderCliTaggedLine(t.theme,{message:`pending input request${t.requests.length===1?``:`s`}: reply now, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`info`}));for(let e of t.requests){let r=await promptForRuntimeInputRequest({ask:t.ask,print:t.print,request:e,theme:t.theme});if(r.kind!==`submitted`)return r;n.push(r.inputResponse)}return{inputResponses:n,kind:`submitted`}}function isApprovalRequest(e){return e.display===`confirmation`}async function promptForRuntimeInputRequest(e){return isApprovalRequest(e.request)?await promptForApprovalInputRequest({ask:e.ask,print:e.print,request:e.request,theme:e.theme}):await promptForQuestionInputRequest({ask:e.ask,print:e.print,request:e.request,theme:e.theme})}async function promptForApprovalInputRequest(t){for(t.print(renderCliTaggedLine(t.theme,{message:`approve tool "${t.request.action.toolName}"? (yes/no)`,tag:`approval`,tone:`warning`})),t.print(renderCliTaggedLine(t.theme,{message:JSON.stringify(t.request.action.input,null,2),tag:`tool`,tone:`muted`}));;){let r=await t.ask(`approval> `);if(r===void 0)return{kind:`aborted`};if(r===ESCAPED_RUNTIME_INPUT_PROMPT)return{kind:`deferred`};let i=r.trim().toLowerCase();if(i===`skip`||i===`/skip`)return{kind:`deferred`};if(i===`a`||i===`approve`||i===`y`||i===`yes`)return{inputResponse:{optionId:`approve`,requestId:t.request.requestId},kind:`submitted`};if(i===`d`||i===`deny`||i===`n`||i===`no`)return{inputResponse:{optionId:`deny`,requestId:t.request.requestId},kind:`submitted`};t.print(renderCliTaggedLine(t.theme,{message:`enter "yes" to approve, "no" to deny, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`warning`}))}}async function promptForQuestionInputRequest(r){r.print(renderCliTaggedLine(r.theme,{message:r.request.prompt,tag:`question`,tone:`info`}));for(let[t,n]of(r.request.options??[]).entries())r.print(renderCliTaggedLine(r.theme,{message:`${t+1}. ${n.label}${n.description===void 0?``:` - ${n.description}`}`,tag:`option`,tone:`muted`}));let i=r.request.allowFreeform===!0||(r.request.options?.length??0)===0;for(;;){let a=await r.ask(`answer> `);if(a===void 0)return{kind:`aborted`};if(a===ESCAPED_RUNTIME_INPUT_PROMPT)return{kind:`deferred`};let o=a.trim();if(o===`skip`||o===`/skip`)return{kind:`deferred`};let s=resolveTextToResponse(o,r.request);if(s!==void 0)return{inputResponse:s,kind:`submitted`};r.print(renderCliTaggedLine(r.theme,{message:r.request.options===void 0||r.request.options.length===0?`enter a response, press Escape, or type "skip" to return to the normal prompt`:i?`enter an option number/id, freeform text, press Escape, or type "skip" to return to the normal prompt`:`enter an option number/id, press Escape, or type "skip" to return to the normal prompt`,tag:`input`,tone:`warning`}))}}export{ESCAPED_RUNTIME_INPUT_PROMPT,extractPendingRuntimeInputRequests,promptForRuntimeInputRequests};
@@ -1,2 +1,2 @@
1
1
  import{toErrorMessage}from"#shared/errors.js";import{ASH_CONTINUE_SESSION_ROUTE_PATTERN,ASH_CREATE_SESSION_ROUTE_PATH,ASH_MESSAGE_STREAM_ROUTE_PATTERN,createAshMessageStreamRoutePath}from"#protocol/routes.js";import{createCliTheme,renderCliBanner,renderCliSection,renderCliSpeakerLine,renderCliTaggedLine}from"#cli/ui/output.js";import{createInterface,emitKeypressEvents}from"node:readline";import{openStreamIterable}from"#client/open-stream.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRequestHeadersAsync}from"#services/dev-client/request-headers.js";import{extractCurrentTurnBoundaryEvent}from"#services/dev-client/stream.js";import{resolveDevelopmentServerResourceUrl}from"#services/dev-client/url.js";import{formatVercelAuthChallengeMessage,isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{createDevClient}from"#services/dev-client.js";import{parseDevReplInput}from"#cli/dev/input.js";import{ESCAPED_RUNTIME_INPUT_PROMPT,extractPendingRuntimeInputRequests,promptForRuntimeInputRequests}from"#cli/dev/input-requests.js";import{createDevelopmentTerminal}from"#cli/dev/terminal.js";function renderConnectionRows(e){let i=[{label:`Server`,tone:`info`,value:e.serverUrl},{label:`Create`,tone:`info`,value:`POST ${ASH_CREATE_SESSION_ROUTE_PATH}`},{label:`Continue`,tone:`info`,value:`POST ${ASH_CONTINUE_SESSION_ROUTE_PATTERN}`},{label:`Stream`,tone:`info`,value:`GET ${ASH_MESSAGE_STREAM_ROUTE_PATTERN}`}];return i.push({label:`Session`,value:`Follow-up messages reuse the active continuation token.`}),i}function renderCommandRows(){return[{label:`/help`,value:`Print the connection contract and available commands.`},{label:`/new`,value:`Clear the current durable session cursor.`},{label:`/exit`,value:`Exit the REPL.`}]}function renderIntro(e,t){return[renderCliBanner(e,{subtitle:`Interactive development REPL for the active Ash server.`,title:`Ash Dev`}),``,renderCliSection(e,{rows:renderConnectionRows(t),title:`Connection`}),``,renderCliSection(e,{rows:renderCommandRows(),title:`Commands`})].join(`
2
- `)}var SUBAGENT_STREAM_RECONNECT_LIMIT=3;function normalizeStepMessage(e){let t=e.trim();return t.length>0?t:null}function getRenderTag(e){return e.options?.isSubagent===!0?`subagent`:e.fallback}function getRenderTone(e){return e.options?.isSubagent===!0?`subagent`:e.fallback}function prefixSourceLabel(e){return e.options?.sourceLabel===void 0?e.message:`${e.options.sourceLabel}${e.separator??` `}${e.message}`}function formatContentEvent(e,t,n){switch(t.type){case`message.appended`:return{finalized:!1,kind:`message`,line:renderCliSpeakerLine(e,{message:t.data.messageSoFar,speaker:n?.sourceLabel??`agent`,tone:getRenderTone({fallback:`accent`,options:n})})};case`message.completed`:if(t.data.message===null)return;if(t.data.finishReason===`tool-calls`){let r=normalizeStepMessage(t.data.message);return r===null?void 0:{finalized:!0,kind:`message`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:r,options:n,separator:`: `}),tag:getRenderTag({fallback:`step`,options:n}),tone:getRenderTone({fallback:`accent`,options:n})})}}return{finalized:!0,kind:`message`,line:renderCliSpeakerLine(e,{message:t.data.message,speaker:n?.sourceLabel??`agent`,tone:getRenderTone({fallback:`accent`,options:n})})};case`reasoning.appended`:return{finalized:!1,kind:`reasoning`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:t.data.reasoningSoFar,options:n,separator:`: `}),tag:getRenderTag({fallback:`reasoning`,options:n}),tone:getRenderTone({fallback:`info`,options:n})})};case`reasoning.completed`:return{finalized:!0,kind:`reasoning`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:t.data.reasoning,options:n,separator:`: `}),tag:getRenderTag({fallback:`reasoning`,options:n}),tone:getRenderTone({fallback:`info`,options:n})})};default:return}}function formatEvent(e,t,n){let r=formatContentEvent(e,t,n);if(r!==void 0)return r.line;switch(t.type){case`message.received`:return;case`actions.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.actions.length} action${t.data.actions.length===1?``:`s`})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`input.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.requests.length} request${t.data.requests.length===1?``:`s`})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`action.result`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${formatActionResultLabel(t.data.result)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`session.waiting`:case`session.completed`:return;case`connection.authorization_required`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.connectionName}: ${t.data.description}${formatAuthorizationChallengeSuffix(t.data.authorization)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`warning`,options:n})});case`compaction.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`compacting conversation history`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`compaction.completed`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`conversation history compacted`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`step.failed`:case`turn.failed`:case`session.failed`:return;case`subagent.called`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.name} -> ${t.data.childSessionId})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`subagent.started`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`subagent.event`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName}: ${formatNestedSubagentEventLabel(t.data.event)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`subagent.completed`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});default:return}}function getEventDisplayBlockKind(e){switch(e.type){case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:return`content`;default:return`meta`}}function createTurnDisplayState(){return{activeLiveContentKind:null,lastPrintedBlockKind:null}}function printDisplayLine(e){let t=e.state;return t.activeLiveContentKind!==null&&(e.terminal.commitLive(),t={activeLiveContentKind:null,lastPrintedBlockKind:`content`}),t.lastPrintedBlockKind!==null&&t.lastPrintedBlockKind!==e.kind&&e.terminal.print(``),e.terminal.print(e.line),{activeLiveContentKind:null,lastPrintedBlockKind:e.kind}}function renderTurnEvent(e){let t=formatContentEvent(e.theme,e.event,e.options);if(t!==void 0){let n=e.state;return n.activeLiveContentKind!==null&&n.activeLiveContentKind!==t.kind&&(e.terminal.commitLive(),n={activeLiveContentKind:null,lastPrintedBlockKind:`content`}),n.lastPrintedBlockKind!==null&&n.lastPrintedBlockKind!==`content`&&e.terminal.print(``),e.terminal.updateLive(t.line),t.finalized?(e.terminal.commitLive(),{activeLiveContentKind:null,lastPrintedBlockKind:`content`}):{activeLiveContentKind:t.kind,lastPrintedBlockKind:`content`}}let n=formatEvent(e.theme,e.event,e.options);return n===void 0?e.state:printDisplayLine({kind:getEventDisplayBlockKind(e.event),line:n,state:e.state,terminal:e.terminal})}function isAbortLikeError(e){return(e instanceof DOMException||e instanceof Error)&&e.name===`AbortError`}function shouldDrainSubagentStreamsOnBoundary(e){return e.length===0}var ReplSubagentStreamManager=class{#e=new Map;#t;#n;#r;#i;constructor(e){this.#t=e.displayStateRef,this.#n=e.serverUrl,this.#r=e.terminal,this.#i=e.theme}subscribe(e){if(this.#e.has(e.sessionId))return;let t=new AbortController,n=this.#a({controller:t,sessionId:e.sessionId,subagentName:e.subagentName}).finally(()=>{this.#e.delete(e.sessionId)});this.#e.set(e.sessionId,{controller:t,done:n,label:e.subagentName})}async waitForIdle(){for(;this.#e.size>0;)await Promise.all([...this.#e.values()].map(e=>e.done))}async close(){let e=[...this.#e.values()];for(let t of e)t.controller.abort();await Promise.allSettled(e.map(e=>e.done))}async#a(t){let n=resolveDevelopmentServerResourceUrl({resource:createAshMessageStreamRoutePath(t.sessionId),serverUrl:this.#n});try{for await(let e of openStreamIterable({host:this.#n,maxReconnectAttempts:SUBAGENT_STREAM_RECONNECT_LIMIT,resolveHeaders:async()=>await createDevelopmentRequestHeadersAsync({resourceUrl:n}),sessionId:t.sessionId,signal:t.controller.signal,startIndex:0}))if(this.#t.current=renderTurnEvent({event:e,options:{isSubagent:!0,sourceLabel:t.subagentName},state:this.#t.current,terminal:this.#r,theme:this.#i}),e.type===`subagent.called`&&this.subscribe({sessionId:e.data.childSessionId,subagentName:e.data.name}),isCurrentTurnBoundaryEvent(e))return}catch(n){if(isAbortLikeError(n))return;let r=toErrorMessage(n);this.#t.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(this.#i,{message:`${t.subagentName} stream failed: ${r}`,tag:`subagent`,tone:`danger`}),state:this.#t.current,terminal:this.#r})}finally{t.controller.abort()}}};function formatActionResultLabel(e){switch(e.kind){case`load-skill-result`:return e.kind;case`subagent-result`:return`${e.kind}:${e.subagentName}`;case`tool-result`:return`${e.kind}:${e.toolName}`}}function formatAuthorizationChallengeSuffix(e){if(e===void 0)return``;let t=[];return e.url!==void 0&&t.push(e.url),e.userCode!==void 0&&t.push(`code ${e.userCode}`),e.instructions!==void 0&&t.push(e.instructions),t.length===0?``:` — ${t.join(`, `)}`}function formatNestedSubagentEventLabel(e){switch(e.type){case`actions.requested`:{let t=e.data.actions,n=t.map(e=>e.kind===`tool-call`?e.toolName:e.kind).join(`,`);return`${e.type} (${t.length} action${t.length===1?``:`s`}${n.length>0?`: ${n}`:``})`}case`action.result`:return`${e.type} (${formatActionResultLabel(e.data.result)})`;case`input.requested`:return`${e.type} (${e.data.requests.length} request${e.data.requests.length===1?``:`s`})`;default:return e.type}}function formatDispatch(e,t){return t.continuationToken?renderCliTaggedLine(e,{message:`resuming session ${t.continuationToken}`,tag:`session`,tone:`info`}):renderCliTaggedLine(e,{message:`starting a new session`,tag:`session`,tone:`info`})}function formatTurnDispatch(e,t){return t.turn.inputResponses!==void 0&&t.turn.message===void 0?renderCliTaggedLine(e,{message:`responding to pending input request${t.turn.inputResponses.length===1?``:`s`}`,tag:`session`,tone:`info`}):formatDispatch(e,t.session)}function formatSessionBoundary(e,t){let n=extractCurrentTurnBoundaryEvent(t),r=extractPendingRuntimeInputRequests(t);switch(n?.type){case`session.waiting`:return[renderCliTaggedLine(e,{message:r.length>0?`waiting for input approval/answer or the next message`:`waiting for the next message`,tag:`session`,tone:`success`})];case`session.completed`:return[renderCliTaggedLine(e,{message:`session completed; the next input starts a new session`,tag:`session`,tone:`success`})];case`session.failed`:{let t=n.data.details&&typeof n.data.details.name==`string`?n.data.details.name:void 0;return[renderCliTaggedLine(e,{message:t?`session failed (${t}): ${n.data.message}`:`session failed: ${n.data.message}`,tag:`session`,tone:`danger`}),renderCliTaggedLine(e,{message:`cleared; the next input starts a new session`,tag:`session`,tone:`warning`})]}default:return[]}}async function waitForInputLine(e,t,n={}){return await new Promise(r=>{let i=e.input,cleanup=()=>{e.off(`close`,handleClose),e.off(`line`,handleLine),i.off(`keypress`,handleKeypress)},handleClose=()=>{cleanup(),r(void 0)},handleLine=e=>{cleanup(),r(e)},handleKeypress=(t,i)=>{n.allowEscape!==!0||i.name!==`escape`||(cleanup(),e.write(null,{ctrl:!0,name:`u`}),r(ESCAPED_RUNTIME_INPUT_PROMPT))};e.setPrompt(t),e.once(`close`,handleClose),e.once(`line`,handleLine),n.allowEscape&&(emitKeypressEvents(i,e),i.on(`keypress`,handleKeypress)),e.prompt()})}async function runTurn(e){let t=e.turn,n={current:createTurnDisplayState()},r=new ReplSubagentStreamManager({displayStateRef:n,serverUrl:e.serverUrl,terminal:e.terminal,theme:e.theme}),ask=async t=>{e.terminal.startPrompt(e.rl,t);let n=await waitForInputLine(e.rl,t,{allowEscape:!0});return e.terminal.stopPrompt(),n};try{for(;;){let a=e.client.getSession();n.current=printDisplayLine({kind:`meta`,line:formatTurnDispatch(e.theme,{session:a,turn:t}),state:n.current,terminal:e.terminal});let o=await e.client.send({inputResponses:t.inputResponses,message:t.message,onEvent(t){n.current=renderTurnEvent({event:t,state:n.current,terminal:e.terminal,theme:e.theme}),t.type===`subagent.called`&&r.subscribe({sessionId:t.data.childSessionId,subagentName:t.data.name})},onResponseStart(t){t.sessionId&&a.sessionId!==t.sessionId&&(n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:t.sessionId,tag:`session`,tone:`accent`}),state:n.current,terminal:e.terminal}),n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:resolveDevelopmentServerResourceUrl({resource:createAshMessageStreamRoutePath(t.sessionId),serverUrl:e.serverUrl}).toString(),tag:`stream`,tone:`info`}),state:n.current,terminal:e.terminal}))}}),s=extractPendingRuntimeInputRequests(o.events);if(shouldDrainSubagentStreamsOnBoundary(s)){await r.waitForIdle();for(let t of formatSessionBoundary(e.theme,o.events))n.current=printDisplayLine({kind:`meta`,line:t,state:n.current,terminal:e.terminal});return`continue`}let c=await promptForRuntimeInputRequests({ask,print(t){n.current=printDisplayLine({kind:`meta`,line:t,state:n.current,terminal:e.terminal})},requests:s,theme:e.theme});if(c.kind===`aborted`)return`exit`;if(c.kind===`deferred`)return n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:`left pending input requests unresolved; send a new message to ignore them`,tag:`session`,tone:`warning`}),state:n.current,terminal:e.terminal}),`continue`;t={inputResponses:c.inputResponses}}}finally{await r.close()}}async function runDevelopmentRepl(t){let n=createDevelopmentTerminal(),r=createCliTheme({color:!0}),i=createInterface({input:process.stdin,output:n.output,terminal:!0});i.on(`SIGINT`,()=>{i.close()});let o=createDevClient({serverUrl:t.serverUrl});try{for(n.print(renderIntro(r,t)),n.print(``);;){n.print(``),n.startPrompt(i,`you> `);let a=await waitForInputLine(i,`you> `);if(n.stopPrompt(),a===void 0)return;let s=parseDevReplInput(a);switch(s.kind!==`empty`&&s.kind!==`exit`&&n.print(``),s.kind){case`empty`:continue;case`help`:n.print(renderIntro(r,t)),n.print(``);continue;case`exit`:return;case`new`:await o.clear(),n.print(renderCliTaggedLine(r,{message:`cleared; the next input starts a new session`,tag:`session`,tone:`warning`})),n.print(``);continue;case`message`:try{if(await runTurn({client:o,rl:i,serverUrl:t.serverUrl,terminal:n,theme:r,turn:{message:s.message}})===`exit`)return}catch(i){isVercelAuthChallenge(i)?n.printError(renderCliTaggedLine(r,{message:formatVercelAuthChallengeMessage({serverUrl:t.serverUrl}),tag:`auth`,tone:`warning`})):n.printError(renderCliTaggedLine(r,{message:toErrorMessage(i),tag:`error`,tone:`danger`}))}n.print(``)}}}finally{await o.close(),i.close(),n.dispose()}}export{createTurnDisplayState,formatContentEvent,formatEvent,renderTurnEvent,runDevelopmentRepl,shouldDrainSubagentStreamsOnBoundary};
2
+ `)}function normalizeStepMessage(e){let t=e.trim();return t.length>0?t:null}function getRenderTag(e){return e.options?.isSubagent===!0?`subagent`:e.fallback}function getRenderTone(e){return e.options?.isSubagent===!0?`subagent`:e.fallback}function prefixSourceLabel(e){return e.options?.sourceLabel===void 0?e.message:`${e.options.sourceLabel}${e.separator??` `}${e.message}`}function formatContentEvent(e,t,n){switch(t.type){case`message.appended`:return{finalized:!1,kind:`message`,line:renderCliSpeakerLine(e,{message:t.data.messageSoFar,speaker:n?.sourceLabel??`agent`,tone:getRenderTone({fallback:`accent`,options:n})})};case`message.completed`:if(t.data.message===null)return;if(t.data.finishReason===`tool-calls`){let r=normalizeStepMessage(t.data.message);return r===null?void 0:{finalized:!0,kind:`message`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:r,options:n,separator:`: `}),tag:getRenderTag({fallback:`step`,options:n}),tone:getRenderTone({fallback:`accent`,options:n})})}}return{finalized:!0,kind:`message`,line:renderCliSpeakerLine(e,{message:t.data.message,speaker:n?.sourceLabel??`agent`,tone:getRenderTone({fallback:`accent`,options:n})})};case`reasoning.appended`:return{finalized:!1,kind:`reasoning`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:t.data.reasoningSoFar,options:n,separator:`: `}),tag:getRenderTag({fallback:`reasoning`,options:n}),tone:getRenderTone({fallback:`info`,options:n})})};case`reasoning.completed`:return{finalized:!0,kind:`reasoning`,line:renderCliTaggedLine(e,{message:prefixSourceLabel({message:t.data.reasoning,options:n,separator:`: `}),tag:getRenderTag({fallback:`reasoning`,options:n}),tone:getRenderTone({fallback:`info`,options:n})})};default:return}}function formatEvent(e,t,n){let r=formatContentEvent(e,t,n);if(r!==void 0)return r.line;switch(t.type){case`message.received`:return;case`actions.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.actions.length} action${t.data.actions.length===1?``:`s`})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`input.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.requests.length} request${t.data.requests.length===1?``:`s`})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`action.result`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${formatActionResultLabel(t.data.result)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`session.waiting`:case`session.completed`:return;case`connection.authorization_required`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.connectionName}: ${t.data.description}${formatAuthorizationChallengeSuffix(t.data.authorization)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`warning`,options:n})});case`compaction.requested`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`compacting conversation history`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`compaction.completed`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`conversation history compacted`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`step.failed`:case`turn.failed`:case`session.failed`:return;case`subagent.called`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.name} -> ${t.data.childSessionId})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`subagent.started`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});case`subagent.event`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName}: ${formatNestedSubagentEventLabel(t.data.event)})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`muted`,options:n})});case`subagent.completed`:return renderCliTaggedLine(e,{message:prefixSourceLabel({message:`${t.type} (${t.data.subagentName})`,options:n}),tag:getRenderTag({fallback:`event`,options:n}),tone:getRenderTone({fallback:`info`,options:n})});default:return}}function getEventDisplayBlockKind(e){switch(e.type){case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:return`content`;default:return`meta`}}function createTurnDisplayState(){return{activeLiveContentKind:null,lastPrintedBlockKind:null}}function printDisplayLine(e){let t=e.state;return t.activeLiveContentKind!==null&&(e.terminal.commitLive(),t={activeLiveContentKind:null,lastPrintedBlockKind:`content`}),t.lastPrintedBlockKind!==null&&t.lastPrintedBlockKind!==e.kind&&e.terminal.print(``),e.terminal.print(e.line),{activeLiveContentKind:null,lastPrintedBlockKind:e.kind}}function renderTurnEvent(e){let t=formatContentEvent(e.theme,e.event,e.options);if(t!==void 0){let n=e.state;return n.activeLiveContentKind!==null&&n.activeLiveContentKind!==t.kind&&(e.terminal.commitLive(),n={activeLiveContentKind:null,lastPrintedBlockKind:`content`}),n.lastPrintedBlockKind!==null&&n.lastPrintedBlockKind!==`content`&&e.terminal.print(``),e.terminal.updateLive(t.line),t.finalized?(e.terminal.commitLive(),{activeLiveContentKind:null,lastPrintedBlockKind:`content`}):{activeLiveContentKind:t.kind,lastPrintedBlockKind:`content`}}let n=formatEvent(e.theme,e.event,e.options);return n===void 0?e.state:printDisplayLine({kind:getEventDisplayBlockKind(e.event),line:n,state:e.state,terminal:e.terminal})}function isAbortLikeError(e){return(e instanceof DOMException||e instanceof Error)&&e.name===`AbortError`}function shouldDrainSubagentStreamsOnBoundary(e){return e.length===0}var ReplSubagentStreamManager=class{#e=new Map;#t;#n;#r;#i;constructor(e){this.#t=e.displayStateRef,this.#n=e.serverUrl,this.#r=e.terminal,this.#i=e.theme}subscribe(e){if(this.#e.has(e.sessionId))return;let t=new AbortController,n=this.#a({controller:t,sessionId:e.sessionId,subagentName:e.subagentName}).finally(()=>{this.#e.delete(e.sessionId)});this.#e.set(e.sessionId,{controller:t,done:n,label:e.subagentName})}async waitForIdle(){for(;this.#e.size>0;)await Promise.all([...this.#e.values()].map(e=>e.done))}async close(){let e=[...this.#e.values()];for(let t of e)t.controller.abort();await Promise.allSettled(e.map(e=>e.done))}async#a(t){let n=resolveDevelopmentServerResourceUrl({resource:createAshMessageStreamRoutePath(t.sessionId),serverUrl:this.#n});try{for await(let e of openStreamIterable({host:this.#n,maxReconnectAttempts:3,resolveHeaders:async()=>await createDevelopmentRequestHeadersAsync({resourceUrl:n}),sessionId:t.sessionId,signal:t.controller.signal,startIndex:0}))if(this.#t.current=renderTurnEvent({event:e,options:{isSubagent:!0,sourceLabel:t.subagentName},state:this.#t.current,terminal:this.#r,theme:this.#i}),e.type===`subagent.called`&&this.subscribe({sessionId:e.data.childSessionId,subagentName:e.data.name}),isCurrentTurnBoundaryEvent(e))return}catch(n){if(isAbortLikeError(n))return;let r=toErrorMessage(n);this.#t.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(this.#i,{message:`${t.subagentName} stream failed: ${r}`,tag:`subagent`,tone:`danger`}),state:this.#t.current,terminal:this.#r})}finally{t.controller.abort()}}};function formatActionResultLabel(e){switch(e.kind){case`load-skill-result`:return e.kind;case`subagent-result`:return`${e.kind}:${e.subagentName}`;case`tool-result`:return`${e.kind}:${e.toolName}`}}function formatAuthorizationChallengeSuffix(e){if(e===void 0)return``;let t=[];return e.url!==void 0&&t.push(e.url),e.userCode!==void 0&&t.push(`code ${e.userCode}`),e.instructions!==void 0&&t.push(e.instructions),t.length===0?``:` — ${t.join(`, `)}`}function formatNestedSubagentEventLabel(e){switch(e.type){case`actions.requested`:{let t=e.data.actions,n=t.map(e=>e.kind===`tool-call`?e.toolName:e.kind).join(`,`);return`${e.type} (${t.length} action${t.length===1?``:`s`}${n.length>0?`: ${n}`:``})`}case`action.result`:return`${e.type} (${formatActionResultLabel(e.data.result)})`;case`input.requested`:return`${e.type} (${e.data.requests.length} request${e.data.requests.length===1?``:`s`})`;default:return e.type}}function formatDispatch(e,t){return t.continuationToken?renderCliTaggedLine(e,{message:`resuming session ${t.continuationToken}`,tag:`session`,tone:`info`}):renderCliTaggedLine(e,{message:`starting a new session`,tag:`session`,tone:`info`})}function formatTurnDispatch(e,t){return t.turn.inputResponses!==void 0&&t.turn.message===void 0?renderCliTaggedLine(e,{message:`responding to pending input request${t.turn.inputResponses.length===1?``:`s`}`,tag:`session`,tone:`info`}):formatDispatch(e,t.session)}function formatSessionBoundary(e,t){let n=extractCurrentTurnBoundaryEvent(t),r=extractPendingRuntimeInputRequests(t);switch(n?.type){case`session.waiting`:return[renderCliTaggedLine(e,{message:r.length>0?`waiting for input approval/answer or the next message`:`waiting for the next message`,tag:`session`,tone:`success`})];case`session.completed`:return[renderCliTaggedLine(e,{message:`session completed; the next input starts a new session`,tag:`session`,tone:`success`})];case`session.failed`:{let t=n.data.details&&typeof n.data.details.name==`string`?n.data.details.name:void 0;return[renderCliTaggedLine(e,{message:t?`session failed (${t}): ${n.data.message}`:`session failed: ${n.data.message}`,tag:`session`,tone:`danger`}),renderCliTaggedLine(e,{message:`cleared; the next input starts a new session`,tag:`session`,tone:`warning`})]}default:return[]}}async function waitForInputLine(e,t,n={}){return await new Promise(r=>{let i=e.input,cleanup=()=>{e.off(`close`,handleClose),e.off(`line`,handleLine),i.off(`keypress`,handleKeypress)},handleClose=()=>{cleanup(),r(void 0)},handleLine=e=>{cleanup(),r(e)},handleKeypress=(t,i)=>{n.allowEscape!==!0||i.name!==`escape`||(cleanup(),e.write(null,{ctrl:!0,name:`u`}),r(ESCAPED_RUNTIME_INPUT_PROMPT))};e.setPrompt(t),e.once(`close`,handleClose),e.once(`line`,handleLine),n.allowEscape&&(emitKeypressEvents(i,e),i.on(`keypress`,handleKeypress)),e.prompt()})}async function runTurn(e){let t=e.turn,n={current:createTurnDisplayState()},r=new ReplSubagentStreamManager({displayStateRef:n,serverUrl:e.serverUrl,terminal:e.terminal,theme:e.theme}),ask=async t=>{e.terminal.startPrompt(e.rl,t);let n=await waitForInputLine(e.rl,t,{allowEscape:!0});return e.terminal.stopPrompt(),n};try{for(;;){let a=e.client.getSession();n.current=printDisplayLine({kind:`meta`,line:formatTurnDispatch(e.theme,{session:a,turn:t}),state:n.current,terminal:e.terminal});let o=await e.client.send({inputResponses:t.inputResponses,message:t.message,onEvent(t){n.current=renderTurnEvent({event:t,state:n.current,terminal:e.terminal,theme:e.theme}),t.type===`subagent.called`&&r.subscribe({sessionId:t.data.childSessionId,subagentName:t.data.name})},onResponseStart(t){t.sessionId&&a.sessionId!==t.sessionId&&(n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:t.sessionId,tag:`session`,tone:`accent`}),state:n.current,terminal:e.terminal}),n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:resolveDevelopmentServerResourceUrl({resource:createAshMessageStreamRoutePath(t.sessionId),serverUrl:e.serverUrl}).toString(),tag:`stream`,tone:`info`}),state:n.current,terminal:e.terminal}))}}),s=extractPendingRuntimeInputRequests(o.events);if(shouldDrainSubagentStreamsOnBoundary(s)){await r.waitForIdle();for(let t of formatSessionBoundary(e.theme,o.events))n.current=printDisplayLine({kind:`meta`,line:t,state:n.current,terminal:e.terminal});return`continue`}let c=await promptForRuntimeInputRequests({ask,print(t){n.current=printDisplayLine({kind:`meta`,line:t,state:n.current,terminal:e.terminal})},requests:s,theme:e.theme});if(c.kind===`aborted`)return`exit`;if(c.kind===`deferred`)return n.current=printDisplayLine({kind:`meta`,line:renderCliTaggedLine(e.theme,{message:`left pending input requests unresolved; send a new message to ignore them`,tag:`session`,tone:`warning`}),state:n.current,terminal:e.terminal}),`continue`;t={inputResponses:c.inputResponses}}}finally{await r.close()}}async function runDevelopmentRepl(t){let n=createDevelopmentTerminal(),r=createCliTheme({color:!0}),i=createInterface({input:process.stdin,output:n.output,terminal:!0});i.on(`SIGINT`,()=>{i.close()});let o=createDevClient({serverUrl:t.serverUrl});try{for(n.print(renderIntro(r,t)),n.print(``);;){n.print(``),n.startPrompt(i,`you> `);let a=await waitForInputLine(i,`you> `);if(n.stopPrompt(),a===void 0)return;let s=parseDevReplInput(a);switch(s.kind!==`empty`&&s.kind!==`exit`&&n.print(``),s.kind){case`empty`:continue;case`help`:n.print(renderIntro(r,t)),n.print(``);continue;case`exit`:return;case`new`:await o.clear(),n.print(renderCliTaggedLine(r,{message:`cleared; the next input starts a new session`,tag:`session`,tone:`warning`})),n.print(``);continue;case`message`:try{if(await runTurn({client:o,rl:i,serverUrl:t.serverUrl,terminal:n,theme:r,turn:{message:s.message}})===`exit`)return}catch(i){isVercelAuthChallenge(i)?n.printError(renderCliTaggedLine(r,{message:formatVercelAuthChallengeMessage({serverUrl:t.serverUrl}),tag:`auth`,tone:`warning`})):n.printError(renderCliTaggedLine(r,{message:toErrorMessage(i),tag:`error`,tone:`danger`}))}n.print(``)}}}finally{await o.close(),i.close(),n.dispose()}}export{createTurnDisplayState,formatContentEvent,formatEvent,renderTurnEvent,runDevelopmentRepl,shouldDrainSubagentStreamsOnBoundary};
@@ -1,4 +1,4 @@
1
- var ansiSgrPattern=RegExp(`${String.fromCodePoint(27)}\\[[0-9;]*m`,`gu`);function chunkToString(e,t){return typeof e==`string`?e:Buffer.from(e).toString(t)}function endsWithLineBreak(e){return e.endsWith(`
1
+ const ansiSgrPattern=RegExp(`${String.fromCodePoint(27)}\\[[0-9;]*m`,`gu`);function chunkToString(e,t){return typeof e==`string`?e:Buffer.from(e).toString(t)}function endsWithLineBreak(e){return e.endsWith(`
2
2
  `)||e.endsWith(`\r`)}function stripAnsi(t){return t.replace(ansiSgrPattern,``)}function countRenderedLines(e){let t=process.stdout.columns;return e.split(/\r\n|\r|\n/u).reduce((e,n)=>{let r=Array.from(stripAnsi(n)).length;return t===void 0||t<=0?e+1:e+Math.max(1,Math.ceil(r/t))},0)}function getPromptCursor(e){let t=e.cursor;return typeof t==`number`?t:e.line.length}function createDevelopmentTerminal(){let e=process.stdout.write.bind(process.stdout),t=process.stderr.write.bind(process.stderr),n=null,r=null,writeOriginal=(e,t,n,r,i)=>Reflect.apply(t,e,[n,r,i]),clearPrompt=()=>{n!==null&&writeOriginal(process.stdout,e,`\x1B[2K\r`)},redrawPrompt=()=>{if(n===null)return;let{prompt:t,rl:r}=n,i=getPromptCursor(r),a=r.line.length-i;writeOriginal(process.stdout,e,`${t}${r.line}`),a>0&&writeOriginal(process.stdout,e,`\u001B[${a}D`)},clearLiveBlock=()=>{if(r!==null)for(let t=0;t<r.lineCount;t+=1)writeOriginal(process.stdout,e,`\x1B[1A`),writeOriginal(process.stdout,e,`\x1B[2K\r`)},renderLiveBlock=t=>{let n=t.length===0||!endsWithLineBreak(t);writeOriginal(process.stdout,e,t),n&&writeOriginal(process.stdout,e,`
3
3
  `),r={lineCount:countRenderedLines(t),message:t}},printMessage=(e,t,r)=>{let i=n!==null,a=e.length===0||!endsWithLineBreak(e);i&&clearPrompt(),writeOriginal(r,t,e),a&&writeOriginal(r,t,`
4
4
  `),i&&redrawPrompt()},patchStream=(e,t)=>(e.write=((i,a,o)=>{if(n===null&&r===null)return writeOriginal(e,t,i,a,o);let s=chunkToString(i,typeof a==`string`?a:void 0),c=r;n!==null&&clearPrompt(),c!==null&&(clearLiveBlock(),r=null);let l=writeOriginal(e,t,i,a,o);return s.length>0&&!endsWithLineBreak(s)&&writeOriginal(e,t,`
@@ -1 +1 @@
1
- import{InvalidArgumentError}from"#compiled/commander/index.js";var DEVELOPMENT_SERVER_PROTOCOLS=new Set([`http:`,`https:`]);function assertDevelopmentServerProtocol(n,r){if(!DEVELOPMENT_SERVER_PROTOCOLS.has(n.protocol))throw new InvalidArgumentError(`Expected an absolute http(s) URL, received "${r}".`)}function parseDevelopmentServerUrl(t){let n=t.trim();try{let e=new URL(n);return assertDevelopmentServerProtocol(e,t),e.hash=``,e.search=``,e.toString()}catch(n){throw n instanceof InvalidArgumentError?n:new InvalidArgumentError(`Expected an absolute http(s) URL, received "${t}".`)}}export{parseDevelopmentServerUrl};
1
+ import{InvalidArgumentError}from"#compiled/commander/index.js";const DEVELOPMENT_SERVER_PROTOCOLS=new Set([`http:`,`https:`]);function assertDevelopmentServerProtocol(n,r){if(!DEVELOPMENT_SERVER_PROTOCOLS.has(n.protocol))throw new InvalidArgumentError(`Expected an absolute http(s) URL, received "${r}".`)}function parseDevelopmentServerUrl(t){let n=t.trim();try{let e=new URL(n);return assertDevelopmentServerProtocol(e,t),e.hash=``,e.search=``,e.toString()}catch(n){throw n instanceof InvalidArgumentError?n:new InvalidArgumentError(`Expected an absolute http(s) URL, received "${t}".`)}}export{parseDevelopmentServerUrl};
@@ -1 +1 @@
1
- import{join,relative,resolve}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createHash}from"node:crypto";import{summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{materializeWorkspaceResources}from"#compiler/workspace-resources.js";var DISCOVERY_DIAGNOSTICS_ARTIFACT_KIND=`ash-discovery-diagnostics`,DISCOVERY_DIAGNOSTICS_ARTIFACT_VERSION=1,COMPILE_METADATA_KIND=`ash-compile-metadata`,COMPILE_METADATA_VERSION=5;function resolveCompilerArtifactPaths(t){let r=resolve(t),i=join(r,`.ash`,`discovery`),a=join(r,`.ash`,`compile`);return{appRoot:r,compiledManifestPath:join(a,`compiled-agent-manifest.json`),compileDirectoryPath:a,compileMetadataPath:join(a,`compile-metadata.json`),diagnosticsPath:join(i,`diagnostics.json`),discoveryManifestPath:join(i,`agent-discovery-manifest.json`),discoveryDirectoryPath:i,moduleMapPath:join(a,`module-map.mjs`)}}function createDiscoveryDiagnosticsArtifact(e){return{diagnostics:[...e],kind:DISCOVERY_DIAGNOSTICS_ARTIFACT_KIND,summary:summarizeDiscoverDiagnostics(e),version:DISCOVERY_DIAGNOSTICS_ARTIFACT_VERSION}}function createCompileMetadata(e){let t=resolveInstalledPackageInfo(),n=createContentHash(e.discoveryManifestJson),r=createContentHash(e.diagnosticsArtifactJson),i=createContentHash(e.moduleMapSource);return{compile:{moduleMap:{path:toArtifactRelativePath(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:toArtifactRelativePath(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:toArtifactRelativePath(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:createContentHash(`${n}:${r}:${i}`),summary:e.diagnosticsSummary},generator:{name:t.name,version:t.version},kind:COMPILE_METADATA_KIND,status:e.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function writeCompilerArtifacts(e){let t=resolveCompilerArtifactPaths(e.appRoot),n=createDiscoveryDiagnosticsArtifact(e.diagnostics),a=await materializeWorkspaceResources({compileDirectoryPath:t.compileDirectoryPath,manifest:await compileAgentManifest(e.manifest)}),o=serializeArtifactJson(a),s=serializeArtifactJson(e.manifest),c=serializeArtifactJson(n),l=createCompiledModuleMapSource({manifest:a,moduleMapPath:t.moduleMapPath}),u=createCompileMetadata({appRoot:e.appRoot,diagnosticsArtifactJson:c,diagnosticsSummary:n.summary,discoveryManifestJson:s,moduleMapSource:l,paths:t}),d=serializeArtifactJson(u);return await mkdir(t.discoveryDirectoryPath,{recursive:!0}),await mkdir(t.compileDirectoryPath,{recursive:!0}),await Promise.all([writeFile(t.compiledManifestPath,o),writeFile(t.diagnosticsPath,c),writeFile(t.discoveryManifestPath,s),writeFile(t.moduleMapPath,l),writeFile(t.compileMetadataPath,d)]),{compiledManifest:a,diagnosticsArtifact:n,metadata:u,moduleMapSource:l,paths:t}}function createContentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function serializeArtifactJson(e){return`${JSON.stringify(e,null,2)}\n`}function toArtifactRelativePath(e,r){return normalizeLogicalPath(relative(resolve(e),r))}export{COMPILE_METADATA_KIND,COMPILE_METADATA_VERSION,createCompileMetadata,resolveCompilerArtifactPaths,writeCompilerArtifacts};
1
+ import{join,relative,resolve}from"node:path";import{mkdir,writeFile}from"node:fs/promises";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createHash}from"node:crypto";import{summarizeDiscoverDiagnostics}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createCompiledModuleMapSource}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{materializeWorkspaceResources}from"#compiler/workspace-resources.js";const COMPILE_METADATA_KIND=`ash-compile-metadata`,COMPILE_METADATA_VERSION=5;function resolveCompilerArtifactPaths(t){let r=resolve(t),i=join(r,`.ash`,`discovery`),a=join(r,`.ash`,`compile`);return{appRoot:r,compiledManifestPath:join(a,`compiled-agent-manifest.json`),compileDirectoryPath:a,compileMetadataPath:join(a,`compile-metadata.json`),diagnosticsPath:join(i,`diagnostics.json`),discoveryManifestPath:join(i,`agent-discovery-manifest.json`),discoveryDirectoryPath:i,moduleMapPath:join(a,`module-map.mjs`)}}function createDiscoveryDiagnosticsArtifact(e){return{diagnostics:[...e],kind:`ash-discovery-diagnostics`,summary:summarizeDiscoverDiagnostics(e),version:1}}function createCompileMetadata(e){let t=resolveInstalledPackageInfo(),n=createContentHash(e.discoveryManifestJson),r=createContentHash(e.diagnosticsArtifactJson),i=createContentHash(e.moduleMapSource);return{compile:{moduleMap:{path:toArtifactRelativePath(e.appRoot,e.paths.moduleMapPath),sha256:i}},discovery:{diagnostics:{path:toArtifactRelativePath(e.appRoot,e.paths.diagnosticsPath),sha256:r},manifest:{path:toArtifactRelativePath(e.appRoot,e.paths.discoveryManifestPath),sha256:n},sourceGraphHash:createContentHash(`${n}:${r}:${i}`),summary:e.diagnosticsSummary},generator:{name:t.name,version:t.version},kind:COMPILE_METADATA_KIND,status:e.diagnosticsSummary.errors>0?`failed`:`ready`,version:5}}async function writeCompilerArtifacts(e){let t=resolveCompilerArtifactPaths(e.appRoot),n=createDiscoveryDiagnosticsArtifact(e.diagnostics),a=await materializeWorkspaceResources({compileDirectoryPath:t.compileDirectoryPath,manifest:await compileAgentManifest(e.manifest)}),o=serializeArtifactJson(a),s=serializeArtifactJson(e.manifest),c=serializeArtifactJson(n),l=createCompiledModuleMapSource({manifest:a,moduleMapPath:t.moduleMapPath}),u=createCompileMetadata({appRoot:e.appRoot,diagnosticsArtifactJson:c,diagnosticsSummary:n.summary,discoveryManifestJson:s,moduleMapSource:l,paths:t}),d=serializeArtifactJson(u);return await mkdir(t.discoveryDirectoryPath,{recursive:!0}),await mkdir(t.compileDirectoryPath,{recursive:!0}),await Promise.all([writeFile(t.compiledManifestPath,o),writeFile(t.diagnosticsPath,c),writeFile(t.discoveryManifestPath,s),writeFile(t.moduleMapPath,l),writeFile(t.compileMetadataPath,d)]),{compiledManifest:a,diagnosticsArtifact:n,metadata:u,moduleMapSource:l,paths:t}}function createContentHash(e){return createHash(`sha256`).update(e).digest(`hex`)}function serializeArtifactJson(e){return`${JSON.stringify(e,null,2)}\n`}function toArtifactRelativePath(e,r){return normalizeLogicalPath(relative(resolve(e),r))}export{COMPILE_METADATA_KIND,COMPILE_METADATA_VERSION,createCompileMetadata,resolveCompilerArtifactPaths,writeCompilerArtifacts};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{discoverDiagnosticsSummarySchema}from"#discover/diagnostics.js";import{compiledRemoteAgentNodeSchema}from"#compiler/remote-agent-node.js";import{jsonObjectSchema}from"#shared/json-schemas.js";var COMPILED_AGENT_MANIFEST_KIND=`ash-agent-compiled-manifest`,ROOT_COMPILED_AGENT_NODE_ID=`__root__`,COMPILED_AGENT_MANIFEST_VERSION=24,moduleSourceRefSchema=z.object({exportName:z.string().optional(),sourceKind:z.literal(`module`),logicalPath:z.string(),sourceId:z.string()}).strict(),channelMethodSchema=z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`PATCH`),z.literal(`DELETE`)]),compiledChannelDefinitionSchema=z.object({kind:z.literal(`channel`),name:z.string(),logicalPath:z.string(),method:channelMethodSchema,urlPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional(),adapterKind:z.string().optional()}).strict(),disabledCompiledChannelEntrySchema=z.object({kind:z.literal(`disabled`),name:z.string(),logicalPath:z.string()}).strict(),compiledChannelEntrySchema=z.union([compiledChannelDefinitionSchema,disabledCompiledChannelEntrySchema]),compiledRuntimeModelReferenceSchema=z.object({contextWindowTokens:z.number().int().positive().optional(),id:z.string(),source:moduleSourceRefSchema.optional(),providerOptions:z.record(z.string(),jsonObjectSchema).optional()}).strict(),compiledAgentBuildDefinitionSchema=z.object({externalDependencies:z.array(z.string()).optional()}).strict(),compiledAgentCompactionDefinitionSchema=z.object({model:compiledRuntimeModelReferenceSchema.optional(),thresholdPercent:z.number().finite().min(0).max(1).optional()}).strict(),compiledAgentConfigSchema=z.object({build:compiledAgentBuildDefinitionSchema.optional(),compaction:compiledAgentCompactionDefinitionSchema.optional(),description:z.string().optional(),metadata:z.record(z.string(),z.string()),model:compiledRuntimeModelReferenceSchema,name:z.string(),source:moduleSourceRefSchema.optional()}).strict(),compiledInstructionsSchema=z.object({name:z.string(),logicalPath:z.string(),markdown:z.string(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSkillBaseFields={name:z.string(),description:z.string(),license:z.string().optional(),markdown:z.string(),metadata:z.record(z.string(),z.string()).optional(),sourceId:z.string(),logicalPath:z.string()},compiledSkillSourceSchema=z.discriminatedUnion(`sourceKind`,[z.object({...compiledSkillBaseFields,sourceKind:z.literal(`markdown`)}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`skill-package`),skillId:z.string(),skillFilePath:z.string(),rootPath:z.string(),assetsPath:z.string().optional(),referencesPath:z.string().optional(),scriptsPath:z.string().optional()}).strict()]),compiledScheduleDefinitionSchema=z.object({cron:z.string(),hasRun:z.boolean(),name:z.string(),logicalPath:z.string(),markdown:z.string().optional(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSandboxDefinitionSchema=z.object({description:z.string().optional(),exportName:z.string().optional(),logicalPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledSandboxWorkspaceSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly(),sourceId:z.string(),sourcePath:z.string()}).strict(),compiledWorkspaceResourceRootSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly()}).strict(),compiledConnectionDefinitionSchema=z.object({connectionName:z.string(),description:z.string(),exportName:z.string().optional(),logicalPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string(),vercelConnect:z.object({connector:z.string()}).strict().optional()}).strict(),compiledToolDefinitionSchema=z.object({description:z.string(),exportName:z.string().optional(),inputSchema:jsonObjectSchema.nullable(),logicalPath:z.string(),name:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledHookDefinitionSchema=z.object({exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledAgentNodeManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),hooks:z.array(compiledHookDefinitionSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),remoteAgents:z.array(compiledRemoteAgentNodeSchema),skills:z.array(compiledSkillSourceSchema).readonly(),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict(),compiledSubagentNodeSchema=z.object({agent:compiledAgentNodeManifestSchema,description:z.string(),entryPath:z.string(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),compiledSubagentEdgeSchema=z.object({childNodeId:z.string(),parentNodeId:z.string()}).strict(),compiledAgentManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),hooks:z.array(compiledHookDefinitionSchema),kind:z.literal(COMPILED_AGENT_MANIFEST_KIND),remoteAgents:z.array(compiledRemoteAgentNodeSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),skills:z.array(compiledSkillSourceSchema).readonly(),subagentEdges:z.array(compiledSubagentEdgeSchema),subagents:z.array(compiledSubagentNodeSchema),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),version:z.literal(24),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict();function createCompiledAgentNodeManifest(e){let t={agentRoot:e.agentRoot,appRoot:e.appRoot,channels:[...e.channels??[]],connections:[...e.connections??[]],config:{build:e.config.build===void 0?void 0:{externalDependencies:e.config.build.externalDependencies===void 0?void 0:[...e.config.build.externalDependencies]},compaction:{model:e.config.compaction?.model===void 0?void 0:cloneCompiledRuntimeModelReference(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,metadata:{...e.config.metadata},model:cloneCompiledRuntimeModelReference(e.config.model),name:e.config.name,source:e.config.source===void 0?void 0:{...e.config.source}},diagnosticsSummary:e.diagnosticsSummary??{errors:0,warnings:0},disabledFrameworkTools:[...e.disabledFrameworkTools??[]],hooks:[...e.hooks??[]],remoteAgents:[...e.remoteAgents??[]],sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],workspaceResourceRoot:e.workspaceResourceRoot??{logicalPath:``,rootEntries:deriveResourceRootEntries({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.instructions!==void 0&&(t.instructions=e.instructions),t}function deriveResourceRootEntries(e){let t=new Set;(e.skills??[]).length>0&&t.add(`skills/`);for(let n of e.sandboxWorkspaces??[])for(let e of n.rootEntries)t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function createCompiledSubagentNodeId(e,t){return e===`__root__`?t:`${e}::${t}`}function createCompiledAgentManifest(e){return{...createCompiledAgentNodeManifest(e),kind:COMPILED_AGENT_MANIFEST_KIND,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:24}}function cloneCompiledRuntimeModelReference(e){return e.contextWindowTokens===void 0&&e.source===void 0&&e.providerOptions===void 0?{id:e.id}:e.source===void 0?e.providerOptions===void 0?{contextWindowTokens:e.contextWindowTokens,id:e.id}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:{...e.providerOptions}}:e.contextWindowTokens===void 0&&e.providerOptions===void 0?{id:e.id,source:{...e.source}}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:e.providerOptions===void 0?void 0:{...e.providerOptions},source:{...e.source}}}export{COMPILED_AGENT_MANIFEST_KIND,COMPILED_AGENT_MANIFEST_VERSION,ROOT_COMPILED_AGENT_NODE_ID,compiledAgentManifestSchema,createCompiledAgentManifest,createCompiledAgentNodeManifest,createCompiledSubagentNodeId,deriveResourceRootEntries};
1
+ import{z}from"#compiled/zod/index.js";import{discoverDiagnosticsSummarySchema}from"#discover/diagnostics.js";import{compiledRemoteAgentNodeSchema}from"#compiler/remote-agent-node.js";import{jsonObjectSchema}from"#shared/json-schemas.js";const COMPILED_AGENT_MANIFEST_KIND=`ash-agent-compiled-manifest`,ROOT_COMPILED_AGENT_NODE_ID=`__root__`,COMPILED_AGENT_MANIFEST_VERSION=24,moduleSourceRefSchema=z.object({exportName:z.string().optional(),sourceKind:z.literal(`module`),logicalPath:z.string(),sourceId:z.string()}).strict(),channelMethodSchema=z.union([z.literal(`GET`),z.literal(`POST`),z.literal(`PUT`),z.literal(`PATCH`),z.literal(`DELETE`)]),compiledChannelDefinitionSchema=z.object({kind:z.literal(`channel`),name:z.string(),logicalPath:z.string(),method:channelMethodSchema,urlPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional(),adapterKind:z.string().optional()}).strict(),disabledCompiledChannelEntrySchema=z.object({kind:z.literal(`disabled`),name:z.string(),logicalPath:z.string()}).strict(),compiledChannelEntrySchema=z.union([compiledChannelDefinitionSchema,disabledCompiledChannelEntrySchema]),compiledRuntimeModelReferenceSchema=z.object({contextWindowTokens:z.number().int().positive().optional(),id:z.string(),source:moduleSourceRefSchema.optional(),providerOptions:z.record(z.string(),jsonObjectSchema).optional()}).strict(),compiledAgentBuildDefinitionSchema=z.object({externalDependencies:z.array(z.string()).optional()}).strict(),compiledAgentCompactionDefinitionSchema=z.object({model:compiledRuntimeModelReferenceSchema.optional(),thresholdPercent:z.number().finite().min(0).max(1).optional()}).strict(),compiledAgentConfigSchema=z.object({build:compiledAgentBuildDefinitionSchema.optional(),compaction:compiledAgentCompactionDefinitionSchema.optional(),description:z.string().optional(),metadata:z.record(z.string(),z.string()),model:compiledRuntimeModelReferenceSchema,name:z.string(),source:moduleSourceRefSchema.optional()}).strict(),compiledInstructionsSchema=z.object({name:z.string(),logicalPath:z.string(),markdown:z.string(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSkillBaseFields={name:z.string(),description:z.string(),license:z.string().optional(),markdown:z.string(),metadata:z.record(z.string(),z.string()).optional(),sourceId:z.string(),logicalPath:z.string()},compiledSkillSourceSchema=z.discriminatedUnion(`sourceKind`,[z.object({...compiledSkillBaseFields,sourceKind:z.literal(`markdown`)}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),z.object({...compiledSkillBaseFields,sourceKind:z.literal(`skill-package`),skillId:z.string(),skillFilePath:z.string(),rootPath:z.string(),assetsPath:z.string().optional(),referencesPath:z.string().optional(),scriptsPath:z.string().optional()}).strict()]),compiledScheduleDefinitionSchema=z.object({cron:z.string(),hasRun:z.boolean(),name:z.string(),logicalPath:z.string(),markdown:z.string().optional(),sourceId:z.string(),sourceKind:z.union([z.literal(`markdown`),z.literal(`module`)])}).strict(),compiledSandboxDefinitionSchema=z.object({description:z.string().optional(),exportName:z.string().optional(),logicalPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledSandboxWorkspaceSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly(),sourceId:z.string(),sourcePath:z.string()}).strict(),compiledWorkspaceResourceRootSchema=z.object({logicalPath:z.string(),rootEntries:z.array(z.string()).readonly()}).strict(),compiledConnectionDefinitionSchema=z.object({connectionName:z.string(),description:z.string(),exportName:z.string().optional(),logicalPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string(),vercelConnect:z.object({connector:z.string()}).strict().optional()}).strict(),compiledToolDefinitionSchema=z.object({description:z.string(),exportName:z.string().optional(),inputSchema:jsonObjectSchema.nullable(),logicalPath:z.string(),name:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledHookDefinitionSchema=z.object({exportName:z.string().optional(),logicalPath:z.string(),slug:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`)}).strict(),compiledAgentNodeManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),hooks:z.array(compiledHookDefinitionSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),remoteAgents:z.array(compiledRemoteAgentNodeSchema),skills:z.array(compiledSkillSourceSchema).readonly(),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict(),compiledSubagentNodeSchema=z.object({agent:compiledAgentNodeManifestSchema,description:z.string(),entryPath:z.string(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),exportName:z.string().optional()}).strict(),compiledSubagentEdgeSchema=z.object({childNodeId:z.string(),parentNodeId:z.string()}).strict(),compiledAgentManifestSchema=z.object({agentRoot:z.string(),appRoot:z.string(),channels:z.array(compiledChannelEntrySchema),config:compiledAgentConfigSchema,connections:z.array(compiledConnectionDefinitionSchema),diagnosticsSummary:discoverDiagnosticsSummarySchema,disabledFrameworkTools:z.array(z.string()).readonly(),hooks:z.array(compiledHookDefinitionSchema),kind:z.literal(COMPILED_AGENT_MANIFEST_KIND),remoteAgents:z.array(compiledRemoteAgentNodeSchema),sandbox:compiledSandboxDefinitionSchema.nullable(),sandboxWorkspaces:z.array(compiledSandboxWorkspaceSchema),schedules:z.array(compiledScheduleDefinitionSchema),skills:z.array(compiledSkillSourceSchema).readonly(),subagentEdges:z.array(compiledSubagentEdgeSchema),subagents:z.array(compiledSubagentNodeSchema),instructions:compiledInstructionsSchema.optional(),tools:z.array(compiledToolDefinitionSchema),version:z.literal(24),workspaceResourceRoot:compiledWorkspaceResourceRootSchema}).strict();function createCompiledAgentNodeManifest(e){let t={agentRoot:e.agentRoot,appRoot:e.appRoot,channels:[...e.channels??[]],connections:[...e.connections??[]],config:{build:e.config.build===void 0?void 0:{externalDependencies:e.config.build.externalDependencies===void 0?void 0:[...e.config.build.externalDependencies]},compaction:{model:e.config.compaction?.model===void 0?void 0:cloneCompiledRuntimeModelReference(e.config.compaction.model),thresholdPercent:e.config.compaction?.thresholdPercent},description:e.config.description,metadata:{...e.config.metadata},model:cloneCompiledRuntimeModelReference(e.config.model),name:e.config.name,source:e.config.source===void 0?void 0:{...e.config.source}},diagnosticsSummary:e.diagnosticsSummary??{errors:0,warnings:0},disabledFrameworkTools:[...e.disabledFrameworkTools??[]],hooks:[...e.hooks??[]],remoteAgents:[...e.remoteAgents??[]],sandbox:e.sandbox??null,sandboxWorkspaces:[...e.sandboxWorkspaces??[]],schedules:[...e.schedules??[]],skills:[...e.skills??[]],tools:[...e.tools??[]],workspaceResourceRoot:e.workspaceResourceRoot??{logicalPath:``,rootEntries:deriveResourceRootEntries({sandboxWorkspaces:e.sandboxWorkspaces,skills:e.skills})}};return e.instructions!==void 0&&(t.instructions=e.instructions),t}function deriveResourceRootEntries(e){let t=new Set;(e.skills??[]).length>0&&t.add(`skills/`);for(let n of e.sandboxWorkspaces??[])for(let e of n.rootEntries)t.add(e);return[...t].sort((e,t)=>e.localeCompare(t))}function createCompiledSubagentNodeId(e,t){return e===`__root__`?t:`${e}::${t}`}function createCompiledAgentManifest(e){return{...createCompiledAgentNodeManifest(e),kind:COMPILED_AGENT_MANIFEST_KIND,subagentEdges:[...e.subagentEdges??[]],subagents:[...e.subagents??[]],version:24}}function cloneCompiledRuntimeModelReference(e){return e.contextWindowTokens===void 0&&e.source===void 0&&e.providerOptions===void 0?{id:e.id}:e.source===void 0?e.providerOptions===void 0?{contextWindowTokens:e.contextWindowTokens,id:e.id}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:{...e.providerOptions}}:e.contextWindowTokens===void 0&&e.providerOptions===void 0?{id:e.id,source:{...e.source}}:{contextWindowTokens:e.contextWindowTokens,id:e.id,providerOptions:e.providerOptions===void 0?void 0:{...e.providerOptions},source:{...e.source}}}export{COMPILED_AGENT_MANIFEST_KIND,COMPILED_AGENT_MANIFEST_VERSION,ROOT_COMPILED_AGENT_NODE_ID,compiledAgentManifestSchema,createCompiledAgentManifest,createCompiledAgentNodeManifest,createCompiledSubagentNodeId,deriveResourceRootEntries};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{mkdir,readFile,writeFile}from"node:fs/promises";var AI_GATEWAY_MODELS_CATALOG_URL=`https://ai-gateway.vercel.sh/v1/models/catalog`,COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND=`ash-model-catalog-cache`,COMPILED_RUNTIME_MODEL_CATALOG_CACHE_VERSION=2,COMPILED_RUNTIME_MODEL_CATALOG_CACHE_TTL_MS=1440*60*1e3,THINKING_SUFFIX=`-thinking`,catalogModelProviderSchema=z.object({provider:z.string().min(1),providerModelId:z.string().min(1),contextWindowTokens:z.number().int().nonnegative().optional(),maxOutputTokens:z.number().int().nonnegative().optional()}).passthrough(),catalogModelSchema=z.object({slug:z.string().min(1),providers:z.array(catalogModelProviderSchema).min(1)}).passthrough(),modelCatalogResponseSchema=z.object({models:z.array(catalogModelSchema),providerAliases:z.record(z.string(),z.string())}).passthrough();z.object({contextWindowTokens:z.number().int().positive(),maxOutputTokens:z.number().int().positive().optional()}).strict();var compiledRuntimeModelCatalogCacheSchema=z.object({fetchedAt:z.string(),kind:z.literal(COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND),models:z.array(catalogModelSchema),providerAliases:z.record(z.string(),z.string()),version:z.literal(COMPILED_RUNTIME_MODEL_CATALOG_CACHE_VERSION)}).strict(),builtInCompiledRuntimeModelLimitsById=new Map([[`anthropic/claude-opus-4.7`,{contextWindowTokens:2e5,maxOutputTokens:32e3}],[`openai/gpt-5.4`,{contextWindowTokens:4e5,maxOutputTokens:128e3}],[`openai/gpt-5.4-mini`,{contextWindowTokens:4e5,maxOutputTokens:128e3}]]);function resolveCompiledRuntimeModelCatalogCachePath(e){return join(e,`.ash`,`cache`,`model-catalog.json`)}function createCompiledRuntimeModelCatalogLoader(e){let t=null,n=null,r=null,getCachedCatalog=async()=>(t??=readModelCatalogCache(e),await t),getFetchedCatalog=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=fetchAndPersistModelCatalog(e).then(e=>(t=Promise.resolve(e),e));try{return await r}catch(e){throw n=e,e}},resolveModelsFromCacheOrFetch=async()=>{let e=await getCachedCatalog();if(e!==null&&isCacheFresh(e))return e;try{return await getFetchedCatalog()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=normalizeModelId(e),n=await resolveModelsFromCacheOrFetch();if(n!==null){let e=findBySlug(n.models,t);if(e)for(let t of e.providers){let e=limitsFromProvider(t);if(e!==null)return e}}return builtInCompiledRuntimeModelLimitsById.get(t)??null},async getByProviderModelId(e,t){let n=await resolveModelsFromCacheOrFetch();if(n===null)return null;let r=e.split(`.`)[0],i=n.providerAliases[r]??r,a=normalizeModelId(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&normalizeModelId(t.providerModelId)===a){let n=limitsFromProvider(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function fetchAndPersistModelCatalog(e){let r=await fetch(AI_GATEWAY_MODELS_CATALOG_URL);if(!r.ok)throw Error(`AI Gateway model catalog request failed with HTTP ${r.status} ${r.statusText}.`);let o=modelCatalogResponseSchema.safeParse(await r.json());if(!o.success)throw Error(`AI Gateway model catalog response did not match the expected schema.`);let s={fetchedAt:new Date().toISOString(),kind:COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND,models:o.data.models,providerAliases:o.data.providerAliases,version:COMPILED_RUNTIME_MODEL_CATALOG_CACHE_VERSION};try{let r=resolveCompiledRuntimeModelCatalogCachePath(e);await mkdir(join(e,`.ash`,`cache`),{recursive:!0}),await writeFile(r,`${JSON.stringify(s,null,2)}\n`,`utf8`)}catch{}return s}async function readModelCatalogCache(e){try{let t=await readFile(resolveCompiledRuntimeModelCatalogCachePath(e),`utf8`),n=compiledRuntimeModelCatalogCacheSchema.safeParse(JSON.parse(t));return n.success?n.data:null}catch(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&e.code,null}}function findBySlug(e,t){return e.find(e=>e.slug===t)}function limitsFromProvider(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function isCacheFresh(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=COMPILED_RUNTIME_MODEL_CATALOG_CACHE_TTL_MS:!1}function normalizeModelId(e){return e.endsWith(THINKING_SUFFIX)?e.slice(0,-THINKING_SUFFIX.length):e}export{catalogModelProviderSchema,catalogModelSchema,createCompiledRuntimeModelCatalogLoader,modelCatalogResponseSchema,resolveCompiledRuntimeModelCatalogCachePath};
1
+ import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{mkdir,readFile,writeFile}from"node:fs/promises";const COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND=`ash-model-catalog-cache`,catalogModelProviderSchema=z.object({provider:z.string().min(1),providerModelId:z.string().min(1),contextWindowTokens:z.number().int().nonnegative().optional(),maxOutputTokens:z.number().int().nonnegative().optional()}).passthrough(),catalogModelSchema=z.object({slug:z.string().min(1),providers:z.array(catalogModelProviderSchema).min(1)}).passthrough(),modelCatalogResponseSchema=z.object({models:z.array(catalogModelSchema),providerAliases:z.record(z.string(),z.string())}).passthrough();z.object({contextWindowTokens:z.number().int().positive(),maxOutputTokens:z.number().int().positive().optional()}).strict();const compiledRuntimeModelCatalogCacheSchema=z.object({fetchedAt:z.string(),kind:z.literal(COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND),models:z.array(catalogModelSchema),providerAliases:z.record(z.string(),z.string()),version:z.literal(2)}).strict(),builtInCompiledRuntimeModelLimitsById=new Map([[`anthropic/claude-opus-4.7`,{contextWindowTokens:2e5,maxOutputTokens:32e3}],[`openai/gpt-5.4`,{contextWindowTokens:4e5,maxOutputTokens:128e3}],[`openai/gpt-5.4-mini`,{contextWindowTokens:4e5,maxOutputTokens:128e3}]]);function resolveCompiledRuntimeModelCatalogCachePath(e){return join(e,`.ash`,`cache`,`model-catalog.json`)}function createCompiledRuntimeModelCatalogLoader(e){let t=null,n=null,r=null,getCachedCatalog=async()=>(t??=readModelCatalogCache(e),await t),getFetchedCatalog=async()=>{if(n!==null)throw n;if(r!==null)return await r;r=fetchAndPersistModelCatalog(e).then(e=>(t=Promise.resolve(e),e));try{return await r}catch(e){throw n=e,e}},resolveModelsFromCacheOrFetch=async()=>{let e=await getCachedCatalog();if(e!==null&&isCacheFresh(e))return e;try{return await getFetchedCatalog()}catch{return e===null?null:e}};return{async getModelLimits(e){let t=normalizeModelId(e),n=await resolveModelsFromCacheOrFetch();if(n!==null){let e=findBySlug(n.models,t);if(e)for(let t of e.providers){let e=limitsFromProvider(t);if(e!==null)return e}}return builtInCompiledRuntimeModelLimitsById.get(t)??null},async getByProviderModelId(e,t){let n=await resolveModelsFromCacheOrFetch();if(n===null)return null;let r=e.split(`.`)[0],i=n.providerAliases[r]??r,a=normalizeModelId(t);for(let e of n.models)for(let t of e.providers)if(t.provider===i&&normalizeModelId(t.providerModelId)===a){let n=limitsFromProvider(t);if(n!==null)return{slug:e.slug,limits:n}}return null}}}async function fetchAndPersistModelCatalog(e){let r=await fetch(`https://ai-gateway.vercel.sh/v1/models/catalog`);if(!r.ok)throw Error(`AI Gateway model catalog request failed with HTTP ${r.status} ${r.statusText}.`);let o=modelCatalogResponseSchema.safeParse(await r.json());if(!o.success)throw Error(`AI Gateway model catalog response did not match the expected schema.`);let s={fetchedAt:new Date().toISOString(),kind:COMPILED_RUNTIME_MODEL_CATALOG_CACHE_KIND,models:o.data.models,providerAliases:o.data.providerAliases,version:2};try{let r=resolveCompiledRuntimeModelCatalogCachePath(e);await mkdir(join(e,`.ash`,`cache`),{recursive:!0}),await writeFile(r,`${JSON.stringify(s,null,2)}\n`,`utf8`)}catch{}return s}async function readModelCatalogCache(e){try{let t=await readFile(resolveCompiledRuntimeModelCatalogCachePath(e),`utf8`),n=compiledRuntimeModelCatalogCacheSchema.safeParse(JSON.parse(t));return n.success?n.data:null}catch(e){return e instanceof Error&&`code`in e&&typeof e.code==`string`&&e.code,null}}function findBySlug(e,t){return e.find(e=>e.slug===t)}function limitsFromProvider(e){return e.contextWindowTokens===void 0||e.contextWindowTokens<=0?null:{contextWindowTokens:e.contextWindowTokens,...e.maxOutputTokens!==void 0&&e.maxOutputTokens>0&&{maxOutputTokens:e.maxOutputTokens}}}function isCacheFresh(e){let t=Date.parse(e.fetchedAt);return Number.isFinite(t)?Date.now()-t<=864e5:!1}function normalizeModelId(e){return e.endsWith(`-thinking`)?e.slice(0,-9):e}export{catalogModelProviderSchema,catalogModelSchema,createCompiledRuntimeModelCatalogLoader,modelCatalogResponseSchema,resolveCompiledRuntimeModelCatalogCachePath};
@@ -1,4 +1,4 @@
1
- import{z}from"#compiled/zod/index.js";import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{normalizeEsmImportSpecifier}from"#internal/application/import-specifier.js";var compiledModuleNodeScopeSchema=z.object({modules:z.record(z.string(),z.object({}).passthrough())}).strict(),compiledModuleMapSchema=z.object({nodes:z.record(z.string(),compiledModuleNodeScopeSchema)}).strict();function createCompiledModuleMapSource(e){let n=dirnameFilesystemPath(e.moduleMapPath),r=e.importSpecifierStyle??`relative`,i=0,a=[collectModuleNodeScope({agentRoot:e.manifest.agentRoot,importSpecifierStyle:r,manifest:e.manifest,moduleMapDirectory:n,nextBindingName(){return`module_${i++}`},nodeId:ROOT_COMPILED_AGENT_NODE_ID}),...[...e.manifest.subagents].sort((e,t)=>e.nodeId.localeCompare(t.nodeId)).map(e=>collectModuleNodeScope({agentRoot:e.agent.agentRoot,importSpecifierStyle:r,manifest:e.agent,moduleMapDirectory:n,nextBindingName(){return`module_${i++}`},nodeId:e.nodeId}))],o=a.flatMap(e=>e.modules.map(e=>`import * as ${e.bindingName} from ${JSON.stringify(e.importSpecifier)};`));return[`// Generated by Ash. Do not edit by hand.`,``,...o,...o.length>0?[``]:[],`export const moduleMap = ${renderModuleMap(a)};`,``,`export default moduleMap;`,``].join(`
1
+ import{z}from"#compiled/zod/index.js";import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{normalizeEsmImportSpecifier}from"#internal/application/import-specifier.js";const compiledModuleNodeScopeSchema=z.object({modules:z.record(z.string(),z.object({}).passthrough())}).strict(),compiledModuleMapSchema=z.object({nodes:z.record(z.string(),compiledModuleNodeScopeSchema)}).strict();function createCompiledModuleMapSource(e){let n=dirnameFilesystemPath(e.moduleMapPath),r=e.importSpecifierStyle??`relative`,i=0,a=[collectModuleNodeScope({agentRoot:e.manifest.agentRoot,importSpecifierStyle:r,manifest:e.manifest,moduleMapDirectory:n,nextBindingName(){return`module_${i++}`},nodeId:ROOT_COMPILED_AGENT_NODE_ID}),...[...e.manifest.subagents].sort((e,t)=>e.nodeId.localeCompare(t.nodeId)).map(e=>collectModuleNodeScope({agentRoot:e.agent.agentRoot,importSpecifierStyle:r,manifest:e.agent,moduleMapDirectory:n,nextBindingName(){return`module_${i++}`},nodeId:e.nodeId}))],o=a.flatMap(e=>e.modules.map(e=>`import * as ${e.bindingName} from ${JSON.stringify(e.importSpecifier)};`));return[`// Generated by Ash. Do not edit by hand.`,``,...o,...o.length>0?[``]:[],`export const moduleMap = ${renderModuleMap(a)};`,``,`export default moduleMap;`,``].join(`
2
2
  `)}function collectModuleNodeScope(e){return{modules:collectModuleRefsForManifest(e.manifest).sort((e,t)=>e.sourceId.localeCompare(t.sourceId)).map(t=>({bindingName:e.nextBindingName(),importSpecifier:createImportSpecifier({fromDirectory:e.moduleMapDirectory,importSpecifierStyle:e.importSpecifierStyle,targetPath:joinFilesystemPath(e.agentRoot,t.logicalPath)}),sourceId:t.sourceId})),nodeId:e.nodeId}}function collectModuleRefsForManifest(e){let t=new Map;e.config.source!==void 0&&t.set(e.config.source.sourceId,e.config.source),e.config.model.source!==void 0&&t.set(e.config.model.source.sourceId,e.config.model.source);for(let n of e.channels)n.kind!==`disabled`&&t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.connections)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.tools)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.remoteAgents)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.hooks)t.set(n.sourceId,{exportName:n.exportName,sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});for(let n of e.schedules)n.sourceKind!==`module`||!n.hasRun||t.set(n.sourceId,{sourceKind:`module`,logicalPath:n.logicalPath,sourceId:n.sourceId});return e.sandbox!==null&&t.set(e.sandbox.sourceId,{exportName:e.sandbox.exportName,sourceKind:`module`,logicalPath:e.sandbox.logicalPath,sourceId:e.sandbox.sourceId}),[...t.values()]}function createImportSpecifier(e){if(e.importSpecifierStyle===`absolute`)return normalizeEsmImportSpecifier(normalizeFilesystemPath(e.targetPath));let t=relativeFilesystemPath(e.fromDirectory,e.targetPath);return t.startsWith(`.`)?t:`./${t}`}function renderModuleMap(e){return renderFrozenObject([{key:`nodes`,value:renderFrozenObject(e.map(e=>({key:e.nodeId,value:renderFrozenObject([{key:`modules`,value:renderFrozenObject(e.modules.map(e=>({key:e.sourceId,value:e.bindingName})))}],3)})))}],0)}function renderFrozenObject(e,t=1){if(e.length===0)return`Object.freeze({})`;let n=` `.repeat(t),r=` `.repeat(t+1);return[`Object.freeze({`,e.map(e=>`${r}${JSON.stringify(e.key)}: ${e.value.replaceAll(`
3
3
  `,`\n${r}`)}`).join(`,
4
4
  `),`${n}})`].join(`
@@ -1 +1 @@
1
- import{expectObjectRecord,expectOnlyKnownKeys,expectString}from"#internal/authored-module.js";import{ASH_CREATE_SESSION_ROUTE_PATH}from"#protocol/routes.js";import{createCompiledSubagentNodeId}from"#compiler/manifest.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{createPathDerivedSourceId}from"#discover/manifest.js";async function compileSubagentGraph(e){let t=[],n=[],r=[];for(let i of e.subagents){let a=await compileSubagentDefinition({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:e.parentNodeId,source:i});if(a.kind===`remote`){r.push(a.node);continue}t.push(a.node,...a.descendants.nodes),n.push({childNodeId:a.node.nodeId,parentNodeId:e.parentNodeId},...a.descendants.edges)}return{edges:n,nodes:t,remoteAgents:r}}async function compileSubagentDefinition(e){let t=e.source.manifest.configModule;if(t===void 0)throw Error(`Subagent "${e.source.logicalPath}" is missing an agent config module.`);let n=await loadModuleBackedDefinition({agentRoot:e.source.manifest.agentRoot,kind:`subagent config`,source:t});return readAgentDefinitionKind(n)===`remote`?{kind:`remote`,node:compileRemoteAgent({source:e.source,value:n})}:{kind:`local`,...await compileLocalSubagent(e)}}async function compileSubagent(e){let t=createCompiledSubagentNodeId(e.parentNodeId,e.source.sourceId),n=e.source.subagentId,r=await e.compileAgentNodeManifest({...e.source.manifest,appRoot:e.appRoot},e.context),a=r.config.description;if(!a)throw Error(`Local subagent "${e.source.logicalPath}" is missing a "description" field on its agent config. Add \`description\` to \`defineAgent({ ... })\` so the parent agent can decide when to delegate to this subagent.`);let o=await compileSubagentGraph({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:t,subagents:e.source.manifest.subagents});return{descendants:o,node:{agent:{...r,remoteAgents:[...o.remoteAgents]},description:a,entryPath:e.source.entryPath,logicalPath:e.source.logicalPath,name:n,nodeId:t,rootPath:e.source.rootPath,sourceId:e.source.sourceId,sourceKind:`module`}}}var compileLocalSubagent=compileSubagent;function compileRemoteAgent(e){let t=e.source.manifest.configModule;if(t===void 0)throw Error(`Remote agent "${e.source.logicalPath}" is missing a config module.`);assertRemoteAgentDefinitionHasNoLocalPackageEntries(e.source);let n=normalizeRemoteAgentDefinition(e.value,`Expected the remote agent config export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{...createRemoteAgentModuleSourceRef(e.source,t),description:n.description,entryPath:e.source.entryPath,name:e.source.subagentId,nodeId:e.source.sourceId,path:n.path,rootPath:e.source.rootPath,url:n.url}}function createRemoteAgentModuleSourceRef(e,t){let n=e.logicalPath===t.logicalPath?t.logicalPath:`${e.logicalPath}/${t.logicalPath}`,r={logicalPath:n,sourceId:createPathDerivedSourceId(n),sourceKind:`module`};return t.exportName!==void 0&&(r.exportName=t.exportName),r}function readAgentDefinitionKind(e){return typeof e!=`object`||!e?`local`:e.kind===`remote`?`remote`:`local`}function normalizeRemoteAgentDefinition(i,a){let o=expectObjectRecord(i,a);if(expectOnlyKnownKeys(o,[`auth`,`description`,`headers`,`kind`,`path`,`url`],a),o.kind!==`remote`)throw Error(`${a} Expected "kind" to be "remote".`);return{description:expectString(o.description,a),path:o.path===void 0?ASH_CREATE_SESSION_ROUTE_PATH:expectString(o.path,a),url:expectString(o.url,a)}}function assertRemoteAgentDefinitionHasNoLocalPackageEntries(e){let t=e.manifest,n=[t.connections.length>0?`connections/`:void 0,t.hooks.length>0?`hooks/`:void 0,t.instructions===void 0?void 0:`instructions`,t.lib.length>0?`lib/`:void 0,t.sandbox===null?void 0:`sandbox/`,t.sandboxWorkspaces.length>0?`sandbox/workspace/`:void 0,t.schedules.length>0?`schedules/`:void 0,t.skills.length>0?`skills/`:void 0,t.subagents.length>0?`subagents/`:void 0,t.tools.length>0?`tools/`:void 0].filter(e=>e!==void 0);if(n.length!==0)throw Error(`Remote subagent definition "${e.logicalPath}" cannot include local package entries. Remove unsupported entries: ${n.join(`, `)}.`)}export{compileSubagentGraph};
1
+ import{expectObjectRecord,expectOnlyKnownKeys,expectString}from"#internal/authored-module.js";import{ASH_CREATE_SESSION_ROUTE_PATH}from"#protocol/routes.js";import{createCompiledSubagentNodeId}from"#compiler/manifest.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";import{createPathDerivedSourceId}from"#discover/manifest.js";async function compileSubagentGraph(e){let t=[],n=[],r=[];for(let i of e.subagents){let a=await compileSubagentDefinition({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:e.parentNodeId,source:i});if(a.kind===`remote`){r.push(a.node);continue}t.push(a.node,...a.descendants.nodes),n.push({childNodeId:a.node.nodeId,parentNodeId:e.parentNodeId},...a.descendants.edges)}return{edges:n,nodes:t,remoteAgents:r}}async function compileSubagentDefinition(e){let t=e.source.manifest.configModule;if(t===void 0)throw Error(`Subagent "${e.source.logicalPath}" is missing an agent config module.`);let n=await loadModuleBackedDefinition({agentRoot:e.source.manifest.agentRoot,kind:`subagent config`,source:t});return readAgentDefinitionKind(n)===`remote`?{kind:`remote`,node:compileRemoteAgent({source:e.source,value:n})}:{kind:`local`,...await compileLocalSubagent(e)}}async function compileSubagent(e){let t=createCompiledSubagentNodeId(e.parentNodeId,e.source.sourceId),n=e.source.subagentId,r=await e.compileAgentNodeManifest({...e.source.manifest,appRoot:e.appRoot},e.context),a=r.config.description;if(!a)throw Error(`Local subagent "${e.source.logicalPath}" is missing a "description" field on its agent config. Add \`description\` to \`defineAgent({ ... })\` so the parent agent can decide when to delegate to this subagent.`);let o=await compileSubagentGraph({appRoot:e.appRoot,compileAgentNodeManifest:e.compileAgentNodeManifest,context:e.context,parentNodeId:t,subagents:e.source.manifest.subagents});return{descendants:o,node:{agent:{...r,remoteAgents:[...o.remoteAgents]},description:a,entryPath:e.source.entryPath,logicalPath:e.source.logicalPath,name:n,nodeId:t,rootPath:e.source.rootPath,sourceId:e.source.sourceId,sourceKind:`module`}}}const compileLocalSubagent=compileSubagent;function compileRemoteAgent(e){let t=e.source.manifest.configModule;if(t===void 0)throw Error(`Remote agent "${e.source.logicalPath}" is missing a config module.`);assertRemoteAgentDefinitionHasNoLocalPackageEntries(e.source);let n=normalizeRemoteAgentDefinition(e.value,`Expected the remote agent config export "${t.exportName??`default`}" from "${t.logicalPath}" to match the public Ash shape.`);return{...createRemoteAgentModuleSourceRef(e.source,t),description:n.description,entryPath:e.source.entryPath,name:e.source.subagentId,nodeId:e.source.sourceId,path:n.path,rootPath:e.source.rootPath,url:n.url}}function createRemoteAgentModuleSourceRef(e,t){let n=e.logicalPath===t.logicalPath?t.logicalPath:`${e.logicalPath}/${t.logicalPath}`,r={logicalPath:n,sourceId:createPathDerivedSourceId(n),sourceKind:`module`};return t.exportName!==void 0&&(r.exportName=t.exportName),r}function readAgentDefinitionKind(e){return typeof e!=`object`||!e?`local`:e.kind===`remote`?`remote`:`local`}function normalizeRemoteAgentDefinition(i,a){let o=expectObjectRecord(i,a);if(expectOnlyKnownKeys(o,[`auth`,`description`,`headers`,`kind`,`path`,`url`],a),o.kind!==`remote`)throw Error(`${a} Expected "kind" to be "remote".`);return{description:expectString(o.description,a),path:o.path===void 0?ASH_CREATE_SESSION_ROUTE_PATH:expectString(o.path,a),url:expectString(o.url,a)}}function assertRemoteAgentDefinitionHasNoLocalPackageEntries(e){let t=e.manifest,n=[t.connections.length>0?`connections/`:void 0,t.hooks.length>0?`hooks/`:void 0,t.instructions===void 0?void 0:`instructions`,t.lib.length>0?`lib/`:void 0,t.sandbox===null?void 0:`sandbox/`,t.sandboxWorkspaces.length>0?`sandbox/workspace/`:void 0,t.schedules.length>0?`schedules/`:void 0,t.skills.length>0?`skills/`:void 0,t.subagents.length>0?`subagents/`:void 0,t.tools.length>0?`tools/`:void 0].filter(e=>e!==void 0);if(n.length!==0)throw Error(`Remote subagent definition "${e.logicalPath}" cannot include local package entries. Remove unsupported entries: ${n.join(`, `)}.`)}export{compileSubagentGraph};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";var compiledRemoteAgentNodeSchema=z.object({description:z.string(),entryPath:z.string(),exportName:z.string().optional(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),path:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string()}).strict();export{compiledRemoteAgentNodeSchema};
1
+ import{z}from"#compiled/zod/index.js";const compiledRemoteAgentNodeSchema=z.object({description:z.string(),entryPath:z.string(),exportName:z.string().optional(),logicalPath:z.string(),name:z.string(),nodeId:z.string(),path:z.string(),rootPath:z.string(),sourceId:z.string(),sourceKind:z.literal(`module`),url:z.string()}).strict();export{compiledRemoteAgentNodeSchema};
@@ -1 +1 @@
1
- import{join}from"node:path";import{cp,mkdir,rm}from"node:fs/promises";import{normalizeLogicalPath}from"#discover/filesystem.js";import{ROOT_COMPILED_AGENT_NODE_ID,deriveResourceRootEntries}from"#compiler/manifest.js";import{normalizeSkillPackage,writeSkillPackageDirectory}from"#shared/skill-package.js";var RESOURCES_DIRECTORY=`workspace-resources`;async function materializeWorkspaceResources(t){let n=join(t.compileDirectoryPath,RESOURCES_DIRECTORY);await rm(n,{force:!0,recursive:!0});let i=await materializeNode({nodeId:ROOT_COMPILED_AGENT_NODE_ID,resourcesRoot:n,manifest:t.manifest}),a=await Promise.all(t.manifest.subagents.map(async e=>({...e,agent:await materializeNode({nodeId:e.nodeId,resourcesRoot:n,manifest:e.agent})})));return{...i,kind:t.manifest.kind,subagentEdges:t.manifest.subagentEdges,subagents:a,version:t.manifest.version}}function createResourceRoot(t,n){return{logicalPath:normalizeLogicalPath(join(RESOURCES_DIRECTORY,n)),rootEntries:deriveResourceRootEntries({sandboxWorkspaces:t.sandboxWorkspaces,skills:t.skills})}}async function materializeNode(r){for(let e of r.manifest.sandboxWorkspaces)if(e.rootEntries.some(e=>e===`skills/`||e===`skills`))throw Error(`Sandbox workspace "${e.logicalPath}" cannot define "skills" because Ash manages that workspace entry.`);let i=join(r.resourcesRoot,r.nodeId);await mkdir(i,{recursive:!0});for(let e of r.manifest.sandboxWorkspaces)await cp(e.sourcePath,i,{recursive:!0});for(let e of r.manifest.skills)await materializeSkill({nodeRoot:i,skill:e});return{...r.manifest,skills:r.manifest.skills.map(stripSkillPackageFiles),workspaceResourceRoot:createResourceRoot(r.manifest,r.nodeId)}}async function materializeSkill(n){let r=join(n.nodeRoot,`skills`,n.skill.name);if(n.skill.sourceKind===`skill-package`){await cp(n.skill.rootPath,r,{recursive:!0});return}await writeSkillPackageDirectory({rootPath:n.nodeRoot,skill:normalizeSkillPackage(n.skill)})}function stripSkillPackageFiles(e){let{files:t,...n}=e;return n}export{materializeWorkspaceResources};
1
+ import{join}from"node:path";import{cp,mkdir,rm}from"node:fs/promises";import{normalizeLogicalPath}from"#discover/filesystem.js";import{ROOT_COMPILED_AGENT_NODE_ID,deriveResourceRootEntries}from"#compiler/manifest.js";import{normalizeSkillPackage,writeSkillPackageDirectory}from"#shared/skill-package.js";const RESOURCES_DIRECTORY=`workspace-resources`;async function materializeWorkspaceResources(t){let n=join(t.compileDirectoryPath,RESOURCES_DIRECTORY);await rm(n,{force:!0,recursive:!0});let i=await materializeNode({nodeId:ROOT_COMPILED_AGENT_NODE_ID,resourcesRoot:n,manifest:t.manifest}),a=await Promise.all(t.manifest.subagents.map(async e=>({...e,agent:await materializeNode({nodeId:e.nodeId,resourcesRoot:n,manifest:e.agent})})));return{...i,kind:t.manifest.kind,subagentEdges:t.manifest.subagentEdges,subagents:a,version:t.manifest.version}}function createResourceRoot(t,n){return{logicalPath:normalizeLogicalPath(join(RESOURCES_DIRECTORY,n)),rootEntries:deriveResourceRootEntries({sandboxWorkspaces:t.sandboxWorkspaces,skills:t.skills})}}async function materializeNode(r){for(let e of r.manifest.sandboxWorkspaces)if(e.rootEntries.some(e=>e===`skills/`||e===`skills`))throw Error(`Sandbox workspace "${e.logicalPath}" cannot define "skills" because Ash manages that workspace entry.`);let i=join(r.resourcesRoot,r.nodeId);await mkdir(i,{recursive:!0});for(let e of r.manifest.sandboxWorkspaces)await cp(e.sourcePath,i,{recursive:!0});for(let e of r.manifest.skills)await materializeSkill({nodeRoot:i,skill:e});return{...r.manifest,skills:r.manifest.skills.map(stripSkillPackageFiles),workspaceResourceRoot:createResourceRoot(r.manifest,r.nodeId)}}async function materializeSkill(n){let r=join(n.nodeRoot,`skills`,n.skill.name);if(n.skill.sourceKind===`skill-package`){await cp(n.skill.rootPath,r,{recursive:!0});return}await writeSkillPackageDirectory({rootPath:n.nodeRoot,skill:normalizeSkillPackage(n.skill)})}function stripSkillPackageFiles(e){let{files:t,...n}=e;return n}export{materializeWorkspaceResources};
@@ -1 +1 @@
1
- import{createSandboxSkillHandle}from"#runtime/skills/sandbox-access.js";import{loadContext}from"#context/container.js";import{SandboxKey,SessionKey}from"#context/keys.js";function getSession(){return loadContext().require(SessionKey)}async function getSandbox(){let e=loadContext().get(SandboxKey);if(e===void 0)throw Error(`Ash sandbox runtime access is unavailable in the current async context. Call getSandbox() only from authored runtime functions such as tools, steps, and model callbacks.`);let n=await e.get();if(n===null)throw Error(`The sandbox is not available in the current authored runtime context.`);return n}function getContext(e){return loadContext().get(e)}function requireContext(e){return loadContext().require(e)}function hasContext(e){return loadContext().has(e)}function setContext(e,t){return loadContext().set(e,t)}function ensureContext(e,t){return loadContext().ensure(e,t)}function getSkill(n){let r=loadContext().get(SandboxKey);if(r===void 0)throw Error(`Ash sandbox runtime access is unavailable in the current async context. Call getSkill() only from authored runtime functions such as tools, steps, and model callbacks.`);return createSandboxSkillHandle(r,n)}export{ensureContext,getContext,getSandbox,getSession,getSkill,hasContext,requireContext,setContext};
1
+ import{SandboxKey,SessionKey}from"#context/keys.js";import{createSandboxSkillHandle}from"#runtime/skills/sandbox-access.js";import{loadContext}from"#context/container.js";function getSession(){return loadContext().require(SessionKey)}async function getSandbox(){let t=loadContext().get(SandboxKey);if(t===void 0)throw Error(`Ash sandbox runtime access is unavailable in the current async context. Call getSandbox() only from authored runtime functions such as tools, steps, and model callbacks.`);let n=await t.get();if(n===null)throw Error(`The sandbox is not available in the current authored runtime context.`);return n}function getContext(e){return loadContext().get(e)}function requireContext(e){return loadContext().require(e)}function hasContext(e){return loadContext().has(e)}function setContext(e,t){return loadContext().set(e,t)}function ensureContext(e,t){return loadContext().ensure(e,t)}function getSkill(t){let r=loadContext().get(SandboxKey);if(r===void 0)throw Error(`Ash sandbox runtime access is unavailable in the current async context. Call getSkill() only from authored runtime functions such as tools, steps, and model callbacks.`);return createSandboxSkillHandle(r,t)}export{ensureContext,getContext,getSandbox,getSession,getSkill,hasContext,requireContext,setContext};
@@ -1 +1 @@
1
- import{AsyncLocalStorage}from"node:async_hooks";import{resolveKey}from"#context/key.js";var ASH_CONTEXT_STORAGE_KEY=Symbol.for(`experimental-ash.context-storage`),ContextContainer=class{_durableValues=new Map;_virtualValues=new Map;get(e){return this._virtualValues.has(e.name)?this._virtualValues.get(e.name):this._durableValues.get(e.name)}require(e){if(!this.has(e))throw Error(`Context key "${e.name}" is not set.`);return this.get(e)}has(e){return this._virtualValues.has(e.name)||this._durableValues.has(e.name)}set(e,t){let n=typeof t==`function`?t(this.get(e)):t;return this._durableValues.set(e.name,n),n}ensure(e,t){return this.has(e)?this.require(e):this.set(e,t())}clearVirtualContext(){this._virtualValues.clear()}setVirtualContext(e,t){this._virtualValues.set(e.name,t)}*entries(){for(let[e,n]of this._durableValues){let r=resolveKey(e);r!==void 0&&(yield[r,n])}}},globalContextStorage=globalThis;globalContextStorage[ASH_CONTEXT_STORAGE_KEY]===void 0&&(globalContextStorage[ASH_CONTEXT_STORAGE_KEY]=new AsyncLocalStorage);var contextStorage=globalContextStorage[ASH_CONTEXT_STORAGE_KEY];function loadContext(){let e=contextStorage.getStore();if(e===void 0)throw Error(`No active Ash context. Call this function only from authored runtime code such as tools, steps, and model callbacks.`);return e}export{ContextContainer,contextStorage,loadContext};
1
+ import{AsyncLocalStorage}from"node:async_hooks";import{resolveKey}from"#context/key.js";const ASH_CONTEXT_STORAGE_KEY=Symbol.for(`experimental-ash.context-storage`);var ContextContainer=class{_durableValues=new Map;_virtualValues=new Map;get(e){return this._virtualValues.has(e.name)?this._virtualValues.get(e.name):this._durableValues.get(e.name)}require(e){if(!this.has(e))throw Error(`Context key "${e.name}" is not set.`);return this.get(e)}has(e){return this._virtualValues.has(e.name)||this._durableValues.has(e.name)}set(e,t){let n=typeof t==`function`?t(this.get(e)):t;return this._durableValues.set(e.name,n),n}ensure(e,t){return this.has(e)?this.require(e):this.set(e,t())}clearVirtualContext(){this._virtualValues.clear()}setVirtualContext(e,t){this._virtualValues.set(e.name,t)}*entries(){for(let[e,n]of this._durableValues){let r=resolveKey(e);r!==void 0&&(yield[r,n])}}};const globalContextStorage=globalThis;globalContextStorage[ASH_CONTEXT_STORAGE_KEY]===void 0&&(globalContextStorage[ASH_CONTEXT_STORAGE_KEY]=new AsyncLocalStorage);const contextStorage=globalContextStorage[ASH_CONTEXT_STORAGE_KEY];function loadContext(){let e=contextStorage.getStore();if(e===void 0)throw Error(`No active Ash context. Call this function only from authored runtime code such as tools, steps, and model callbacks.`);return e}export{ContextContainer,contextStorage,loadContext};
@@ -1,7 +1,7 @@
1
- import type { HarnessEmitFn, HarnessSession, StepInput, StepResult } from "../harness/types.js";
2
- import type { HandleMessageStreamEvent, RuntimeIdentity } from "../protocol/message.js";
1
+ import type { HarnessEmitFn, HarnessSession, StepInput, StepResult } from "#harness/types.js";
2
+ import type { HandleMessageStreamEvent, RuntimeIdentity } from "#protocol/message.js";
3
3
  import type { RunMode } from "#shared/run-mode.js";
4
- import type { RuntimeHookRegistry } from "../runtime/hooks/registry.js";
4
+ import type { RuntimeHookRegistry } from "#runtime/hooks/registry.js";
5
5
  import type { ContextContainer } from "./container.js";
6
6
  /**
7
7
  * Outcome of dispatching the per-turn hook lifecycle.
@@ -1 +1 @@
1
- import{getAdapterKind}from"../channel/adapter.js";import{emitRecoverableFailedTurn,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"../harness/emission.js";import{createLogger}from"../internal/logging.js";import{toErrorMessage}from"../shared/errors.js";import{normalizeSkillPackage,writeSkillPackageToSandbox}from"../shared/skill-package.js";import{BundleKey,ChannelKey,ContinuationTokenKey,SandboxKey,SessionIdKey,SessionPreparedKey}from"./keys.js";import{formatAvailableSkillsSection}from"#execution/skills/instructions.js";var log=createLogger(`hooks.lifecycle`);async function dispatchHookLifecycle(e){let{ctx:a,registry:o,emit:s}=e,c=getHarnessEmissionState(e.session),l=`turn_${c.sequence}`,u=c.sequence,d=buildHookContext(a),f={session:{sessionId:e.session.sessionId},turn:{sequence:u,turnId:l}},p=[],m=e.session;if(o.session.length>0&&a.get(SessionPreparedKey)!==!0){a.set(SessionPreparedKey,!0);let e=[];for(let t of o.session){let n=await t.handler(f,d);n?.modelContext!==void 0&&n.modelContext.length>0&&p.push(...n.modelContext),e.push(...normalizeLifecycleSkillResults(a,n))}m=await materializeLifecycleSkills(a,m,e)}let h=!1,g=c;try{let e=[];for(let t of o.turn){let n=await t.handler(f,d);n?.modelContext!==void 0&&n.modelContext.length>0&&p.push(...n.modelContext),e.push(...normalizeLifecycleSkillResults(a,n))}m=await materializeLifecycleSkills(a,m,e)}catch(r){let a=toErrorMessage(r);try{h||=(g=await emitTurnPreamble(s,{message:e.input.message},c,e.runtimeIdentity),!0);let r=await emitRecoverableFailedTurn(s,g,{code:`HOOK_TURN_FAILED`,message:a});return{kind:`turn-failed`,message:a,nextSession:setHarnessEmissionState(m,r)}}catch(e){throw log.error(`Event hook threw while emitting the turn.failed cascade for a lifecycle.turn failure — escalating to session.failed.`,{error:toErrorMessage(e)}),e}}let _=e.input.modelContext??[],v=_.length===0?p:[..._,...p];return{kind:`proceed`,input:v.length>0?{...e.input,modelContext:v}:e.input,nextSession:m}}function normalizeLifecycleSkillResults(e,t){if(t?.skills===void 0||t.skills.length===0)return[];let n=new Set(e.require(BundleKey).resolvedAgent.skills.map(e=>e.name)),r=new Map;for(let e of t.skills){let t=normalizeSkillPackage(e);if(n.has(t.name))throw Error(`Hook-contributed skill "${t.name}" conflicts with an authored skill.`);r.set(t.name,t)}return[...r.values()]}async function materializeLifecycleSkills(e,t,n){if(n.length===0)return t;let r=new Map(n.map(e=>[e.name,e])),i=await e.require(SandboxKey).get();if(i===null)throw Error(`Dynamic skills require a sandbox for the current agent.`);for(let e of r.values())await writeSkillPackageToSandbox({sandbox:i,skill:e});let a=formatAvailableSkillsSection([...r.values()]);return a===null?t:{...t,history:[...t.history,{role:`system`,content:a}]}}async function dispatchStreamEventHooks(e){let t=e.registry.streamEventsByType.get(e.event.type)??[],n=e.registry.streamEventsWildcard;if(t.length===0&&n.length===0)return;let r=buildHookContext(e.ctx);for(let n of t)await n.handler(e.event,r);for(let t of n)await t.handler(e.event,r)}function buildHookContext(t){let n=t.require(BundleKey),r=t.get(ChannelKey),i=t.get(ContinuationTokenKey),a=r===void 0?void 0:getAdapterKind(r);return{agent:{name:n.resolvedAgent.config.name??`agent`,nodeId:n.nodeId},channel:{kind:a,continuationToken:i},session:{sessionId:t.get(SessionIdKey)??``},ash:t}}async function runHookLifecycleStep(e,t){let n=await dispatchHookLifecycle(e);return n.kind===`turn-failed`?{next:e.mode===`conversation`?null:{done:!0,output:n.message},session:n.nextSession}:t(n.nextSession,n.input)}export{dispatchHookLifecycle,dispatchStreamEventHooks,runHookLifecycleStep};
1
+ import{ContinuationTokenKey,SandboxKey,SessionIdKey,SessionPreparedKey}from"./keys.js";import{createLogger}from"#internal/logging.js";import{toErrorMessage}from"#shared/errors.js";import{normalizeSkillPackage,writeSkillPackageToSandbox}from"#shared/skill-package.js";import{getAdapterKind}from"#channel/adapter.js";import{emitRecoverableFailedTurn,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{formatAvailableSkillsSection}from"#execution/skills/instructions.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";const log=createLogger(`hooks.lifecycle`);async function dispatchHookLifecycle(e){let{ctx:t,registry:n,emit:i}=e,o=getHarnessEmissionState(e.session),s=`turn_${o.sequence}`,c=o.sequence,l=buildHookContext(t),u={session:{sessionId:e.session.sessionId},turn:{sequence:c,turnId:s}},d=[],f=e.session;if(n.session.length>0&&t.get(SessionPreparedKey)!==!0){t.set(SessionPreparedKey,!0);let e=[];for(let r of n.session){let n=await r.handler(u,l);n?.modelContext!==void 0&&n.modelContext.length>0&&d.push(...n.modelContext),e.push(...normalizeLifecycleSkillResults(t,n))}f=await materializeLifecycleSkills(t,f,e)}let p=!1,m=o;try{let e=[];for(let r of n.turn){let n=await r.handler(u,l);n?.modelContext!==void 0&&n.modelContext.length>0&&d.push(...n.modelContext),e.push(...normalizeLifecycleSkillResults(t,n))}f=await materializeLifecycleSkills(t,f,e)}catch(t){let n=toErrorMessage(t);try{p||=(m=await emitTurnPreamble(i,{message:e.input.message},o,e.runtimeIdentity),!0);let t=await emitRecoverableFailedTurn(i,m,{code:`HOOK_TURN_FAILED`,message:n});return{kind:`turn-failed`,message:n,nextSession:setHarnessEmissionState(f,t)}}catch(e){throw log.error(`Event hook threw while emitting the turn.failed cascade for a lifecycle.turn failure — escalating to session.failed.`,{error:toErrorMessage(e)}),e}}let h=e.input.modelContext??[],g=h.length===0?d:[...h,...d];return{kind:`proceed`,input:g.length>0?{...e.input,modelContext:g}:e.input,nextSession:f}}function normalizeLifecycleSkillResults(e,t){if(t?.skills===void 0||t.skills.length===0)return[];let n=new Set(e.require(BundleKey).resolvedAgent.skills.map(e=>e.name)),r=new Map;for(let e of t.skills){let t=normalizeSkillPackage(e);if(n.has(t.name))throw Error(`Hook-contributed skill "${t.name}" conflicts with an authored skill.`);r.set(t.name,t)}return[...r.values()]}async function materializeLifecycleSkills(e,n,r){if(r.length===0)return n;let i=new Map(r.map(e=>[e.name,e])),a=await e.require(SandboxKey).get();if(a===null)throw Error(`Dynamic skills require a sandbox for the current agent.`);for(let e of i.values())await writeSkillPackageToSandbox({sandbox:a,skill:e});let o=formatAvailableSkillsSection([...i.values()]);return o===null?n:{...n,history:[...n.history,{role:`system`,content:o}]}}async function dispatchStreamEventHooks(e){let t=e.registry.streamEventsByType.get(e.event.type)??[],n=e.registry.streamEventsWildcard;if(t.length===0&&n.length===0)return;let r=buildHookContext(e.ctx);for(let n of t)await n.handler(e.event,r);for(let t of n)await t.handler(e.event,r)}function buildHookContext(t){let r=t.require(BundleKey),i=t.get(ChannelKey),a=t.get(ContinuationTokenKey),o=i===void 0?void 0:getAdapterKind(i);return{agent:{name:r.resolvedAgent.config.name??`agent`,nodeId:r.nodeId},channel:{kind:o,continuationToken:a},session:{sessionId:t.get(SessionIdKey)??``},ash:t}}async function runHookLifecycleStep(e,t){let n=await dispatchHookLifecycle(e);return n.kind===`turn-failed`?{next:e.mode===`conversation`?null:{done:!0,output:n.message},session:n.nextSession}:t(n.nextSession,n.input)}export{dispatchHookLifecycle,dispatchStreamEventHooks,runHookLifecycleStep};
@@ -1 +1 @@
1
- var KEY_REGISTRY_GLOBAL_KEY=Symbol.for(`experimental-ash.context-key-registry`),globalKeyRegistryContainer=globalThis;globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY]===void 0&&(globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY]=new Map);var keyRegistry=globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY],ContextKey=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,keyRegistry.set(e,this)}};function resolveKey(e){return keyRegistry.get(e)}export{ContextKey,resolveKey};
1
+ const KEY_REGISTRY_GLOBAL_KEY=Symbol.for(`experimental-ash.context-key-registry`),globalKeyRegistryContainer=globalThis;globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY]===void 0&&(globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY]=new Map);const keyRegistry=globalKeyRegistryContainer[KEY_REGISTRY_GLOBAL_KEY];var ContextKey=class{name;codec;constructor(e,t={}){this.name=e,this.codec=t.codec,keyRegistry.set(e,this)}};function resolveKey(e){return keyRegistry.get(e)}export{ContextKey,resolveKey};
@@ -1,10 +1,13 @@
1
- import type { ChannelAdapter } from "#channel/adapter.js";
2
- import type { SessionAuthContext, SessionParent, SessionTurn } from "#channel/types.js";
3
- import { getCompiledRuntimeAgentBundle } from "#runtime/sessions/compiled-agent-cache.js";
4
- import type { SandboxAccess } from "#sandbox/state.js";
1
+ /**
2
+ * Leaf context keys — no codec, no runtime imports. Safe to import from any
3
+ * tier. Codec-carrying keys (`ChannelKey`, `BundleKey`) live in
4
+ * `#runtime/sessions/runtime-context-keys.ts`.
5
+ */
6
+ import type { SessionAuthContext, SessionCallback, SessionCapabilities, SessionParent, SessionTurn } from "#channel/types.js";
5
7
  import { ContextKey } from "#context/key.js";
8
+ import type { SandboxAccess } from "#sandbox/state.js";
9
+ import type { RunMode } from "#shared/run-mode.js";
6
10
  export type { SessionAuthContext, SessionParent, SessionTurn } from "#channel/types.js";
7
- export { AuthKey, CapabilitiesKey, ContinuationTokenKey, InitiatorAuthKey, ModeKey, ParentSessionKey, SessionCallbackKey, SessionIdKey, SessionPreparedKey, } from "#context/seed-keys.js";
8
11
  /**
9
12
  * Auth metadata on the active session.
10
13
  *
@@ -25,12 +28,30 @@ export interface Session {
25
28
  readonly sessionId: string;
26
29
  readonly turn: SessionTurn;
27
30
  }
28
- export declare const ChannelKey: ContextKey<ChannelAdapter>;
31
+ export declare const AuthKey: ContextKey<SessionAuthContext | null>;
32
+ export declare const InitiatorAuthKey: ContextKey<SessionAuthContext | null>;
33
+ export declare const SessionIdKey: ContextKey<string>;
34
+ export declare const ContinuationTokenKey: ContextKey<string>;
35
+ export declare const ModeKey: ContextKey<RunMode>;
36
+ export declare const ParentSessionKey: ContextKey<SessionParent>;
37
+ /**
38
+ * Session-level capability flags (see {@link SessionCapabilities}). Set
39
+ * on root runs by channel routes and inherited pointwise by subagent
40
+ * dispatch so HITL readiness flows through a conversation chain.
41
+ */
42
+ export declare const CapabilitiesKey: ContextKey<SessionCapabilities>;
43
+ /**
44
+ * Optional framework-owned terminal callback metadata for this session.
45
+ */
46
+ export declare const SessionCallbackKey: ContextKey<SessionCallback>;
29
47
  /**
30
- * Bundle returned by the compiled-agent cache. Carries the resolved agent
31
- * graph, registries, and the active node's turn agent.
48
+ * Marker durable boolean set by the runtime **before** the
49
+ * `lifecycle.session` hook chain runs. The runtime checks this flag at
50
+ * the top of every turn so the chain never runs twice for the same
51
+ * session — including when one of the hooks throws. A thrown hook is
52
+ * a terminal session failure (`session.failed`); the next turn does
53
+ * not retry. See `research/active/hooks.md`.
32
54
  */
33
- export type CompiledBundle = Awaited<ReturnType<typeof getCompiledRuntimeAgentBundle>>;
34
- export declare const BundleKey: ContextKey<import("#runtime/sessions/compiled-agent-cache.js").CompiledRuntimeAgentBundle>;
55
+ export declare const SessionPreparedKey: ContextKey<boolean>;
35
56
  export declare const SessionKey: ContextKey<Session>;
36
57
  export declare const SandboxKey: ContextKey<SandboxAccess>;
@@ -1 +1 @@
1
- import{AuthKey,CapabilitiesKey,ContinuationTokenKey,InitiatorAuthKey,ModeKey,ParentSessionKey,SessionCallbackKey,SessionIdKey,SessionPreparedKey}from"#context/seed-keys.js";import{ContextKey}from"#context/key.js";import{getAdapterKind}from"#channel/adapter.js";import{deserializeRuntimeAdapter}from"#runtime/channels/registry.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";var ChannelKey=new ContextKey(`ash.channel`,{codec:{serialize(e){return{kind:getAdapterKind(e),state:e.state?{...e.state}:{}}},deserialize(e,t){let n=t.get(BundleKey);if(n===void 0)throw Error(`Cannot deserialize "ash.channel" before "ash.bundle". The runtime bundle must be present in context.`);return deserializeRuntimeAdapter(n.adapterRegistry,e)}}}),BundleKey=new ContextKey(`ash.bundle`,{codec:{serialize:e=>({nodeId:e.nodeId,source:e.compiledArtifactsSource}),deserialize:e=>{let{source:t,nodeId:n}=e;return getCompiledRuntimeAgentBundle({compiledArtifactsSource:t,nodeId:n})}}}),SessionKey=new ContextKey(`ash.session`),SandboxKey=new ContextKey(`ash.sandbox`);export{AuthKey,BundleKey,CapabilitiesKey,ChannelKey,ContinuationTokenKey,InitiatorAuthKey,ModeKey,ParentSessionKey,SandboxKey,SessionCallbackKey,SessionIdKey,SessionKey,SessionPreparedKey};
1
+ import{ContextKey}from"#context/key.js";const AuthKey=new ContextKey(`ash.auth`),InitiatorAuthKey=new ContextKey(`ash.initiatorAuth`),SessionIdKey=new ContextKey(`ash.sessionId`),ContinuationTokenKey=new ContextKey(`ash.continuationToken`),ModeKey=new ContextKey(`ash.mode`),ParentSessionKey=new ContextKey(`ash.parentSession`),CapabilitiesKey=new ContextKey(`ash.capabilities`),SessionCallbackKey=new ContextKey(`ash.sessionCallback`),SessionPreparedKey=new ContextKey(`ash.sessionPrepared`),SessionKey=new ContextKey(`ash.session`),SandboxKey=new ContextKey(`ash.sandbox`);export{AuthKey,CapabilitiesKey,ContinuationTokenKey,InitiatorAuthKey,ModeKey,ParentSessionKey,SandboxKey,SessionCallbackKey,SessionIdKey,SessionKey,SessionPreparedKey};
@@ -1 +1 @@
1
- import{BundleKey}from"#context/keys.js";function getActiveRuntimeNode(e){return e.require(BundleKey).graph.root}export{getActiveRuntimeNode};
1
+ import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";function getActiveRuntimeNode(e){return e.require(BundleKey).graph.root}export{getActiveRuntimeNode};
@@ -1 +1 @@
1
- import{BundleKey}from"#context/keys.js";import{ConnectionRegistryImpl}from"#runtime/connections/registry.js";import{ConnectionRegistryKey}from"#runtime/framework-tools/connection-search.js";import{getActiveRuntimeNode}from"#context/node.js";var connectionProvider={key:ConnectionRegistryKey,create(e,t){if(e.get(BundleKey)===void 0)return;let n=getActiveRuntimeNode(e).agent?.connections;if(!(!n||n.length===0))return{value:new ConnectionRegistryImpl(n)}}};export{connectionProvider};
1
+ import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{ConnectionRegistryImpl}from"#runtime/connections/registry.js";import{ConnectionRegistryKey}from"#runtime/framework-tools/connection-search.js";import{getActiveRuntimeNode}from"#context/node.js";const connectionProvider={key:ConnectionRegistryKey,create(e,t){if(e.get(BundleKey)===void 0)return;let n=getActiveRuntimeNode(e).agent?.connections;if(!(!n||n.length===0))return{value:new ConnectionRegistryImpl(n)}}};export{connectionProvider};
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{BundleKey,ChannelKey,SandboxKey,SessionIdKey}from"#context/keys.js";import{getAdapterKind}from"#channel/adapter.js";import{getActiveRuntimeNode}from"#context/node.js";import{ensureSandboxAccess}from"#execution/sandbox/ensure.js";var sandboxProvider={key:SandboxKey,async create(r,i){let a=r.get(BundleKey);if(a===void 0)return;let o=getActiveRuntimeNode(r),s=o.sandboxRegistry,c=r.require(SessionIdKey);return{value:await ensureSandboxAccess({compiledArtifactsSource:a.compiledArtifactsSource,nodeId:o.nodeId,registry:s,runOnSession:async t=>await contextStorage.run(r,t),sessionId:c,state:i.sandboxState??null,tags:{agent:resolveTagAgentName({bundle:a,node:o}),channel:resolveTagChannelKind(r.get(ChannelKey)),sessionId:c}})}},async commit(e,t){let n=await e.captureState();return{...t,sandboxState:n}}};function resolveTagAgentName(e){let t=e.node,n=e.bundle;return t.agent?.config?.name??n.resolvedAgent?.config?.name??t.nodeId??`unknown`}function resolveTagChannelKind(e){return e===void 0?`unknown`:getAdapterKind(e)}export{sandboxProvider};
1
+ import{SandboxKey,SessionIdKey}from"#context/keys.js";import{contextStorage}from"#context/container.js";import{getAdapterKind}from"#channel/adapter.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getActiveRuntimeNode}from"#context/node.js";import{ensureSandboxAccess}from"#execution/sandbox/ensure.js";const sandboxProvider={key:SandboxKey,async create(e,r){let i=e.get(BundleKey);if(i===void 0)return;let a=getActiveRuntimeNode(e),o=a.sandboxRegistry,s=e.require(SessionIdKey);return{value:await ensureSandboxAccess({compiledArtifactsSource:i.compiledArtifactsSource,nodeId:a.nodeId,registry:o,runOnSession:async t=>await contextStorage.run(e,t),sessionId:s,state:r.sandboxState??null,tags:{agent:resolveTagAgentName({bundle:i,node:a}),channel:resolveTagChannelKind(e.get(ChannelKey)),sessionId:s}})}},async commit(e,t){let n=await e.captureState();return{...t,sandboxState:n}}};function resolveTagAgentName(e){let t=e.node,n=e.bundle;return t.agent?.config?.name??n.resolvedAgent?.config?.name??t.nodeId??`unknown`}function resolveTagChannelKind(e){return e===void 0?`unknown`:getAdapterKind(e)}export{sandboxProvider};
@@ -1 +1 @@
1
- import{AuthKey,InitiatorAuthKey,ParentSessionKey,SessionIdKey,SessionKey}from"#context/keys.js";var sessionProvider={key:SessionKey,create(e){let t=e.require(AuthKey);return{value:Object.freeze({auth:{current:t,initiator:e.get(InitiatorAuthKey)??t},parent:e.get(ParentSessionKey),sessionId:e.require(SessionIdKey),turn:{id:`turn-${crypto.randomUUID()}`,sequence:0}})}}};export{sessionProvider};
1
+ import{AuthKey,InitiatorAuthKey,ParentSessionKey,SessionIdKey,SessionKey}from"#context/keys.js";const sessionProvider={key:SessionKey,create(e){let t=e.require(AuthKey);return{value:Object.freeze({auth:{current:t,initiator:e.get(InitiatorAuthKey)??t},parent:e.get(ParentSessionKey),sessionId:e.require(SessionIdKey),turn:{id:`turn-${crypto.randomUUID()}`,sequence:0}})}}};export{sessionProvider};
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{connectionProvider}from"#context/providers/connection.js";import{sandboxProvider}from"#context/providers/sandbox.js";import{sessionProvider}from"#context/providers/session.js";var frameworkProviders=[sessionProvider,connectionProvider,sandboxProvider];async function runStep(t,n,r){let i=n;t.clearVirtualContext();for(let e of frameworkProviders){let n=await e.create(t,i);n!==void 0&&(t.setVirtualContext(e.key,n.value),n.session!==void 0&&(i=n.session))}let a=await contextStorage.run(t,()=>r(i)),o=a.session;for(let e of frameworkProviders)e.commit&&t.has(e.key)&&(o=await e.commit(t.require(e.key),o));return o===a.session?a:{next:a.next,session:o}}export{runStep};
1
+ import{contextStorage}from"#context/container.js";import{connectionProvider}from"#context/providers/connection.js";import{sandboxProvider}from"#context/providers/sandbox.js";import{sessionProvider}from"#context/providers/session.js";const frameworkProviders=[sessionProvider,connectionProvider,sandboxProvider];async function runStep(t,n,r){let i=n;t.clearVirtualContext();for(let e of frameworkProviders){let n=await e.create(t,i);n!==void 0&&(t.setVirtualContext(e.key,n.value),n.session!==void 0&&(i=n.session))}let a=await contextStorage.run(t,()=>r(i)),o=a.session;for(let e of frameworkProviders)e.commit&&t.has(e.key)&&(o=await e.commit(t.require(e.key),o));return o===a.session?a:{next:a.next,session:o}}export{runStep};
@@ -1 +1 @@
1
- import{ContextContainer}from"#context/container.js";import{BundleKey}from"#context/keys.js";import{resolveKey}from"#context/key.js";function serializeContext(e){let t={};for(let[n,r]of e.entries())t[n.name]=n.codec?n.codec.serialize(r):r;return t}async function deserializeContext(r){let i=new ContextContainer,a=r[BundleKey.name];if(a!==void 0){let e=BundleKey.codec;if(e===void 0)throw Error(`Context key "ash.bundle" is missing a codec.`);i.set(BundleKey,await e.deserialize(a,i))}for(let[e,a]of Object.entries(r)){if(a===void 0||e===BundleKey.name)continue;let r=resolveKey(e);r!==void 0&&i.set(r,r.codec?await r.codec.deserialize(a,i):a)}return i}export{deserializeContext,serializeContext};
1
+ import{ContextContainer}from"#context/container.js";import{resolveKey}from"#context/key.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";function serializeContext(e){let t={};for(let[n,r]of e.entries())t[n.name]=n.codec?n.codec.serialize(r):r;return t}async function deserializeContext(r){let i=new ContextContainer,a=r[BundleKey.name];if(a!==void 0){let e=BundleKey.codec;if(e===void 0)throw Error(`Context key "ash.bundle" is missing a codec.`);i.set(BundleKey,await e.deserialize(a,i))}for(let[e,a]of Object.entries(r)){if(a===void 0||e===BundleKey.name)continue;let r=resolveKey(e);r!==void 0&&i.set(r,r.codec?await r.codec.deserialize(a,i):a)}return i}export{deserializeContext,serializeContext};
@@ -1 +1 @@
1
- import{join}from"node:path";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createConnectionSourceRef}from"#discover/manifest.js";import{DISCOVER_MODULE_SLOT_COLLISION,createConnectionNameDiagnostic,createModuleSlotCollisionDiagnostic,readSortedDirectoryEntries}from"#discover/grammar.js";import{collectNamedSlotCandidates}from"#discover/slots.js";var DISCOVER_CONNECTIONS_DIRECTORY_INVALID=`discover/connections-directory-invalid`,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION=`discover/connection-file-folder-collision`,DISCOVER_CONNECTION_FOLDER_EMPTY=`discover/connection-folder-empty`,CONNECTION_DEFINITION_BASE_NAME=`connection`;async function discoverConnectionSources(c){let l=`connections`,u=join(c.rootPath,l),d=c.rootEntries.find(e=>e.name===l);if(d===void 0)return{connections:[],diagnostics:[]};if(!d.isDirectory())return{connections:[],diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTIONS_DIRECTORY_INVALID,message:`Expected "${u}" to be a directory of authored connections.`,sourcePath:u})]};let f=await readSortedDirectoryEntries(c.source,u),p=[],m=[],h=new Set;for(let t of collectNamedSlotCandidates(f,{allowMarkdown:!1,allowModules:!0})){let r=normalizeLogicalPath(join(l,t.slotName));if(t.moduleFileNames.length>1){h.add(t.slotName),m.push(createModuleSlotCollisionDiagnostic(u,r,t.moduleFileNames));continue}let[a]=t.moduleFileNames;if(a===void 0)continue;h.add(t.slotName);let o=createConnectionNameDiagnostic(t.slotName,join(u,a));if(o!==null){m.push(o);continue}p.push(createConnectionSourceRef({connectionName:t.slotName,logicalPath:join(l,a)}))}for(let i of f){if(!i.isDirectory())continue;let o=i.name,s=join(u,o);if(h.has(o)){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,message:`Connection "${o}" is defined twice. Found both file-form "connections/${o}.ts" and folder-form "connections/${o}/". Use one form, not both.`,sourcePath:s}));let e=p.findIndex(e=>e.connectionName===o);e!==-1&&p.splice(e,1);continue}let d=createConnectionNameDiagnostic(o,s);if(d!==null){m.push(d);continue}let f=collectFolderConnectionModuleCandidates(await readSortedDirectoryEntries(c.source,s));if(f.length>1){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple connection definition modules inside "${normalizeLogicalPath(join(l,o))}": `+f.map(e=>`"${e}"`).join(`, `),sourcePath:s}));continue}let[g]=f;if(g===void 0){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FOLDER_EMPTY,message:`Connection folder "connections/${o}/" contains no "connection.ts" definition. Add "connections/${o}/connection.ts" or use the file form "connections/${o}.ts".`,sourcePath:s}));continue}p.push(createConnectionSourceRef({connectionName:o,logicalPath:join(l,o,g)}))}return{connections:p,diagnostics:m}}function collectFolderConnectionModuleCandidates(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of collectNamedSlotCandidates(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===CONNECTION_DEFINITION_BASE_NAME&&n.push(...e.moduleFileNames);return n}export{DISCOVER_CONNECTIONS_DIRECTORY_INVALID,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,DISCOVER_CONNECTION_FOLDER_EMPTY,discoverConnectionSources};
1
+ import{join}from"node:path";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{createConnectionSourceRef}from"#discover/manifest.js";import{DISCOVER_MODULE_SLOT_COLLISION,createConnectionNameDiagnostic,createModuleSlotCollisionDiagnostic,readSortedDirectoryEntries}from"#discover/grammar.js";import{collectNamedSlotCandidates}from"#discover/slots.js";const DISCOVER_CONNECTIONS_DIRECTORY_INVALID=`discover/connections-directory-invalid`,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION=`discover/connection-file-folder-collision`,DISCOVER_CONNECTION_FOLDER_EMPTY=`discover/connection-folder-empty`;async function discoverConnectionSources(c){let l=`connections`,u=join(c.rootPath,l),d=c.rootEntries.find(e=>e.name===l);if(d===void 0)return{connections:[],diagnostics:[]};if(!d.isDirectory())return{connections:[],diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTIONS_DIRECTORY_INVALID,message:`Expected "${u}" to be a directory of authored connections.`,sourcePath:u})]};let f=await readSortedDirectoryEntries(c.source,u),p=[],m=[],h=new Set;for(let t of collectNamedSlotCandidates(f,{allowMarkdown:!1,allowModules:!0})){let r=normalizeLogicalPath(join(l,t.slotName));if(t.moduleFileNames.length>1){h.add(t.slotName),m.push(createModuleSlotCollisionDiagnostic(u,r,t.moduleFileNames));continue}let[a]=t.moduleFileNames;if(a===void 0)continue;h.add(t.slotName);let o=createConnectionNameDiagnostic(t.slotName,join(u,a));if(o!==null){m.push(o);continue}p.push(createConnectionSourceRef({connectionName:t.slotName,logicalPath:join(l,a)}))}for(let i of f){if(!i.isDirectory())continue;let o=i.name,s=join(u,o);if(h.has(o)){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,message:`Connection "${o}" is defined twice. Found both file-form "connections/${o}.ts" and folder-form "connections/${o}/". Use one form, not both.`,sourcePath:s}));let e=p.findIndex(e=>e.connectionName===o);e!==-1&&p.splice(e,1);continue}let d=createConnectionNameDiagnostic(o,s);if(d!==null){m.push(d);continue}let f=collectFolderConnectionModuleCandidates(await readSortedDirectoryEntries(c.source,s));if(f.length>1){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_MODULE_SLOT_COLLISION,message:`Found multiple connection definition modules inside "${normalizeLogicalPath(join(l,o))}": `+f.map(e=>`"${e}"`).join(`, `),sourcePath:s}));continue}let[g]=f;if(g===void 0){m.push(createDiscoverErrorDiagnostic({code:DISCOVER_CONNECTION_FOLDER_EMPTY,message:`Connection folder "connections/${o}/" contains no "connection.ts" definition. Add "connections/${o}/connection.ts" or use the file form "connections/${o}.ts".`,sourcePath:s}));continue}p.push(createConnectionSourceRef({connectionName:o,logicalPath:join(l,o,g)}))}return{connections:p,diagnostics:m}}function collectFolderConnectionModuleCandidates(e){let t=e.filter(e=>e.isFile()),n=[];for(let e of collectNamedSlotCandidates(t,{allowMarkdown:!1,allowModules:!0}))e.slotName===`connection`&&n.push(...e.moduleFileNames);return n}export{DISCOVER_CONNECTIONS_DIRECTORY_INVALID,DISCOVER_CONNECTION_FILE_FOLDER_COLLISION,DISCOVER_CONNECTION_FOLDER_EMPTY,discoverConnectionSources};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";var discoverDiagnosticSeveritySchema=z.union([z.literal(`error`),z.literal(`warning`)]),discoverDiagnosticSchema=z.object({code:z.string(),message:z.string(),severity:discoverDiagnosticSeveritySchema,sourcePath:z.string()}).strict(),discoverDiagnosticsSummarySchema=z.object({errors:z.number().finite(),warnings:z.number().finite()}).strict(),DISCOVER_PROJECT_NOT_FOUND=`discover/project-not-found`;function createDiscoverErrorDiagnostic(e){return{...e,severity:`error`}}function createDiscoverWarningDiagnostic(e){return{...e,severity:`warning`}}function summarizeDiscoverDiagnostics(e){return e.reduce((e,t)=>(t.severity===`error`?e.errors+=1:e.warnings+=1,e),{errors:0,warnings:0})}function hasDiscoverErrors(e){return e.some(e=>e.severity===`error`)}export{DISCOVER_PROJECT_NOT_FOUND,createDiscoverErrorDiagnostic,createDiscoverWarningDiagnostic,discoverDiagnosticSchema,discoverDiagnosticSeveritySchema,discoverDiagnosticsSummarySchema,hasDiscoverErrors,summarizeDiscoverDiagnostics};
1
+ import{z}from"#compiled/zod/index.js";const discoverDiagnosticSeveritySchema=z.union([z.literal(`error`),z.literal(`warning`)]),discoverDiagnosticSchema=z.object({code:z.string(),message:z.string(),severity:discoverDiagnosticSeveritySchema,sourcePath:z.string()}).strict(),discoverDiagnosticsSummarySchema=z.object({errors:z.number().finite(),warnings:z.number().finite()}).strict(),DISCOVER_PROJECT_NOT_FOUND=`discover/project-not-found`;function createDiscoverErrorDiagnostic(e){return{...e,severity:`error`}}function createDiscoverWarningDiagnostic(e){return{...e,severity:`warning`}}function summarizeDiscoverDiagnostics(e){return e.reduce((e,t)=>(t.severity===`error`?e.errors+=1:e.warnings+=1,e),{errors:0,warnings:0})}function hasDiscoverErrors(e){return e.some(e=>e.severity===`error`)}export{DISCOVER_PROJECT_NOT_FOUND,createDiscoverErrorDiagnostic,createDiscoverWarningDiagnostic,discoverDiagnosticSchema,discoverDiagnosticSeveritySchema,discoverDiagnosticsSummarySchema,hasDiscoverErrors,summarizeDiscoverDiagnostics};