eve 0.45.0 → 0.45.2

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 (141) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/src/chunks/{use-eve-agent-OtHRoxIS.js → use-eve-agent-BH7Z6SDu.js} +13 -1
  3. package/dist/src/chunks/{use-eve-agent-C46Kan_I.js → use-eve-agent-DI2j5XK8.js} +13 -1
  4. package/dist/src/cli/commands/integration-connect.d.ts +2 -0
  5. package/dist/src/cli/commands/integration-connect.js +1 -1
  6. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  7. package/dist/src/client/agent-info-schema.d.ts +191 -2
  8. package/dist/src/client/agent-info-schema.js +1 -1
  9. package/dist/src/client/types.d.ts +1 -1
  10. package/dist/src/compiled/.vendor-stamp.json +2 -1
  11. package/dist/src/compiled/@vercel/blob/client.d.ts +487 -0
  12. package/dist/src/compiled/@vercel/blob/create-folder-BM6BTlko.d.ts +471 -0
  13. package/dist/src/compiled/@vercel/blob/index.d.ts +573 -0
  14. package/dist/src/compiled/@vercel/blob/index.js +43 -0
  15. package/dist/src/compiled/@vercel/blob/license.md +201 -0
  16. package/dist/src/compiler/extension-compatibility.d.ts +4 -4
  17. package/dist/src/compiler/extension-compatibility.js +1 -1
  18. package/dist/src/compiler/load-binding-namespace.js +1 -1
  19. package/dist/src/compiler/manifest.d.ts +10 -0
  20. package/dist/src/compiler/manifest.js +1 -1
  21. package/dist/src/compiler/model-catalog.d.ts +1 -1
  22. package/dist/src/compiler/model-catalog.js +1 -1
  23. package/dist/src/compiler/module-map.js +1 -1
  24. package/dist/src/compiler/normalize-helpers.d.ts +2 -1
  25. package/dist/src/compiler/normalize-manifest.js +1 -1
  26. package/dist/src/compiler/normalize-memory.d.ts +5 -0
  27. package/dist/src/compiler/normalize-memory.js +1 -0
  28. package/dist/src/compiler/normalize-tool.js +1 -1
  29. package/dist/src/compiler/project-sources.d.ts +3 -4
  30. package/dist/src/compiler/project-sources.js +1 -1
  31. package/dist/src/compiler/source-graph.d.ts +2 -0
  32. package/dist/src/compiler/source-graph.js +1 -1
  33. package/dist/src/compiler/validate-artifact.js +1 -1
  34. package/dist/src/context/dynamic-tool-lifecycle.d.ts +8 -1
  35. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  36. package/dist/src/context/keys.d.ts +25 -0
  37. package/dist/src/context/keys.js +1 -1
  38. package/dist/src/context/memory-event-lifecycle.d.ts +13 -0
  39. package/dist/src/context/memory-event-lifecycle.js +1 -0
  40. package/dist/src/context/memory-lifecycle.d.ts +52 -0
  41. package/dist/src/context/memory-lifecycle.js +1 -0
  42. package/dist/src/context/memory-tools.d.ts +12 -0
  43. package/dist/src/context/memory-tools.js +1 -0
  44. package/dist/src/discover/discover-agent.js +1 -1
  45. package/dist/src/discover/discover-subagent.js +1 -1
  46. package/dist/src/discover/extensions.d.ts +6 -0
  47. package/dist/src/discover/extensions.js +1 -1
  48. package/dist/src/discover/filesystem.d.ts +2 -2
  49. package/dist/src/discover/filesystem.js +1 -1
  50. package/dist/src/discover/manifest.d.ts +6 -1
  51. package/dist/src/discover/manifest.js +1 -1
  52. package/dist/src/discover/memory.d.ts +14 -0
  53. package/dist/src/discover/memory.js +1 -0
  54. package/dist/src/discover/project.js +1 -1
  55. package/dist/src/evals/cli/eval.js +1 -1
  56. package/dist/src/evals/target.js +1 -1
  57. package/dist/src/execution/history-view.d.ts +2 -2
  58. package/dist/src/execution/history-view.js +1 -1
  59. package/dist/src/execution/tools/connection-search.js +2 -2
  60. package/dist/src/execution/workflow-steps.d.ts +1 -3
  61. package/dist/src/execution/workflow-steps.js +1 -1
  62. package/dist/src/framework/sources/modules/memory-wrapper.d.ts +2 -0
  63. package/dist/src/framework/sources/modules/memory-wrapper.js +1 -0
  64. package/dist/src/framework/sources/registry.d.ts +1 -0
  65. package/dist/src/framework/sources/registry.js +1 -1
  66. package/dist/src/harness/emission.d.ts +1 -1
  67. package/dist/src/harness/emission.js +1 -1
  68. package/dist/src/harness/hitl/approval-prompt.d.ts +2 -0
  69. package/dist/src/harness/hitl/approval-prompt.js +3 -2
  70. package/dist/src/harness/tool-loop.js +2 -2
  71. package/dist/src/harness/tools.js +1 -1
  72. package/dist/src/internal/application/compiled-artifacts.js +4 -2
  73. package/dist/src/internal/application/package.js +1 -1
  74. package/dist/src/internal/authored-definition/memory.d.ts +2 -0
  75. package/dist/src/internal/authored-definition/memory.js +1 -0
  76. package/dist/src/internal/authored-definition/schema-backed.d.ts +1 -0
  77. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  78. package/dist/src/internal/authored-module-map-loader.js +1 -1
  79. package/dist/src/internal/dynamic-tool-rebind.d.ts +3 -0
  80. package/dist/src/internal/dynamic-tool-rebind.js +1 -0
  81. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +1 -1
  82. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  83. package/dist/src/internal/nitro/routes/index.js +1 -0
  84. package/dist/src/internal/programmatic-source-loader.d.ts +1 -0
  85. package/dist/src/internal/programmatic-source-loader.js +1 -1
  86. package/dist/src/internal/workflow/development-world-server.js +1 -1
  87. package/dist/src/internal/workflow/local-world-delivery-timeouts.d.ts +7 -0
  88. package/dist/src/internal/workflow/local-world-delivery-timeouts.js +1 -0
  89. package/dist/src/public/memory/file/backend.d.ts +37 -0
  90. package/dist/src/public/memory/file/backend.js +1 -0
  91. package/dist/src/public/memory/file/backends/default.d.ts +7 -0
  92. package/dist/src/public/memory/file/backends/default.js +1 -0
  93. package/dist/src/public/memory/file/backends/in-memory.d.ts +6 -0
  94. package/dist/src/public/memory/file/backends/in-memory.js +1 -0
  95. package/dist/src/public/memory/file/backends/lazy.d.ts +3 -0
  96. package/dist/src/public/memory/file/backends/lazy.js +1 -0
  97. package/dist/src/public/memory/file/backends/vercel-blob.d.ts +14 -0
  98. package/dist/src/public/memory/file/backends/vercel-blob.js +1 -0
  99. package/dist/src/public/memory/file/index.d.ts +3 -0
  100. package/dist/src/public/memory/file/index.js +1 -0
  101. package/dist/src/public/memory/file/provider.d.ts +14 -0
  102. package/dist/src/public/memory/file/provider.js +6 -0
  103. package/dist/src/public/memory/file/vercel.d.ts +1 -0
  104. package/dist/src/public/memory/file/vercel.js +1 -0
  105. package/dist/src/public/memory/index.d.ts +117 -0
  106. package/dist/src/public/memory/index.js +1 -0
  107. package/dist/src/public/memory/scope.d.ts +2 -0
  108. package/dist/src/public/memory/scope.js +1 -0
  109. package/dist/src/runtime/resolve-agent.js +1 -1
  110. package/dist/src/runtime/resolve-dynamic-tool.d.ts +1 -0
  111. package/dist/src/runtime/resolve-dynamic-tool.js +1 -1
  112. package/dist/src/runtime/resolve-memory.d.ts +4 -0
  113. package/dist/src/runtime/resolve-memory.js +1 -0
  114. package/dist/src/runtime/types.d.ts +7 -0
  115. package/dist/src/setup/connection-connector.d.ts +2 -0
  116. package/dist/src/setup/connection-connector.js +1 -1
  117. package/dist/src/setup/integrations/linq/connect.js +1 -1
  118. package/dist/src/setup/scaffold/create/project.js +1 -1
  119. package/dist/src/setup/scaffold/create/web-template.d.ts +2 -0
  120. package/dist/src/setup/scaffold/create/web-template.js +28 -0
  121. package/dist/src/shared/memory-definition.d.ts +2 -0
  122. package/dist/src/shared/memory-definition.js +1 -0
  123. package/dist/src/shared/memory-state.d.ts +55 -0
  124. package/dist/src/shared/memory-state.js +1 -0
  125. package/dist/src/svelte/index.js +1 -1
  126. package/dist/src/svelte/use-eve-agent.js +1 -1
  127. package/dist/src/vue/index.js +1 -1
  128. package/dist/src/vue/use-eve-agent.js +1 -1
  129. package/docs/channels/eve.mdx +1 -1
  130. package/docs/concepts/context-control.md +7 -0
  131. package/docs/concepts/default-harness.md +8 -0
  132. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  133. package/docs/concepts/state.md +8 -1
  134. package/docs/extensions.md +6 -2
  135. package/docs/guides/client/overview.mdx +2 -2
  136. package/docs/guides/dynamic-capabilities.md +3 -2
  137. package/docs/memory.md +320 -0
  138. package/docs/meta.json +1 -0
  139. package/docs/patterns/multi-tenant-memory.md +108 -136
  140. package/docs/reference/typescript-api.md +5 -0
  141. package/package.json +22 -1
@@ -1 +1 @@
1
- import{join}from"node:path";import{stripLogicalPathExtension}from"#discover/filesystem.js";import{canonicalSourceSlot}from"#compiler/source-graph.js";const MODULE_KIND_BY_SLOT_ROOT={agent:`config`,channels:`channel`,extensions:`extension`,hooks:`hook`,instructions:`instructions`,instrumentation:`instrumentation`,sandbox:`sandbox`,schedules:`schedule`,skills:`skill`,tools:`tool`};function projectAgentSources(e){let t=e.owner??{kind:`application`},n=[],r=[],i=[];projectManifest({externalDependencies:e.externalDependencies,candidates:n,extensionScope:e.extensionScope,layer:e.layer??`application`,manifest:e.manifest,nodeId:e.nodeId,owner:t,resources:r,subagents:i});for(let t of[...e.manifest.resolvedExtensions].sort((e,t)=>e.namespace.localeCompare(t.namespace))){let a={kind:`extension`,namespace:t.namespace,packageName:t.packageName};projectManifest({externalDependencies:mergeDependencies(e.externalDependencies,t.externalDependencies),candidates:n,extension:t,layer:`extension-package`,manifest:t.manifest,nodeId:e.nodeId,owner:a,resources:r,sourceIdPrefix:`ext:${t.namespace}:`,subagents:i}),t.overrides!==void 0&&projectManifest({externalDependencies:e.externalDependencies,candidates:n,extension:t,layer:`extension-override`,manifest:t.overrides,nodeId:e.nodeId,owner:{kind:`application`},resources:r,sourceIdPrefix:`ext-override:${t.namespace}:`,subagents:i})}return{candidates:n,resources:r,subagents:i}}function projectSelectedSources(e){let t=new Map(e.resources.map(e=>[e.candidate.sourceId,e])),n=[];for(let r of e.candidates)if(isModuleCandidate(r))n.push(projectModuleCandidate(r));else{let e=t.get(r.sourceId);e!==void 0&&n.push(e)}return n}function createFilesystemModuleCandidate(t){return{backing:{externalDependencies:[...t.externalDependencies],...t.owner.kind===`extension`&&(t.extension!==void 0||t.extensionScope!==void 0)?{extensionScope:{namespace:t.extension?.namespace??t.extensionScope.namespace,sourceRoot:t.extension?.sourceRoot??t.extensionScope.sourceRoot}}:{},kind:`filesystem`,sourcePath:join(t.sourceRoot,t.source.logicalPath)},exportName:t.source.exportName,form:`direct`,layer:t.layer,logicalPath:t.logicalPath,nodeId:t.nodeId,owner:t.owner,sourceId:t.sourceId??t.source.sourceId}}function projectManifest(t){let qualify=e=>t.extension===void 0?e:qualifyExtensionLogicalPath(e,t.extension.namespace),sourceId=e=>`${t.sourceIdPrefix??``}${e}`,pushModule=(e,n)=>{let r=n??qualify(e.logicalPath),i=createFilesystemModuleCandidate({externalDependencies:t.externalDependencies,extension:t.extension,extensionScope:t.extensionScope,layer:t.layer,logicalPath:r,nodeId:t.nodeId,owner:t.owner,source:e,sourceId:sourceId(e.sourceId),sourceRoot:t.manifest.agentRoot});t.candidates.push(i)},pushResource=(n,r)=>{let i=qualify(r.logicalPath),a={...r,...r.sourceKind===`skill-package`?{name:t.extension===void 0?r.name:`${t.extension.namespace}__${r.name}`}:{},logicalPath:i,sourceId:sourceId(r.sourceId)},o={backing:{kind:`resource`,sourcePath:r.sourceKind===`skill-package`?r.skillFilePath:join(t.manifest.agentRoot,r.logicalPath)},form:`direct`,layer:t.layer,logicalPath:i,nodeId:t.nodeId,owner:t.owner,sourceId:a.sourceId};t.candidates.push(o),t.resources.push({candidate:o,kind:n,source:a})};if(t.extension===void 0&&t.manifest.configModule!==void 0){let e=t.manifest.configModule.logicalPath;pushModule(t.manifest.configModule,canonicalSourceSlot(e)===`agent`?void 0:`agent.ts`)}if(t.manifest.instrumentation!==void 0&&pushModule(t.manifest.instrumentation),t.extension===void 0)for(let e of t.manifest.extensions)pushModule(e);for(let e of t.manifest.channels)pushModule(e);for(let e of t.manifest.connections)pushModule(e);for(let e of t.manifest.hooks)pushModule(e);t.manifest.sandbox!==null&&pushModule(t.manifest.sandbox);for(let e of t.manifest.tools)pushModule(e);for(let e of t.manifest.instructions)e.sourceKind===`module`?pushModule(e):pushResource(`instructions`,e);for(let e of t.manifest.schedules)e.sourceKind===`module`?pushModule(e):pushResource(`schedule`,e);for(let e of t.manifest.skills)e.sourceKind===`module`?pushModule(e):pushResource(`skill`,e);for(let e of t.manifest.subagents){let n=t.extension===void 0?e.subagentId:`${t.extension.namespace}__${e.subagentId}`,r=t.extension===void 0?e.logicalPath:qualifyExtensionLogicalPath(e.logicalPath,t.extension.namespace),i={...e,logicalPath:r,sourceId:sourceId(e.sourceId),subagentId:n},a={backing:{kind:`resource`,sourcePath:e.entryPath},form:`direct`,layer:t.layer,logicalPath:r,nodeId:t.nodeId,owner:t.owner,sourceId:i.sourceId};t.candidates.push(a),t.subagents.push({candidate:a,...t.extension===void 0&&t.extensionScope===void 0?{}:{extensionScope:t.extension===void 0?t.extensionScope:{namespace:t.extension.namespace,sourceRoot:t.extension.sourceRoot}},owner:t.owner,source:i})}}function projectModuleCandidate(e){let t={exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`},i=canonicalSourceSlot(e.logicalPath);if(i.startsWith(`connections/`))return{candidate:e,kind:`connection`,source:{...t,connectionName:deriveConnectionName(e.logicalPath)}};let a=MODULE_KIND_BY_SLOT_ROOT[i.split(`/`,1)[0]];if(a===void 0)throw Error(`Agent module source slot "${e.logicalPath}" is not compiled yet.`);return{candidate:e,kind:a,source:t}}function isModuleCandidate(e){return e.backing.kind!==`resource`}function qualifyExtensionLogicalPath(e,t){let n=e.split(`/`);if(n.length<2)return e;let r=n[0];return r===`sandbox`||r===`extensions`||r===`lib`?e:(n[1]=`${t}__${n[1]}`,n.join(`/`))}function deriveConnectionName(e){let n=stripLogicalPathExtension(e).replace(/^connections\//,``);return n.endsWith(`/connection`)?n.slice(0,-11):n}function mergeDependencies(...e){return[...new Set(e.flat())]}export{createFilesystemModuleCandidate,projectAgentSources,projectSelectedSources,qualifyExtensionLogicalPath};
1
+ import{join}from"node:path";import{stripLogicalPathExtension}from"#discover/filesystem.js";import{canonicalSourceSlot}from"#compiler/source-graph.js";const MODULE_KIND_BY_SLOT_ROOT={agent:`config`,channels:`channel`,extensions:`extension`,hooks:`hook`,instructions:`instructions`,instrumentation:`instrumentation`,memory:`memory`,sandbox:`sandbox`,schedules:`schedule`,skills:`skill`,tools:`tool`};function projectAgentSources(e){let t=e.owner??{kind:`application`},n=[],r=[],i=[];projectManifest({externalDependencies:e.externalDependencies,candidates:n,projection:createApplicationManifestSourceProjection(e.extensionScope),layer:e.layer??`application`,manifest:e.manifest,nodeId:e.nodeId,owner:t,resources:r,subagents:i});for(let t of[...e.manifest.resolvedExtensions].sort((e,t)=>e.namespace.localeCompare(t.namespace))){let a=createExtensionManifestSourceProjection(t),o={kind:`extension`,namespace:t.namespace,packageName:t.packageName};projectManifest({externalDependencies:mergeDependencies(e.externalDependencies,t.externalDependencies),candidates:n,projection:a,layer:`extension-package`,manifest:t.manifest,nodeId:e.nodeId,owner:o,resources:r,sourceIdPrefix:`ext:${t.namespace}:`,subagents:i}),t.overrides!==void 0&&projectManifest({externalDependencies:e.externalDependencies,candidates:n,projection:a,layer:`extension-override`,manifest:t.overrides,nodeId:e.nodeId,owner:{kind:`application`},resources:r,sourceIdPrefix:`ext-override:${t.namespace}:`,subagents:i})}return{candidates:n,resources:r,subagents:i}}function projectSelectedSources(e){let t=new Map(e.resources.map(e=>[e.candidate.sourceId,e])),n=[];for(let r of e.candidates)if(isModuleCandidate(r))n.push(projectModuleCandidate(r));else{let e=t.get(r.sourceId);e!==void 0&&n.push(e)}return n}function createFilesystemModuleCandidate(t){return{backing:{externalDependencies:[...t.externalDependencies],...t.owner.kind===`extension`&&t.extensionScope!==void 0?{extensionScope:t.extensionScope}:{},kind:`filesystem`,sourcePath:join(t.sourceRoot,t.source.logicalPath)},exportName:t.source.exportName,form:`direct`,layer:t.layer,logicalPath:t.logicalPath,nodeId:t.nodeId,owner:t.owner,sourceId:t.sourceId??t.source.sourceId}}function createApplicationManifestSourceProjection(e){let t={logicalPath:e=>e,name:e=>e};return e!==void 0&&(t.extensionScope=e),t}function createExtensionManifestSourceProjection(e){let{namespace:t,sourceRoot:n}=e;return{extensionScope:{namespace:t,sourceRoot:n},logicalPath:e=>qualifyExtensionContributionLogicalPath(e,t),name:e=>`${t}__${e}`}}function projectManifest(t){let{projection:r}=t,sourceId=e=>`${t.sourceIdPrefix??``}${e}`,pushModule=(e,n)=>{let i=r.logicalPath(n??e.logicalPath),a=createFilesystemModuleCandidate({externalDependencies:t.externalDependencies,...r.extensionScope===void 0?{}:{extensionScope:r.extensionScope},layer:t.layer,logicalPath:i,nodeId:t.nodeId,owner:t.owner,source:e,sourceId:sourceId(e.sourceId),sourceRoot:t.manifest.agentRoot});t.candidates.push(a)},pushResource=(n,i)=>{let a=r.logicalPath(i.logicalPath),o={...i,...i.sourceKind===`skill-package`?{name:r.name(i.name)}:{},logicalPath:a,sourceId:sourceId(i.sourceId)},s={backing:{kind:`resource`,sourcePath:i.sourceKind===`skill-package`?i.skillFilePath:join(t.manifest.agentRoot,i.logicalPath)},form:`direct`,layer:t.layer,logicalPath:a,nodeId:t.nodeId,owner:t.owner,sourceId:o.sourceId};t.candidates.push(s),t.resources.push({candidate:s,kind:n,source:o})};if(t.manifest.configModule!==void 0){let e=t.manifest.configModule.logicalPath;pushModule(t.manifest.configModule,canonicalSourceSlot(e)===`agent`?void 0:`agent.ts`)}t.manifest.instrumentation!==void 0&&pushModule(t.manifest.instrumentation);for(let e of t.manifest.extensions)pushModule(e);for(let e of t.manifest.channels)pushModule(e);for(let e of t.manifest.connections)pushModule(e);for(let e of t.manifest.hooks)pushModule(e);for(let e of t.manifest.memories)pushModule(e);t.manifest.sandbox!==null&&pushModule(t.manifest.sandbox);for(let e of t.manifest.tools)pushModule(e);for(let e of t.manifest.instructions)e.sourceKind===`module`?pushModule(e):pushResource(`instructions`,e);for(let e of t.manifest.schedules)e.sourceKind===`module`?pushModule(e):pushResource(`schedule`,e);for(let e of t.manifest.skills)e.sourceKind===`module`?pushModule(e):pushResource(`skill`,e);for(let e of t.manifest.subagents){let n=r.name(e.subagentId),i=r.logicalPath(e.logicalPath),a={...e,logicalPath:i,sourceId:sourceId(e.sourceId),subagentId:n},o={backing:{kind:`resource`,sourcePath:e.entryPath},form:`direct`,layer:t.layer,logicalPath:i,nodeId:t.nodeId,owner:t.owner,sourceId:a.sourceId};t.candidates.push(o),t.subagents.push({candidate:o,...r.extensionScope===void 0?{}:{extensionScope:r.extensionScope},owner:t.owner,source:a})}}function projectModuleCandidate(e){let t={exportName:e.exportName,logicalPath:e.logicalPath,sourceId:e.sourceId,sourceKind:`module`},i=canonicalSourceSlot(e.logicalPath);if(i.startsWith(`connections/`))return{candidate:e,kind:`connection`,source:{...t,connectionName:deriveConnectionName(e.logicalPath)}};let a=MODULE_KIND_BY_SLOT_ROOT[i.split(`/`,1)[0]];if(a===void 0)throw Error(`Agent module source slot "${e.logicalPath}" is not compiled yet.`);return{candidate:e,kind:a,source:t}}function isModuleCandidate(e){return e.backing.kind!==`resource`}const EXTENSION_CONTRIBUTION_ROOTS=new Set([`channels`,`connections`,`hooks`,`instructions`,`schedules`,`skills`,`subagents`,`tools`]);function qualifyExtensionContributionLogicalPath(e,n){let r=e.split(`/`);if(r.length===1){let r=stripLogicalPathExtension(e);if(r===`instructions`||r===`system`)return`instructions/${n}${e.slice(e.lastIndexOf(`.`))}`;throw Error(`Extension source slot "${e}" cannot be namespace-scoped.`)}let a=r[0];if(!EXTENSION_CONTRIBUTION_ROOTS.has(a))throw Error(`Extension source slot "${e}" cannot be namespace-scoped.`);return r[1]=`${n}__${r[1]}`,r.join(`/`)}function deriveConnectionName(e){let n=stripLogicalPathExtension(e).replace(/^connections\//,``);return n.endsWith(`/connection`)?n.slice(0,-11):n}function mergeDependencies(...e){return[...new Set(e.flat())]}export{createFilesystemModuleCandidate,projectAgentSources,projectSelectedSources,qualifyExtensionContributionLogicalPath};
@@ -1,5 +1,7 @@
1
1
  import { type JsonObject } from "#shared/json.js";
2
2
  export type ProgrammaticModuleNamespace = Readonly<Record<string, unknown>>;
3
+ /** Shares zero-argument definition-factory results within one module-map load. */
4
+ export declare function memoizeModuleNamespaceFactories(namespace: ProgrammaticModuleNamespace): ProgrammaticModuleNamespace;
3
5
  export interface ProgrammaticModuleLoadContext {
4
6
  readonly dependencies: Readonly<Record<string, ProgrammaticModuleNamespace>>;
5
7
  readonly parameters: JsonObject;
@@ -1 +1 @@
1
- import{isAbsolute,posix}from"node:path";import{getSupportedModuleBaseName,normalizeLogicalPath,stripLogicalPathExtension}from"#discover/filesystem.js";import{parseJsonObject}from"#shared/json.js";var ImmutableProgrammaticSourceMap=class{#e;constructor(e){this.#e=new Map(e),Object.freeze(this)}get size(){return this.#e.size}get[Symbol.toStringTag](){return`ImmutableProgrammaticSourceMap`}[Symbol.iterator](){return this.#e[Symbol.iterator]()}entries(){return this.#e.entries()}forEach(e,t){this.#e.forEach((n,r)=>e.call(t,n,r,this))}get(e){return this.#e.get(e)}has(e){return this.#e.has(e)}keys(){return this.#e.keys()}values(){return this.#e.values()}};const LAYER_PRECEDENCE={"framework-default":0,"extension-package":1,"extension-override":2,application:3},FORM_PRECEDENCE={derived:0,direct:1},registeredProgrammaticTemplates=new WeakSet;function defineProgrammaticAgentSource(e){let t=expectNonEmpty(e.id,`Programmatic agent source id`),n=expectNonEmpty(e.revision,`Programmatic agent source "${t}" revision`),r=new Set,i=e.modules.map(e=>{let n=validateProgrammaticLogicalPath(e.logicalPath);if(r.has(n))throw Error(`Programmatic agent source "${t}" declares "${n}" more than once.`);r.add(n);let i=e.semanticRevision===void 0?void 0:expectNonEmpty(e.semanticRevision,`Programmatic module "${t}:${n}" semanticRevision`);return Object.freeze({exportName:e.exportName,loadNamespace:e.loadNamespace,logicalPath:n,semanticRevision:i})});return Object.freeze({id:t,modules:Object.freeze(i),revision:n})}function createAgentSourceRegistry(e,t={}){let n=new Map,r=new Map,addSource=e=>{let t=defineProgrammaticAgentSource(e);if(n.has(t.id))throw Error(`Programmatic agent source id "${t.id}" is registered more than once.`);return n.set(t.id,t),t},i=e.map(e=>{let t=addSource(e.source);return Object.freeze({applyTo:e.applyTo,source:t})});for(let e of t.templates??[]){let t=addSource(e);if(t.modules.length!==1)throw Error(`Programmatic template source "${t.id}" must register exactly one module.`);let n=Object.freeze({module:t.modules[0],source:t});registeredProgrammaticTemplates.add(n),r.set(t.id,n)}return Object.freeze({registrations:Object.freeze(i),sources:new ImmutableProgrammaticSourceMap(n),templates:new ImmutableProgrammaticSourceMap(r)})}function createProgrammaticModuleCandidates(e){return e.registration.source.modules.map(t=>{let n=`${e.registration.source.id}:${t.logicalPath}`;return Object.freeze({backing:Object.freeze({kind:`programmatic`,moduleId:t.logicalPath,registryId:e.registration.source.id,revision:e.registration.source.revision,semanticRevision:t.semanticRevision}),exportName:t.exportName,form:`direct`,layer:e.layer,logicalPath:t.logicalPath,nodeId:e.nodeId,owner:e.owner,sourceId:n})})}function instantiateProgrammaticTemplate(e){if(!registeredProgrammaticTemplates.has(e.template))throw Error(`Derived programmatic modules require a registered template.`);let t=validateProgrammaticLogicalPath(e.logicalPath),n=expectNonEmpty(e.anchor.sourceId,`Derived programmatic module anchor source id`),r=`${e.template.source.id}:${t}:from:${n}`;if(!Object.values(e.dependencies).some(e=>e.sourceId===n))throw Error(`Derived programmatic module "${r}" must include its anchor source as a dependency.`);let i=Object.freeze(Object.fromEntries(Object.entries(e.dependencies).sort(([e],[t])=>e.localeCompare(t)).map(([t,n])=>{if(expectNonEmpty(t,`Derived programmatic module dependency alias`),n.nodeId!==e.anchor.nodeId)throw Error(`Derived programmatic module "${r}" cannot depend on source "${n.sourceId}" from another node.`);return[t,n.sourceId]}))),o=Object.freeze(parseJsonObject(e.parameters??{}));return Object.freeze({backing:Object.freeze({dependencies:i,kind:`programmatic`,moduleId:e.template.module.logicalPath,parameters:o,registryId:e.template.source.id,revision:e.template.source.revision,semanticRevision:e.template.module.semanticRevision}),exportName:e.template.module.exportName,form:`derived`,layer:e.anchor.layer,logicalPath:t,nodeId:e.anchor.nodeId,owner:e.owner,sourceId:r})}function composeAgentModuleCandidates(e){let t=new Map,n=new Set;for(let r of e){if(n.has(r.sourceId))throw Error(`Agent source id "${r.sourceId}" is declared more than once in node "${r.nodeId}".`);n.add(r.sourceId);let e=canonicalSourceSlot(r.logicalPath),i=t.get(e)??[];i.push(r),t.set(e,i)}let r=new Map,i=[];for(let[e,n]of[...t].sort(([e],[t])=>e.localeCompare(t))){let t=new Set;for(let r of n){let n=`${r.layer}:${r.form}`;if(t.has(n))throw Error(`Agent source slot "${e}" has more than one ${r.layer} ${r.form} candidate.`);t.add(n)}let a=[...n].sort((e,t)=>LAYER_PRECEDENCE[t.layer]-LAYER_PRECEDENCE[e.layer]||FORM_PRECEDENCE[t.form]-FORM_PRECEDENCE[e.form]),c=a[0];r.set(e,c);for(let e of a.slice(1))i.push({kind:`shadowed`,source:describeAgentSourceCandidate(e),winnerSourceId:c.sourceId})}return validateSelectedCandidateDependencies(r),{composition:{entries:Object.freeze(i)},selected:r}}function disableComposedCandidate(e){let t=canonicalSourceSlot(e.candidate.logicalPath),n=new Map(e.composed.selected);if(n.get(t)?.sourceId!==e.candidate.sourceId)throw Error(`Only the selected source for "${t}" can disable that slot.`);if(!e.composed.composition.entries.some(t=>t.kind===`shadowed`&&t.winnerSourceId===e.candidate.sourceId))throw Error(`Source "${e.candidate.logicalPath}" disables a slot with no lower-precedence source.`);return n.delete(t),{composition:{entries:Object.freeze([...e.composed.composition.entries,{kind:`disabled`,source:describeAgentSourceCandidate(e.candidate)}])},selected:n}}function createCompiledModuleBinding(e){return Object.freeze({backing:e.backing,logicalPath:e.logicalPath,owner:e.owner})}async function loadProgrammaticModuleNamespace(e){let t=e.registries.map(t=>t.sources.get(e.backing.registryId)).filter(e=>e!==void 0);if(t.length!==1)throw Error(`Expected exactly one registered programmatic source "${e.backing.registryId}", found ${t.length}.`);let n=t[0];if(n.revision!==e.backing.revision)throw Error(`Programmatic source "${n.id}" revision mismatch: artifact requires "${e.backing.revision}", registry provides "${n.revision}".`);let r=n.modules.find(t=>t.logicalPath===e.backing.moduleId);if(r===void 0)throw Error(`Programmatic source "${n.id}" does not register module "${e.backing.moduleId}".`);if(r.semanticRevision!==e.backing.semanticRevision)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" semantic revision does not match the compiled binding.`);let i=Object.fromEntries(Object.entries(e.backing.dependencies??{}).map(([t,i])=>{let a=e.dependencyNamespaces?.[t];if(a===void 0)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" requires unresolved binding "${i}" as dependency "${t}".`);return[t,a]})),a=await r.loadNamespace({dependencies:Object.freeze(i),parameters:Object.freeze(e.backing.parameters??{})});if(typeof a!=`object`||!a)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" loader must return a module namespace object.`);return a}function canonicalModuleSlot(e){return validateProgrammaticLogicalPath(e),canonicalSourceSlot(e)}function canonicalSourceSlot(e){let n=normalizeLogicalPath(e);if(n.length===0||n===`.`||n.startsWith(`../`)||n.includes(`/../`)||posix.normalize(n)!==n)throw Error(`Agent source logical path "${e}" is invalid.`);let a=stripLogicalPathExtension(n),o=a.match(/^connections\/([^/]+)\/connection$/);if(o!==null)return`connections/${o[1]}`;if(a===`sandbox/sandbox`)return`sandbox`;let s=a.match(/^skills\/([^/]+)\/SKILL$/);return s===null?a:`skills/${s[1]}`}function validateProgrammaticLogicalPath(a){if(a.length===0||isAbsolute(a)||a.includes(`\\`))throw Error(`Programmatic module logical path "${a}" must be a relative POSIX path.`);let o=normalizeLogicalPath(a);if(o===`.`||o.startsWith(`../`)||o.includes(`/../`)||posix.normalize(o)!==o)throw Error(`Programmatic module logical path "${a}" may not traverse directories.`);let s=o.split(`/`),c=s.at(-1);if(getSupportedModuleBaseName(c)===null)throw Error(`Programmatic module logical path "${a}" must use a supported JavaScript or TypeScript extension.`);let l=s[0],u=stripLogicalPathExtension(o);if(!(s.length===1&&[`agent`,`sandbox`,`instrumentation`].includes(u)||l===`sandbox`&&s.length===2&&getSupportedModuleBaseName(c)===`sandbox`||[`channels`,`connections`,`hooks`,`instructions`,`schedules`,`skills`,`tools`].includes(l)&&s.length>=2))throw Error(`Programmatic module logical path "${a}" does not select an eve module slot.`);return o}function describeAgentSourceCandidate(e){return Object.freeze({backing:e.backing,form:e.form,layer:e.layer,logicalPath:e.logicalPath,owner:e.owner,sourceId:e.sourceId})}function validateSelectedCandidateDependencies(e){let t=new Set([...e.values()].map(e=>e.sourceId));for(let n of e.values())if(n.backing.kind===`programmatic`){for(let e of Object.values(n.backing.dependencies??{}))if(!t.has(e))throw Error(`Derived programmatic source "${n.sourceId}" depends on unselected source "${e}".`)}}function expectNonEmpty(e,t){if(e.trim().length===0)throw Error(`${t} must be non-empty.`);return e}export{canonicalModuleSlot,canonicalSourceSlot,composeAgentModuleCandidates,createAgentSourceRegistry,createCompiledModuleBinding,createProgrammaticModuleCandidates,defineProgrammaticAgentSource,describeAgentSourceCandidate,disableComposedCandidate,instantiateProgrammaticTemplate,loadProgrammaticModuleNamespace,validateProgrammaticLogicalPath};
1
+ import{isAbsolute,posix}from"node:path";import{getSupportedModuleBaseName,normalizeLogicalPath,stripLogicalPathExtension}from"#discover/filesystem.js";import{parseJsonObject}from"#shared/json.js";function memoizeModuleNamespaceFactories(e){return Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>{if(typeof t!=`function`)return[e,t];let n;return[e,new Proxy(t,{apply(e,t,r){return r.length>0?Reflect.apply(e,t,r):(n??=Promise.resolve().then(()=>Reflect.apply(e,t,r)),n)}})]})))}var ImmutableProgrammaticSourceMap=class{#e;constructor(e){this.#e=new Map(e),Object.freeze(this)}get size(){return this.#e.size}get[Symbol.toStringTag](){return`ImmutableProgrammaticSourceMap`}[Symbol.iterator](){return this.#e[Symbol.iterator]()}entries(){return this.#e.entries()}forEach(e,t){this.#e.forEach((n,r)=>e.call(t,n,r,this))}get(e){return this.#e.get(e)}has(e){return this.#e.has(e)}keys(){return this.#e.keys()}values(){return this.#e.values()}};const LAYER_PRECEDENCE={"framework-default":0,"extension-package":1,"extension-override":2,application:3},FORM_PRECEDENCE={derived:0,direct:1},registeredProgrammaticTemplates=new WeakSet;function defineProgrammaticAgentSource(e){let t=expectNonEmpty(e.id,`Programmatic agent source id`),n=expectNonEmpty(e.revision,`Programmatic agent source "${t}" revision`),r=new Set,i=e.modules.map(e=>{let n=validateProgrammaticLogicalPath(e.logicalPath);if(r.has(n))throw Error(`Programmatic agent source "${t}" declares "${n}" more than once.`);r.add(n);let i=e.semanticRevision===void 0?void 0:expectNonEmpty(e.semanticRevision,`Programmatic module "${t}:${n}" semanticRevision`);return Object.freeze({exportName:e.exportName,loadNamespace:e.loadNamespace,logicalPath:n,semanticRevision:i})});return Object.freeze({id:t,modules:Object.freeze(i),revision:n})}function createAgentSourceRegistry(e,t={}){let n=new Map,r=new Map,addSource=e=>{let t=defineProgrammaticAgentSource(e);if(n.has(t.id))throw Error(`Programmatic agent source id "${t.id}" is registered more than once.`);return n.set(t.id,t),t},i=e.map(e=>{let t=addSource(e.source);return Object.freeze({applyTo:e.applyTo,source:t})});for(let e of t.templates??[]){let t=addSource(e);if(t.modules.length!==1)throw Error(`Programmatic template source "${t.id}" must register exactly one module.`);let n=Object.freeze({module:t.modules[0],source:t});registeredProgrammaticTemplates.add(n),r.set(t.id,n)}return Object.freeze({registrations:Object.freeze(i),sources:new ImmutableProgrammaticSourceMap(n),templates:new ImmutableProgrammaticSourceMap(r)})}function createProgrammaticModuleCandidates(e){return e.registration.source.modules.map(t=>{let n=`${e.registration.source.id}:${t.logicalPath}`;return Object.freeze({backing:Object.freeze({kind:`programmatic`,moduleId:t.logicalPath,registryId:e.registration.source.id,revision:e.registration.source.revision,semanticRevision:t.semanticRevision}),exportName:t.exportName,form:`direct`,layer:e.layer,logicalPath:t.logicalPath,nodeId:e.nodeId,owner:e.owner,sourceId:n})})}function instantiateProgrammaticTemplate(e){if(!registeredProgrammaticTemplates.has(e.template))throw Error(`Derived programmatic modules require a registered template.`);let t=validateProgrammaticLogicalPath(e.logicalPath),n=expectNonEmpty(e.anchor.sourceId,`Derived programmatic module anchor source id`),r=`${e.template.source.id}:${t}:from:${n}`;if(!Object.values(e.dependencies).some(e=>e.sourceId===n))throw Error(`Derived programmatic module "${r}" must include its anchor source as a dependency.`);let i=Object.freeze(Object.fromEntries(Object.entries(e.dependencies).sort(([e],[t])=>e.localeCompare(t)).map(([t,n])=>{if(expectNonEmpty(t,`Derived programmatic module dependency alias`),n.nodeId!==e.anchor.nodeId)throw Error(`Derived programmatic module "${r}" cannot depend on source "${n.sourceId}" from another node.`);return[t,n.sourceId]}))),o=Object.freeze(parseJsonObject(e.parameters??{}));return Object.freeze({backing:Object.freeze({dependencies:i,kind:`programmatic`,moduleId:e.template.module.logicalPath,parameters:o,registryId:e.template.source.id,revision:e.template.source.revision,semanticRevision:e.template.module.semanticRevision}),exportName:e.template.module.exportName,form:`derived`,layer:e.anchor.layer,logicalPath:t,nodeId:e.anchor.nodeId,owner:e.owner,sourceId:r})}function composeAgentModuleCandidates(e){let t=new Map,n=new Set;for(let r of e){if(n.has(r.sourceId))throw Error(`Agent source id "${r.sourceId}" is declared more than once in node "${r.nodeId}".`);n.add(r.sourceId);let e=canonicalSourceSlot(r.logicalPath),i=t.get(e)??[];i.push(r),t.set(e,i)}let r=new Map,i=[];for(let[e,n]of[...t].sort(([e],[t])=>e.localeCompare(t))){let t=new Set;for(let r of n){let n=`${r.layer}:${r.form}`;if(t.has(n))throw Error(`Agent source slot "${e}" has more than one ${r.layer} ${r.form} candidate.`);t.add(n)}let a=[...n].sort((e,t)=>LAYER_PRECEDENCE[t.layer]-LAYER_PRECEDENCE[e.layer]||FORM_PRECEDENCE[t.form]-FORM_PRECEDENCE[e.form]),c=a[0];r.set(e,c);for(let e of a.slice(1))i.push({kind:`shadowed`,source:describeAgentSourceCandidate(e),winnerSourceId:c.sourceId})}return validateSelectedCandidateDependencies(r),{composition:{entries:Object.freeze(i)},selected:r}}function disableComposedCandidate(e){let t=canonicalSourceSlot(e.candidate.logicalPath),n=new Map(e.composed.selected);if(n.get(t)?.sourceId!==e.candidate.sourceId)throw Error(`Only the selected source for "${t}" can disable that slot.`);if(!e.composed.composition.entries.some(t=>t.kind===`shadowed`&&t.winnerSourceId===e.candidate.sourceId))throw Error(`Source "${e.candidate.logicalPath}" disables a slot with no lower-precedence source.`);return n.delete(t),{composition:{entries:Object.freeze([...e.composed.composition.entries,{kind:`disabled`,source:describeAgentSourceCandidate(e.candidate)}])},selected:n}}function createCompiledModuleBinding(e){return Object.freeze({backing:e.backing,logicalPath:e.logicalPath,owner:e.owner})}async function loadProgrammaticModuleNamespace(e){let t=e.registries.map(t=>t.sources.get(e.backing.registryId)).filter(e=>e!==void 0);if(t.length!==1)throw Error(`Expected exactly one registered programmatic source "${e.backing.registryId}", found ${t.length}.`);let n=t[0];if(n.revision!==e.backing.revision)throw Error(`Programmatic source "${n.id}" revision mismatch: artifact requires "${e.backing.revision}", registry provides "${n.revision}".`);let r=n.modules.find(t=>t.logicalPath===e.backing.moduleId);if(r===void 0)throw Error(`Programmatic source "${n.id}" does not register module "${e.backing.moduleId}".`);if(r.semanticRevision!==e.backing.semanticRevision)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" semantic revision does not match the compiled binding.`);let i=Object.fromEntries(Object.entries(e.backing.dependencies??{}).map(([t,i])=>{let a=e.dependencyNamespaces?.[t];if(a===void 0)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" requires unresolved binding "${i}" as dependency "${t}".`);return[t,a]})),a=await r.loadNamespace({dependencies:Object.freeze(i),parameters:Object.freeze(e.backing.parameters??{})});if(typeof a!=`object`||!a)throw Error(`Programmatic module "${n.id}:${r.logicalPath}" loader must return a module namespace object.`);return a}function canonicalModuleSlot(e){return validateProgrammaticLogicalPath(e),canonicalSourceSlot(e)}function canonicalSourceSlot(e){let n=normalizeLogicalPath(e);if(n.length===0||n===`.`||n.startsWith(`../`)||n.includes(`/../`)||posix.normalize(n)!==n)throw Error(`Agent source logical path "${e}" is invalid.`);let a=stripLogicalPathExtension(n),o=a.match(/^connections\/([^/]+)\/connection$/);if(o!==null)return`connections/${o[1]}`;if(a===`sandbox/sandbox`)return`sandbox`;let s=a.match(/^skills\/([^/]+)\/SKILL$/);return s===null?a:`skills/${s[1]}`}function validateProgrammaticLogicalPath(a){if(a.length===0||isAbsolute(a)||a.includes(`\\`))throw Error(`Programmatic module logical path "${a}" must be a relative POSIX path.`);let o=normalizeLogicalPath(a);if(o===`.`||o.startsWith(`../`)||o.includes(`/../`)||posix.normalize(o)!==o)throw Error(`Programmatic module logical path "${a}" may not traverse directories.`);let s=o.split(`/`),c=s.at(-1);if(getSupportedModuleBaseName(c)===null)throw Error(`Programmatic module logical path "${a}" must use a supported JavaScript or TypeScript extension.`);let l=s[0],u=stripLogicalPathExtension(o);if(!(s.length===1&&[`agent`,`memory`,`sandbox`,`instrumentation`].includes(u)||l===`sandbox`&&s.length===2&&getSupportedModuleBaseName(c)===`sandbox`||[`channels`,`connections`,`hooks`,`instructions`,`memory`,`schedules`,`skills`,`tools`].includes(l)&&s.length>=2))throw Error(`Programmatic module logical path "${a}" does not select an eve module slot.`);return o}function describeAgentSourceCandidate(e){return Object.freeze({backing:e.backing,form:e.form,layer:e.layer,logicalPath:e.logicalPath,owner:e.owner,sourceId:e.sourceId})}function validateSelectedCandidateDependencies(e){let t=new Set([...e.values()].map(e=>e.sourceId));for(let n of e.values())if(n.backing.kind===`programmatic`){for(let e of Object.values(n.backing.dependencies??{}))if(!t.has(e))throw Error(`Derived programmatic source "${n.sourceId}" depends on unselected source "${e}".`)}}function expectNonEmpty(e,t){if(e.trim().length===0)throw Error(`${t} must be non-empty.`);return e}export{canonicalModuleSlot,canonicalSourceSlot,composeAgentModuleCandidates,createAgentSourceRegistry,createCompiledModuleBinding,createProgrammaticModuleCandidates,defineProgrammaticAgentSource,describeAgentSourceCandidate,disableComposedCandidate,instantiateProgrammaticTemplate,loadProgrammaticModuleNamespace,memoizeModuleNamespaceFactories,validateProgrammaticLogicalPath};
@@ -1 +1 @@
1
- import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{collectModuleBindingsForManifest}from"#compiler/module-map.js";import{HOST_HTTP_INVENTORY}from"#framework/host-inventory.js";function validateCompiledAgentManifest(t){let n=new Map([[ROOT_COMPILED_AGENT_NODE_ID,t]]);for(let e of t.subagents)n.has(e.nodeId)&&fail(`subagent node id "${e.nodeId}" is duplicated`),n.set(e.nodeId,e.agent),validateSubagentRecord(e);validateSubagentTree(t,n),validateCompiledAgentResources(t,{activeResourceSourceIds:t.subagents.filter(t=>t.parentNodeId===ROOT_COMPILED_AGENT_NODE_ID).map(e=>e.sourceId)});for(let e of t.subagents)validateCompiledAgentResources(e.agent,{additionalModuleSources:e.configResolver===void 0?[]:[e.configResolver],activeResourceSourceIds:t.subagents.filter(t=>t.parentNodeId===e.nodeId).map(e=>e.sourceId)});for(let[e,r]of n)validateUniqueIdentities([...r.tools.map(e=>({identity:e.name,kind:`tool`})),...r.remoteAgents.map(e=>({identity:e.name,kind:`remote agent`})),...t.subagents.filter(t=>t.parentNodeId===e).map(e=>({identity:e.name,kind:`local agent`}))],`tool and subagent public name`)}function validateSubagentTree(t,n){let r=new Map(t.subagents.map(e=>[e.nodeId,e.parentNodeId]));for(let i of t.subagents){n.has(i.parentNodeId)||fail(`subagent node "${i.nodeId}" has missing parent "${i.parentNodeId}"`);let t=new Set,a=i.nodeId;for(;a!==ROOT_COMPILED_AGENT_NODE_ID;){t.has(a)&&fail(`subagent graph contains a cycle at node "${a}"`),t.add(a);let e=r.get(a);e===void 0&&fail(`subagent node "${i.nodeId}" is not reachable from the root`),a=e}}}function validateCompiledModuleMap(e,n){let r=new Map([[`__root__`,new Set(collectModuleBindingsForManifest(e).map(e=>e.sourceId))],...e.subagents.map(e=>[e.nodeId,new Set(collectModuleBindingsForManifest(e.agent).map(e=>e.sourceId))])]),i=Object.keys(n.nodes);(i.length!==r.size||i.some(e=>!r.has(e)))&&fail(`compiled module map node set does not match the manifest`);for(let[e,t]of r){let r=n.nodes[e];r===void 0&&fail(`compiled module map node "${e}" is missing`);let i=Object.keys(r.modules);(i.length!==t.size||i.some(e=>!t.has(e)))&&fail(`compiled module map sources for node "${e}" do not match its bindings`)}}function validateCompiledAgentResources(e,t={}){validateUniqueIdentities(e.tools.map(e=>({identity:e.name,kind:`tool`})),`tool name`),validateUniqueIdentities(e.dynamicTools.map(e=>({identity:e.slug,kind:`dynamic tool`})),`dynamic tool slug`),validateUniqueIdentities(e.skills.map(e=>({identity:e.name,kind:`skill`})),`skill name`),validateUniqueIdentities(e.dynamicSkills.map(e=>({identity:e.slug,kind:`dynamic skill`})),`dynamic skill slug`),validateUniqueIdentities(e.instructions.map(e=>({identity:e.name,kind:`instructions`})),`instructions name`),validateUniqueIdentities(e.dynamicInstructions.map(e=>({identity:e.slug,kind:`dynamic instructions`})),`dynamic instructions slug`),validateUniqueIdentities(e.connections.map(e=>({identity:e.connectionName,kind:`connection`})),`connection name`),validateUniqueIdentities(e.hooks.map(e=>({identity:e.slug,kind:`hook`})),`hook slug`),validateUniqueIdentities(e.schedules.map(e=>({identity:e.name,kind:`schedule`})),`schedule name`);let n=collectReferencedModuleSources(e);for(let e of t.additionalModuleSources??[])n.set(e.sourceId,{logicalPath:e.logicalPath});for(let[t,r]of n){let n=e.bindings[t];n===void 0&&fail(`module source "${t}" has no compiled binding`),validateBinding(t,r.logicalPath,n)}for(let t of Object.keys(e.bindings))n.has(t)||fail(`compiled binding "${t}" is not referenced by its node manifest`);validateProgrammaticBindingDependencies(e.bindings);let r=new Set([...n.keys(),...collectActiveResourceSourceIds(e),...e.remoteAgents.map(e=>e.sourceId),...t.activeResourceSourceIds??[]]),i=new Set;for(let n of e.sourceComposition.entries){if(n.kind===`disabled`){i.has(n.source.sourceId)&&fail(`disabled composition source "${n.source.sourceId}" is duplicated`),i.add(n.source.sourceId),e.bindings[n.source.sourceId]!==void 0&&fail(`disabled source "${n.source.sourceId}" retains an active binding`);continue}!r.has(n.winnerSourceId)&&!i.has(n.winnerSourceId)&&!e.sourceComposition.entries.some(e=>e.kind===`disabled`&&e.source.sourceId===n.winnerSourceId)&&t.allowUnknownResourceWinners!==!0&&fail(`shadowed source "${n.source.sourceId}" has dangling winner "${n.winnerSourceId}"`)}validateChannelRoutePlan(e);for(let t of e.remoteAgents)validateBinding(t.sourceId,t.logicalPath,t.binding),t.parentNodeId.length===0&&fail(`remote agent "${t.sourceId}" has no parent`)}function validateSubagentRecord(e){if((e.backing.kind!==`resource`||e.backing.sourcePath.length===0)&&fail(`subagent "${e.nodeId}" has no physical resource backing`),e.parentNodeId.length===0&&fail(`subagent "${e.nodeId}" has no parent`),e.configResolver!==void 0){let t=e.agent.bindings[e.configResolver.sourceId];t===void 0&&fail(`dynamic subagent "${e.nodeId}" config resolver has no binding`),validateBinding(e.configResolver.sourceId,e.configResolver.logicalPath,t)}}function validateBinding(e,t,n){n.logicalPath!==t&&fail(`compiled binding "${e}" targets "${n.logicalPath}", not "${t}"`),n.owner.kind===`extension`&&n.backing.kind===`filesystem`&&n.backing.extensionScope===void 0&&fail(`extension-owned filesystem binding "${e}" has no extension scope`)}function validateProgrammaticBindingDependencies(e){let t=new Set,n=new Set,visit=r=>{if(n.has(r))return;t.has(r)&&fail(`programmatic binding dependency cycle includes "${r}"`);let i=e[r];if(i===void 0&&fail(`programmatic binding dependency "${r}" is missing`),t.add(r),i.backing.kind===`programmatic`)for(let[t,n]of Object.entries(i.backing.dependencies??{}))t.trim().length===0&&fail(`programmatic binding "${r}" has an empty dependency alias`),e[n]===void 0&&fail(`programmatic binding "${r}" depends on missing binding "${n}"`),visit(n);t.delete(r),n.add(r)};for(let t of Object.keys(e))visit(t)}function collectReferencedModuleSources(e){let t=new Map,add=e=>{let n=t.get(e.sourceId);n!==void 0&&n.logicalPath!==e.logicalPath&&fail(`module source "${e.sourceId}" is referenced with two logical paths`),t.set(e.sourceId,{logicalPath:e.logicalPath})};`config`in e&&(add(e.config.source),e.config.model?.source!==void 0&&add(e.config.model.source),e.config.dynamicModel!==void 0&&add(e.config.dynamicModel));for(let t of e.channelRoutes.effective)add(t);for(let t of e.channelRoutes.shadowed)t.source.backing.kind!==`resource`&&add(t.source);for(let t of e.connections)add(t);for(let t of e.tools)add(t);for(let t of e.dynamicInstructions)add(t);for(let t of e.dynamicSkills)add(t);for(let t of e.dynamicTools)add(t);for(let t of e.hooks)add(t);for(let t of e.instructions)t.sourceKind===`module`&&add(t);e.instrumentation!==void 0&&add(e.instrumentation),e.workflowTool!==void 0&&add(e.workflowTool);for(let t of e.skills)t.sourceKind===`module`&&add(t);for(let t of e.schedules)t.sourceKind===`module`&&add(t);add(e.sandbox);for(let t of e.extensionMounts)add({logicalPath:t.mountLogicalPath,sourceId:t.mountSourceId});return t}function collectActiveResourceSourceIds(e){return[...e.instructions.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.skills.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.schedules.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.sandboxWorkspaces.map(e=>e.sourceId)]}function validateChannelRoutePlan(e){let t=new Set,r=new Set;for(let i of e.channelRoutes.effective){let a=routeIdentity(i);t.has(a)&&fail(`effective channel route "${a}" is duplicated`),t.add(a),r.add(i.sourceId),e.bindings[i.sourceId]===void 0&&fail(`effective channel route source "${i.sourceId}" has no binding`),HOST_HTTP_INVENTORY.find(e=>methodsOverlap(i.method,e.method)&&patternsOverlap(i.urlPath,e.path))!==void 0&&fail(`effective route ${i.method} ${i.urlPath} overlaps reserved host route`)}for(let t of e.channelRoutes.shadowed)r.has(t.winnerSourceId)||fail(`shadowed channel route has dangling winner "${t.winnerSourceId}"`);let i=new Set;for(let t of e.channelRoutes.preflight){let n=normalizePattern(t.urlPath);i.has(n)&&fail(`generated preflight "${n}" is duplicated`),i.add(n),t.sourceIds.length===0&&fail(`generated preflight "${n}" has no causes`);for(let r of t.sourceIds)e.channelRoutes.effective.find(e=>e.sourceId===r&&e.cors!==void 0&&e.method!==`WEBSOCKET`&&patternsOverlap(e.urlPath,t.urlPath))===void 0&&fail(`generated preflight "${n}" has invalid cause "${r}"`)}}function routeIdentity(e){return`${e.method} ${normalizePattern(e.urlPath)}`}function normalizePattern(e){return splitPath(e).map(e=>isParameter(e)?`:`:e).join(`/`)}function patternsOverlap(e,t){let n=splitPath(e),r=splitPath(t);return n.length===r.length&&n.every((e,t)=>e===r[t]||isParameter(e)||isParameter(r[t]))}function splitPath(e){return e.replace(/^\/+|\/+$/g,``).split(`/`)}function isParameter(e){return e.startsWith(`:`)||/^\[[^\]]+\]$/.test(e)}function methodsOverlap(e,t){return e===`ALL`||t===`ALL`||e===t}function validateUniqueIdentities(e,t){let n=new Map;for(let r of e){let e=n.get(r.identity);e!==void 0&&fail(`${t} "${r.identity}" is shared by ${e} and ${r.kind}`),n.set(r.identity,r.kind)}}function fail(e){throw Error(`Invalid compiled eve artifact: ${e}.`)}export{validateCompiledAgentManifest,validateCompiledAgentResources,validateCompiledModuleMap};
1
+ import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{collectModuleBindingsForManifest}from"#compiler/module-map.js";import{HOST_HTTP_INVENTORY}from"#framework/host-inventory.js";function validateCompiledAgentManifest(t){let n=new Map([[ROOT_COMPILED_AGENT_NODE_ID,t]]);for(let e of t.subagents)n.has(e.nodeId)&&fail(`subagent node id "${e.nodeId}" is duplicated`),n.set(e.nodeId,e.agent),validateSubagentRecord(e);validateSubagentTree(t,n),validateCompiledAgentResources(t,{activeResourceSourceIds:t.subagents.filter(t=>t.parentNodeId===ROOT_COMPILED_AGENT_NODE_ID).map(e=>e.sourceId)});for(let e of t.subagents)validateCompiledAgentResources(e.agent,{additionalModuleSources:e.configResolver===void 0?[]:[e.configResolver],activeResourceSourceIds:t.subagents.filter(t=>t.parentNodeId===e.nodeId).map(e=>e.sourceId)});for(let[e,r]of n)validateUniqueIdentities([...r.tools.map(e=>({identity:e.name,kind:`tool`})),...r.remoteAgents.map(e=>({identity:e.name,kind:`remote agent`})),...t.subagents.filter(t=>t.parentNodeId===e).map(e=>({identity:e.name,kind:`local agent`}))],`tool and subagent public name`)}function validateSubagentTree(t,n){let r=new Map(t.subagents.map(e=>[e.nodeId,e.parentNodeId]));for(let i of t.subagents){n.has(i.parentNodeId)||fail(`subagent node "${i.nodeId}" has missing parent "${i.parentNodeId}"`);let t=new Set,a=i.nodeId;for(;a!==ROOT_COMPILED_AGENT_NODE_ID;){t.has(a)&&fail(`subagent graph contains a cycle at node "${a}"`),t.add(a);let e=r.get(a);e===void 0&&fail(`subagent node "${i.nodeId}" is not reachable from the root`),a=e}}}function validateCompiledModuleMap(e,n){let r=new Map([[`__root__`,new Set(collectModuleBindingsForManifest(e).map(e=>e.sourceId))],...e.subagents.map(e=>[e.nodeId,new Set(collectModuleBindingsForManifest(e.agent).map(e=>e.sourceId))])]),i=Object.keys(n.nodes);(i.length!==r.size||i.some(e=>!r.has(e)))&&fail(`compiled module map node set does not match the manifest`);for(let[e,t]of r){let r=n.nodes[e];r===void 0&&fail(`compiled module map node "${e}" is missing`);let i=Object.keys(r.modules);(i.length!==t.size||i.some(e=>!t.has(e)))&&fail(`compiled module map sources for node "${e}" do not match its bindings`)}}function validateCompiledAgentResources(e,t={}){validateUniqueIdentities(e.tools.map(e=>({identity:e.name,kind:`tool`})),`tool name`),validateUniqueIdentities(e.dynamicTools.map(e=>({identity:e.slug,kind:`dynamic tool`})),`dynamic tool slug`),validateUniqueIdentities(e.skills.map(e=>({identity:e.name,kind:`skill`})),`skill name`),validateUniqueIdentities(e.dynamicSkills.map(e=>({identity:e.slug,kind:`dynamic skill`})),`dynamic skill slug`),validateUniqueIdentities(e.instructions.map(e=>({identity:e.name,kind:`instructions`})),`instructions name`),validateUniqueIdentities(e.dynamicInstructions.map(e=>({identity:e.slug,kind:`dynamic instructions`})),`dynamic instructions slug`),validateUniqueIdentities(e.connections.map(e=>({identity:e.connectionName,kind:`connection`})),`connection name`),validateUniqueIdentities(e.hooks.map(e=>({identity:e.slug,kind:`hook`})),`hook slug`),validateUniqueIdentities(e.memories.map(e=>({identity:e.slot,kind:`memory`})),`memory slot`),validateUniqueIdentities(e.schedules.map(e=>({identity:e.name,kind:`schedule`})),`schedule name`);let n=collectReferencedModuleSources(e);for(let e of t.additionalModuleSources??[])n.set(e.sourceId,{logicalPath:e.logicalPath});for(let[t,r]of n){let n=e.bindings[t];n===void 0&&fail(`module source "${t}" has no compiled binding`),validateBinding(t,r.logicalPath,n)}for(let t of Object.keys(e.bindings))n.has(t)||fail(`compiled binding "${t}" is not referenced by its node manifest`);validateProgrammaticBindingDependencies(e.bindings);let r=new Set([...n.keys(),...collectActiveResourceSourceIds(e),...e.remoteAgents.map(e=>e.sourceId),...t.activeResourceSourceIds??[]]),i=new Set;for(let n of e.sourceComposition.entries){if(n.kind===`disabled`){i.has(n.source.sourceId)&&fail(`disabled composition source "${n.source.sourceId}" is duplicated`),i.add(n.source.sourceId),e.bindings[n.source.sourceId]!==void 0&&fail(`disabled source "${n.source.sourceId}" retains an active binding`);continue}!r.has(n.winnerSourceId)&&!i.has(n.winnerSourceId)&&!e.sourceComposition.entries.some(e=>e.kind===`disabled`&&e.source.sourceId===n.winnerSourceId)&&t.allowUnknownResourceWinners!==!0&&fail(`shadowed source "${n.source.sourceId}" has dangling winner "${n.winnerSourceId}"`)}validateChannelRoutePlan(e);for(let t of e.remoteAgents)validateBinding(t.sourceId,t.logicalPath,t.binding),t.parentNodeId.length===0&&fail(`remote agent "${t.sourceId}" has no parent`)}function validateSubagentRecord(e){if((e.backing.kind!==`resource`||e.backing.sourcePath.length===0)&&fail(`subagent "${e.nodeId}" has no physical resource backing`),e.parentNodeId.length===0&&fail(`subagent "${e.nodeId}" has no parent`),e.configResolver!==void 0){let t=e.agent.bindings[e.configResolver.sourceId];t===void 0&&fail(`dynamic subagent "${e.nodeId}" config resolver has no binding`),validateBinding(e.configResolver.sourceId,e.configResolver.logicalPath,t)}}function validateBinding(e,t,n){n.logicalPath!==t&&fail(`compiled binding "${e}" targets "${n.logicalPath}", not "${t}"`),n.owner.kind===`extension`&&n.backing.kind===`filesystem`&&n.backing.extensionScope===void 0&&fail(`extension-owned filesystem binding "${e}" has no extension scope`)}function validateProgrammaticBindingDependencies(e){let t=new Set,n=new Set,visit=r=>{if(n.has(r))return;t.has(r)&&fail(`programmatic binding dependency cycle includes "${r}"`);let i=e[r];if(i===void 0&&fail(`programmatic binding dependency "${r}" is missing`),t.add(r),i.backing.kind===`programmatic`)for(let[t,n]of Object.entries(i.backing.dependencies??{}))t.trim().length===0&&fail(`programmatic binding "${r}" has an empty dependency alias`),e[n]===void 0&&fail(`programmatic binding "${r}" depends on missing binding "${n}"`),visit(n);t.delete(r),n.add(r)};for(let t of Object.keys(e))visit(t)}function collectReferencedModuleSources(e){let t=new Map,add=e=>{let n=t.get(e.sourceId);n!==void 0&&n.logicalPath!==e.logicalPath&&fail(`module source "${e.sourceId}" is referenced with two logical paths`),t.set(e.sourceId,{logicalPath:e.logicalPath})};`config`in e&&(add(e.config.source),e.config.model?.source!==void 0&&add(e.config.model.source),e.config.dynamicModel!==void 0&&add(e.config.dynamicModel));for(let t of e.channelRoutes.effective)add(t);for(let t of e.channelRoutes.shadowed)t.source.backing.kind!==`resource`&&add(t.source);for(let t of e.connections)add(t);for(let t of e.tools)add(t);for(let t of e.dynamicInstructions)add(t);for(let t of e.dynamicSkills)add(t);for(let t of e.dynamicTools)add(t);for(let t of e.hooks)add(t);for(let t of e.memories)add(t);for(let t of e.instructions)t.sourceKind===`module`&&add(t);e.instrumentation!==void 0&&add(e.instrumentation),e.workflowTool!==void 0&&add(e.workflowTool);for(let t of e.skills)t.sourceKind===`module`&&add(t);for(let t of e.schedules)t.sourceKind===`module`&&add(t);add(e.sandbox);for(let t of e.extensionMounts)add({logicalPath:t.mountLogicalPath,sourceId:t.mountSourceId});return t}function collectActiveResourceSourceIds(e){return[...e.instructions.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.skills.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.schedules.filter(e=>e.sourceKind!==`module`).map(e=>e.sourceId),...e.sandboxWorkspaces.map(e=>e.sourceId)]}function validateChannelRoutePlan(e){let t=new Set,r=new Set;for(let i of e.channelRoutes.effective){let a=routeIdentity(i);t.has(a)&&fail(`effective channel route "${a}" is duplicated`),t.add(a),r.add(i.sourceId),e.bindings[i.sourceId]===void 0&&fail(`effective channel route source "${i.sourceId}" has no binding`),HOST_HTTP_INVENTORY.find(e=>methodsOverlap(i.method,e.method)&&patternsOverlap(i.urlPath,e.path))!==void 0&&fail(`effective route ${i.method} ${i.urlPath} overlaps reserved host route`)}for(let t of e.channelRoutes.shadowed)r.has(t.winnerSourceId)||fail(`shadowed channel route has dangling winner "${t.winnerSourceId}"`);let i=new Set;for(let t of e.channelRoutes.preflight){let n=normalizePattern(t.urlPath);i.has(n)&&fail(`generated preflight "${n}" is duplicated`),i.add(n),t.sourceIds.length===0&&fail(`generated preflight "${n}" has no causes`);for(let r of t.sourceIds)e.channelRoutes.effective.find(e=>e.sourceId===r&&e.cors!==void 0&&e.method!==`WEBSOCKET`&&patternsOverlap(e.urlPath,t.urlPath))===void 0&&fail(`generated preflight "${n}" has invalid cause "${r}"`)}}function routeIdentity(e){return`${e.method} ${normalizePattern(e.urlPath)}`}function normalizePattern(e){return splitPath(e).map(e=>isParameter(e)?`:`:e).join(`/`)}function patternsOverlap(e,t){let n=splitPath(e),r=splitPath(t);return n.length===r.length&&n.every((e,t)=>e===r[t]||isParameter(e)||isParameter(r[t]))}function splitPath(e){return e.replace(/^\/+|\/+$/g,``).split(`/`)}function isParameter(e){return e.startsWith(`:`)||/^\[[^\]]+\]$/.test(e)}function methodsOverlap(e,t){return e===`ALL`||t===`ALL`||e===t}function validateUniqueIdentities(e,t){let n=new Map;for(let r of e){let e=n.get(r.identity);e!==void 0&&fail(`${t} "${r.identity}" is shared by ${e} and ${r.kind}`),n.set(r.identity,r.kind)}}function fail(e){throw Error(`Invalid compiled eve artifact: ${e}.`)}export{validateCompiledAgentManifest,validateCompiledAgentResources,validateCompiledModuleMap};
@@ -1,5 +1,5 @@
1
1
  import type { ModelMessage } from "ai";
2
- import type { ContextContainer } from "#context/container.js";
2
+ import { type ContextContainer } from "#context/container.js";
3
3
  import { type DurableDynamicToolMetadata } from "#context/keys.js";
4
4
  import type { HarnessToolDefinition } from "#harness/execute-tool.js";
5
5
  import type { SessionStartedStreamEvent, UnstampedMessageStreamEvent } from "#protocol/message.js";
@@ -34,3 +34,10 @@ export declare function refreshDynamicSessionToolsForRuntimeRevision(input: {
34
34
  readonly messages: readonly ModelMessage[];
35
35
  readonly runtimeRevision: string;
36
36
  }): Promise<void>;
37
+ /** Re-registers callbacks for compiled resolvers that explicitly support cold replay. */
38
+ export declare function rebindMissingCompiledDynamicToolCallbacks(input: {
39
+ readonly ctx: ContextContainer;
40
+ readonly event: UnstampedMessageStreamEvent;
41
+ readonly messages: readonly ModelMessage[];
42
+ readonly resolvers: readonly ResolvedDynamicToolResolver[];
43
+ }): Promise<void>;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t){return replayDynamicTools(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){if(isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,toolName:e.name}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t){let n=readDurableDynamicToolCallbacks(t)??{},r=Object.keys(n).filter(e=>e!==`execute`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(r.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${r.join(`, `)}.`);let i=t.approval!==void 0,a=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,o=validateReference({name:e,phase:`execute`,stamped:n.execute,required:!0}),s=validateReference({name:e,phase:`approvalRequest`,stamped:n.approvalRequest,required:i}),c=validateReference({name:e,phase:`approvalResponse`,stamped:n.approvalResponse,required:a}),l=validateReference({name:e,phase:`toModelOutput`,stamped:n.toModelOutput,required:t.toModelOutput!==void 0}),u={execute:o};return s!==void 0&&(u.approvalRequest=s),c!==void 0&&(u.approvalResponse=c),l!==void 0&&(u.toModelOutput=l),u}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry),description:e.entry.description,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=await Promise.allSettled(t.map(async t=>{let i=t.events[n.type];if(i===void 0)return null;let a=await i(n,buildResolveContext(e,r));if(a==null)return null;let{entries:o,isSingle:s}=readDynamicToolResult(t,a);return{metadata:qualifyDynamicToolNames(t,s,o).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t})),resolver:t}})),o=[],s=new Map;for(let e of i){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=s.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);s.set(t.name,e.value.resolver.slug)}o.push(...e.value.metadata)}}return{metadata:o}}const resolvedStepTools=new WeakMap;async function resolveStepDynamicTools(e){let t=`data`in e.event?e.event.data:void 0,n=typeof t?.turnId==`string`&&typeof t.stepIndex==`number`?`${t.turnId}:${String(t.stepIndex)}`:void 0,i=resolvedStepTools.get(e.ctx);if(n!==void 0&&i?.coordinate===n){e.ctx.set(StepDynamicToolMetadataKey,i.metadata);return}let a=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(StepDynamicToolMetadataKey,o),n!==void 0&&resolvedStepTools.set(e.ctx,{coordinate:n,metadata:o})}async function dispatchDynamicToolEvent(e){if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools(e);return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let n=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:i}=n.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,n,e.event,e.messages),a=durableKeyForEvent(e.event.type);if(a===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,i);return}let o=new Set(n.map(e=>e.slug)),s=(e.ctx.get(a)??[]).filter(e=>!o.has(e.resolverSlug));e.ctx.set(a,[...s,...i])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let r=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision,i=hasUnregisteredDurableDynamicCallbacks(e.ctx.get(SessionDynamicToolMetadataKey)??[]);if(!r&&!i)return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,o),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}export{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
1
+ import{createLogger}from"#internal/logging.js";import{SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,StepDynamicToolMetadataKey,TurnDynamicToolMetadataKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{serializeInputSchema,serializeOutputSchema}from"#tools/schema.js";import{parseJsonObject}from"#shared/json.js";import{ALLOWED_DYNAMIC_TOOL_EVENTS}from"#dynamic/definition.js";import{contextStorage}from"#context/container.js";import{hasUnregisteredDurableDynamicCallbacks,readDurableDynamicToolCallbacks,registerDurableDynamicCallback}from"#tools/durable-callbacks.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{replayDynamicTools}from"#context/build-dynamic-tools.js";import{isBrandedToolEntry}from"#tools/dynamic.js";const log=createLogger(`dynamic-tools`);function qualifyDynamicToolNames(e,t,n){let r=Object.keys(n);if(r.length===0)return[];if(t){let t=r[0];return[{name:e.slug,entryKey:t,entry:n[t]}]}let i=e.extensionNamespace===void 0?``:`${e.extensionNamespace}__`;return r.map(e=>({entry:n[e],entryKey:e,name:`${i}${e}`}))}function replayDynamicSessionTools(e,t){return replayDynamicTools(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicToolMetadataKey;case`turn.started`:return TurnDynamicToolMetadataKey;case`step.started`:return StepDynamicToolMetadataKey;default:return}}function readDynamicToolResult(e,t){if(isBrandedToolEntry(t))return{entries:{_single:t},isSingle:!0};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`Dynamic tool resolver "${e.logicalPath}" must return defineTool(), a map of defineTool() values, or null.`);let n={};for(let[r,i]of Object.entries(t)){if(!isBrandedToolEntry(i))throw Error(`Dynamic tool resolver "${e.logicalPath}" returned "${r}" without defineTool(). Wrap every dynamic tool entry in defineTool().`);n[r]=i}return{entries:n,isSingle:!1}}function validateReference(e){if(e.stamped===void 0){if(e.required)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);return}let t=Object.keys(e.stamped).filter(e=>e!==`closure`&&e!==`callback`);if(t.includes(`stepId`))throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" was persisted by a pre-release eve version that identified callbacks by build offset. Start a new session to re-resolve it.`);if(t.length>0)throw Error(`Dynamic tool "${e.name}" has invalid ${e.phase} callback metadata: unknown key(s) ${t.join(`, `)}.`);if(typeof e.stamped.callback!=`function`)throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" does not have a durable descriptor. Author the callback inline in transformed source or use an eve durable callback helper.`);let n;try{n=parseJsonObject(e.stamped.closure)}catch(t){throw Error(`Dynamic tool "${e.name}" callback "${e.phase}" has a non-serializable capture. ${toErrorMessage(t)}`)}return registerDurableDynamicCallback({callback:e.stamped.callback,phase:e.phase,toolName:e.name}),{closure:n}}function validateDurableDynamicToolCallbacks(e,t){let n=readDurableDynamicToolCallbacks(t)??{},r=Object.keys(n).filter(e=>e!==`execute`&&e!==`approvalRequest`&&e!==`approvalResponse`&&e!==`toModelOutput`);if(r.length>0)throw Error(`Dynamic tool "${e}" has unknown durable callback phase(s): ${r.join(`, `)}.`);let i=t.approval!==void 0,a=t.approval!==void 0&&typeof t.approval!=`function`&&t.approval.response!==void 0,o=validateReference({name:e,phase:`execute`,stamped:n.execute,required:!0}),s=validateReference({name:e,phase:`approvalRequest`,stamped:n.approvalRequest,required:i}),c=validateReference({name:e,phase:`approvalResponse`,stamped:n.approvalResponse,required:a}),l=validateReference({name:e,phase:`toModelOutput`,stamped:n.toModelOutput,required:t.toModelOutput!==void 0}),u={execute:o};return s!==void 0&&(u.approvalRequest=s),c!==void 0&&(u.approvalResponse=c),l!==void 0&&(u.toModelOutput=l),u}function createMetadata(e){return{callbacks:validateDurableDynamicToolCallbacks(e.name,e.entry),description:e.entry.description,entryKey:e.entryKey,inputSchema:serializeInputSchema(e.entry.inputSchema),name:e.name,outputSchema:serializeOutputSchema(e.entry.outputSchema),resolverSlug:e.resolver.slug}}async function resolveToolsFromEvent(e,t,n,r){let i=await Promise.allSettled(t.map(async t=>{let i=t.events[n.type];if(i===void 0)return null;let a=await i(n,buildResolveContext(e,r));if(a==null)return null;let{entries:o,isSingle:s}=readDynamicToolResult(t,a);return{metadata:qualifyDynamicToolNames(t,s,o).map(({name:e,entryKey:n,entry:r})=>createMetadata({entry:r,entryKey:n,name:e,resolver:t})),resolver:t}})),o=[],s=new Map;for(let e of i){if(e.status===`rejected`){log.error(`Dynamic tool resolver (${n.type}) failed — skipping its complete result.`,{error:toErrorMessage(e.reason)});continue}if(e.value!==null){for(let t of e.value.metadata){let n=s.get(t.name);if(n!==void 0&&n!==e.value.resolver.slug)throw Error(`Dynamic tool "${t.name}" from resolver "${e.value.resolver.slug}" collides with dynamic resolver "${n}". Namespace the map key manually.`);s.set(t.name,e.value.resolver.slug)}o.push(...e.value.metadata)}}return{metadata:o}}const resolvedStepTools=new WeakMap;async function resolveStepDynamicTools(e){let t=`data`in e.event?e.event.data:void 0,n=typeof t?.turnId==`string`&&typeof t.stepIndex==`number`?`${t.turnId}:${String(t.stepIndex)}`:void 0,i=resolvedStepTools.get(e.ctx);if(n!==void 0&&i?.coordinate===n){e.ctx.set(StepDynamicToolMetadataKey,i.metadata);return}let a=e.resolvers.filter(e=>e.eventNames.includes(`step.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(StepDynamicToolMetadataKey,o),n!==void 0&&resolvedStepTools.set(e.ctx,{coordinate:n,metadata:o})}async function dispatchDynamicToolEvent(e){if(!ALLOWED_DYNAMIC_TOOL_EVENTS.has(e.event.type))return;if(e.event.type===`step.started`){await resolveStepDynamicTools(e);return}e.event.type===`turn.started`&&e.ctx.set(StepDynamicToolMetadataKey,[]);let n=e.resolvers.filter(t=>t.eventNames.includes(e.event.type)),{metadata:i}=n.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,n,e.event,e.messages),a=durableKeyForEvent(e.event.type);if(a===void 0)return;if(e.event.type===`session.started`){e.ctx.set(SessionDynamicToolMetadataKey,i);return}let o=new Set(n.map(e=>e.slug)),s=(e.ctx.get(a)??[]).filter(e=>!o.has(e.resolverSlug));e.ctx.set(a,[...s,...i])}async function refreshDynamicSessionToolsForRuntimeRevision(e){let r=e.ctx.get(SessionDynamicToolRuntimeRevisionKey)!==e.runtimeRevision,i=hasUnregisteredDurableDynamicCallbacks(e.ctx.get(SessionDynamicToolMetadataKey)??[]);if(!r&&!i)return;let a=e.resolvers.filter(e=>e.eventNames.includes(`session.started`)),{metadata:o}=a.length===0?{metadata:[]}:await resolveToolsFromEvent(e.ctx,a,e.event,e.messages);e.ctx.set(SessionDynamicToolMetadataKey,o),e.ctx.set(SessionDynamicToolRuntimeRevisionKey,e.runtimeRevision)}async function rebindMissingCompiledDynamicToolCallbacks(e){let t=(e.ctx.get(TurnDynamicToolMetadataKey)??[]).filter(e=>hasUnregisteredDurableDynamicCallbacks([e]));if(t.length===0)return;let n=new Set(t.map(e=>e.resolverSlug)),r=e.resolvers.filter(e=>e.rebindMissingCallbacks===!0&&n.has(e.slug));if(r.length===0)return;await contextStorage.run(e.ctx,async()=>await resolveToolsFromEvent(e.ctx,r,e.event,e.messages));let a=t.filter(e=>hasUnregisteredDurableDynamicCallbacks([e]));if(a.length>0)throw Error(`Dynamic tool callback rebind did not restore: ${a.map(e=>e.name).join(`, `)}. The tool may have been renamed or removed.`)}export{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision,replayDynamicSessionTools,resolveStepDynamicTools,validateDurableDynamicToolCallbacks};
@@ -16,6 +16,7 @@ import type { SandboxAccess } from "#sandbox/state.js";
16
16
  import type { RunMode } from "#shared/run-mode.js";
17
17
  import type { RuntimeModelReference } from "#runtime/agent/bootstrap.js";
18
18
  import type { PreparedRuntimeDelegationTool } from "#runtime/sessions/turn.js";
19
+ import type { MemoryScope, MemoryTurnContext } from "#public/memory/index.js";
19
20
  export type { SessionAuthContext, SessionParent, SessionTurn } from "#channel/types.js";
20
21
  /**
21
22
  * Auth metadata on the active session.
@@ -129,6 +130,30 @@ export declare const SessionDynamicToolRuntimeRevisionKey: ContextKey<string>;
129
130
  * Replaced each turn.
130
131
  */
131
132
  export declare const TurnDynamicToolMetadataKey: ContextKey<readonly DurableDynamicToolMetadata[]>;
133
+ export interface LockedMemorySlot {
134
+ readonly scope: MemoryScope;
135
+ readonly slot: string;
136
+ readonly turn: MemoryTurnContext;
137
+ readonly visibility: "scope" | "session";
138
+ }
139
+ export declare const TurnMemoryLocksKey: ContextKey<Readonly<Record<string, LockedMemorySlot>>>;
140
+ export interface PreparedMemoryPreamble {
141
+ readonly history: readonly ModelMessage[];
142
+ readonly input: readonly ModelMessage[];
143
+ readonly state?: Readonly<Record<string, unknown>>;
144
+ }
145
+ export interface PendingMemoryCommit {
146
+ readonly history: readonly ModelMessage[];
147
+ readonly projectedMessages: readonly ModelMessage[];
148
+ readonly state: Readonly<Record<string, unknown>>;
149
+ }
150
+ export declare const PreparedMemoryPreambleKey: ContextKey<PreparedMemoryPreamble>;
151
+ export declare const PendingMemoryCommitKey: ContextKey<PendingMemoryCommit>;
152
+ export interface PreparedMemoryCompaction {
153
+ readonly history: readonly ModelMessage[];
154
+ readonly state?: Readonly<Record<string, unknown>>;
155
+ }
156
+ export declare const PreparedMemoryCompactionKey: ContextKey<PreparedMemoryCompaction>;
132
157
  /** Step-scoped dynamic tool metadata, replaced before each model step. */
133
158
  export declare const StepDynamicToolMetadataKey: ContextKey<readonly DurableDynamicToolMetadata[]>;
134
159
  /** Whether this turn executes subagent definitions as durable background tools. */
@@ -1 +1 @@
1
- import{ContextKey}from"#context/key.js";import{SESSION_CALLBACK_CONTEXT_KEY_NAME}from"#context/key-names.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),TurnTaskDeliveryKey=new ContextKey(`eve.turnTaskDelivery`),TurnTaskStateKey=new ContextKey(`eve.turnTaskState`),ActiveChannelDeliveriesKey=new ContextKey(`eve.activeChannelDeliveries`),ChannelInstrumentationKey=new ContextKey(`eve.channelInstrumentation`),ModeKey=new ContextKey(`eve.mode`),ParentSessionKey=new ContextKey(`eve.parentSession`),ParentTraceContextKey=new ContextKey(`eve.parentTraceContext`),SessionTraceSeedKey=new ContextKey(`eve.sessionTraceSeed`),OtelTraceEnabledKey=new ContextKey(`eve.otelTraceEnabled`),SubagentDepthKey=new ContextKey(`eve.subagentDepth`),CapabilitiesKey=new ContextKey(`eve.capabilities`),SessionCallbackKey=new ContextKey(SESSION_CALLBACK_CONTEXT_KEY_NAME),SessionKey=new ContextKey(`eve.session`),SandboxKey=new ContextKey(`eve.sandbox`),HandleEventKey=new ContextKey(`eve.internal.handleEvent`),SessionDynamicModelReferenceKey=new ContextKey(`eve.sessionDynamicModelReference`),TurnDynamicModelReferenceKey=new ContextKey(`eve.turnDynamicModelReference`),RuntimeModelMetadataCacheKey=new ContextKey(`eve.runtimeModelMetadataCache`),LiveStepDynamicModelSelectionKey=new ContextKey(`eve.liveStepDynamicModelSelection`),SessionDynamicToolMetadataKey=new ContextKey(`eve.sessionDynamicToolMetadata`),SessionDynamicToolRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicToolRuntimeRevision`),TurnDynamicToolMetadataKey=new ContextKey(`eve.turnDynamicToolMetadata`),StepDynamicToolMetadataKey=new ContextKey(`eve.stepDynamicToolMetadata`),TasksEnabledKey=new ContextKey(`eve.tasksEnabled`),SessionDynamicSubagentSelectionsKey=new ContextKey(`eve.sessionDynamicSubagentSelections`),TurnDynamicSubagentSelectionsKey=new ContextKey(`eve.turnDynamicSubagentSelections`),SessionDynamicSubagentRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicSubagentRuntimeRevision`),DynamicSubagentAgentConfigKey=new ContextKey(`eve.dynamicSubagentAgentConfig`),DynamicSkillManifestKey=new ContextKey(`eve.dynamicSkillManifest`),SessionDynamicInstructionsKey=new ContextKey(`eve.sessionDynamicInstructions`),TurnDynamicInstructionsKey=new ContextKey(`eve.turnDynamicInstructions`),DynamicInstructionResolveMessagesKey=new ContextKey(`eve.dynamicInstructionResolveMessages`),PendingDynamicInstructionUserMessagesKey=new ContextKey(`eve.pendingDynamicInstructionUserMessages`);export{ActiveChannelDeliveriesKey,AuthKey,CapabilitiesKey,ChannelDeliveryKey,ChannelInstrumentationKey,ChannelRequestIdKey,ContinuationTokenKey,DynamicInstructionResolveMessagesKey,DynamicSkillManifestKey,DynamicSubagentAgentConfigKey,HandleEventKey,InitiatorAuthKey,LiveStepDynamicModelSelectionKey,ModeKey,OtelTraceEnabledKey,ParentSessionKey,ParentTraceContextKey,PendingDynamicInstructionUserMessagesKey,RuntimeModelMetadataCacheKey,SandboxKey,SessionCallbackKey,SessionDynamicInstructionsKey,SessionDynamicModelReferenceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicSubagentSelectionsKey,SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,SessionKey,SessionTraceSeedKey,StepDynamicToolMetadataKey,SubagentDepthKey,TasksEnabledKey,TurnDynamicInstructionsKey,TurnDynamicModelReferenceKey,TurnDynamicSubagentSelectionsKey,TurnDynamicToolMetadataKey,TurnTaskDeliveryKey,TurnTaskStateKey};
1
+ import{ContextKey}from"#context/key.js";import{SESSION_CALLBACK_CONTEXT_KEY_NAME}from"#context/key-names.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),TurnTaskDeliveryKey=new ContextKey(`eve.turnTaskDelivery`),TurnTaskStateKey=new ContextKey(`eve.turnTaskState`),ActiveChannelDeliveriesKey=new ContextKey(`eve.activeChannelDeliveries`),ChannelInstrumentationKey=new ContextKey(`eve.channelInstrumentation`),ModeKey=new ContextKey(`eve.mode`),ParentSessionKey=new ContextKey(`eve.parentSession`),ParentTraceContextKey=new ContextKey(`eve.parentTraceContext`),SessionTraceSeedKey=new ContextKey(`eve.sessionTraceSeed`),OtelTraceEnabledKey=new ContextKey(`eve.otelTraceEnabled`),SubagentDepthKey=new ContextKey(`eve.subagentDepth`),CapabilitiesKey=new ContextKey(`eve.capabilities`),SessionCallbackKey=new ContextKey(SESSION_CALLBACK_CONTEXT_KEY_NAME),SessionKey=new ContextKey(`eve.session`),SandboxKey=new ContextKey(`eve.sandbox`),HandleEventKey=new ContextKey(`eve.internal.handleEvent`),SessionDynamicModelReferenceKey=new ContextKey(`eve.sessionDynamicModelReference`),TurnDynamicModelReferenceKey=new ContextKey(`eve.turnDynamicModelReference`),RuntimeModelMetadataCacheKey=new ContextKey(`eve.runtimeModelMetadataCache`),LiveStepDynamicModelSelectionKey=new ContextKey(`eve.liveStepDynamicModelSelection`),SessionDynamicToolMetadataKey=new ContextKey(`eve.sessionDynamicToolMetadata`),SessionDynamicToolRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicToolRuntimeRevision`),TurnDynamicToolMetadataKey=new ContextKey(`eve.turnDynamicToolMetadata`),TurnMemoryLocksKey=new ContextKey(`eve.memory.turnLocks`),PreparedMemoryPreambleKey=new ContextKey(`eve.memory.preparedPreamble`),PendingMemoryCommitKey=new ContextKey(`eve.memory.pendingCommit`),PreparedMemoryCompactionKey=new ContextKey(`eve.memory.preparedCompaction`),StepDynamicToolMetadataKey=new ContextKey(`eve.stepDynamicToolMetadata`),TasksEnabledKey=new ContextKey(`eve.tasksEnabled`),SessionDynamicSubagentSelectionsKey=new ContextKey(`eve.sessionDynamicSubagentSelections`),TurnDynamicSubagentSelectionsKey=new ContextKey(`eve.turnDynamicSubagentSelections`),SessionDynamicSubagentRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicSubagentRuntimeRevision`),DynamicSubagentAgentConfigKey=new ContextKey(`eve.dynamicSubagentAgentConfig`),DynamicSkillManifestKey=new ContextKey(`eve.dynamicSkillManifest`),SessionDynamicInstructionsKey=new ContextKey(`eve.sessionDynamicInstructions`),TurnDynamicInstructionsKey=new ContextKey(`eve.turnDynamicInstructions`),DynamicInstructionResolveMessagesKey=new ContextKey(`eve.dynamicInstructionResolveMessages`),PendingDynamicInstructionUserMessagesKey=new ContextKey(`eve.pendingDynamicInstructionUserMessages`);export{ActiveChannelDeliveriesKey,AuthKey,CapabilitiesKey,ChannelDeliveryKey,ChannelInstrumentationKey,ChannelRequestIdKey,ContinuationTokenKey,DynamicInstructionResolveMessagesKey,DynamicSkillManifestKey,DynamicSubagentAgentConfigKey,HandleEventKey,InitiatorAuthKey,LiveStepDynamicModelSelectionKey,ModeKey,OtelTraceEnabledKey,ParentSessionKey,ParentTraceContextKey,PendingDynamicInstructionUserMessagesKey,PendingMemoryCommitKey,PreparedMemoryCompactionKey,PreparedMemoryPreambleKey,RuntimeModelMetadataCacheKey,SandboxKey,SessionCallbackKey,SessionDynamicInstructionsKey,SessionDynamicModelReferenceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicSubagentSelectionsKey,SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,SessionKey,SessionTraceSeedKey,StepDynamicToolMetadataKey,SubagentDepthKey,TasksEnabledKey,TurnDynamicInstructionsKey,TurnDynamicModelReferenceKey,TurnDynamicSubagentSelectionsKey,TurnDynamicToolMetadataKey,TurnMemoryLocksKey,TurnTaskDeliveryKey,TurnTaskStateKey};
@@ -0,0 +1,13 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { AlsContext } from "#context/container.js";
3
+ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
4
+ import type { ResolvedMemoryDefinition } from "#runtime/types.js";
5
+ export declare function dispatchMemoryLifecycleEvent(input: {
6
+ readonly abortSignal?: AbortSignal;
7
+ readonly appRoot: string;
8
+ readonly ctx: AlsContext;
9
+ readonly event: UnstampedMessageStreamEvent;
10
+ readonly memories: readonly ResolvedMemoryDefinition[];
11
+ readonly messages?: readonly ModelMessage[];
12
+ readonly nodeId: string;
13
+ }): Promise<readonly ModelMessage[]>;
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{dispatchMemoryCompactionCompleted,dispatchMemoryCompactionRequested,dispatchMemoryTurnCompleted,dispatchMemoryTurnStarted}from"#context/memory-lifecycle.js";const log=createLogger(`memory`);async function dispatchMemoryLifecycleEvent(e){let t=e.messages??[];if(e.memories.length===0)return t;if(e.event.type===`turn.started`)return await dispatchMemoryTurnStarted({abortSignal:e.abortSignal,appRoot:e.appRoot,ctx:e.ctx,event:e.event,memories:e.memories,nodeId:e.nodeId});if(e.event.type===`compaction.requested`)await dispatchMemoryCompactionRequested({abortSignal:e.abortSignal,appRoot:e.appRoot,ctx:e.ctx,event:e.event,memories:e.memories,messages:t,nodeId:e.nodeId});else if(e.event.type===`compaction.completed`)t=await dispatchMemoryCompactionCompleted({abortSignal:e.abortSignal,ctx:e.ctx,event:e.event,memories:e.memories,messages:t});else if(e.event.type===`turn.completed`&&e.messages!==void 0)try{await dispatchMemoryTurnCompleted({abortSignal:e.abortSignal,ctx:e.ctx,event:e.event,memories:e.memories,messages:t})}catch(e){log.error(`Completed-turn memory capture failed.`,{error:e})}return t}export{dispatchMemoryLifecycleEvent};
@@ -0,0 +1,52 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { AlsContext } from "#context/container.js";
3
+ import type { CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, TurnCompletedStreamEvent, TurnStartedStreamEvent } from "#protocol/message.js";
4
+ import type { ResolvedMemoryDefinition } from "#runtime/types.js";
5
+ export declare function prepareMemoryPreamble(ctx: AlsContext, input: {
6
+ readonly history: readonly ModelMessage[];
7
+ readonly input: readonly ModelMessage[];
8
+ readonly state?: Readonly<Record<string, unknown>>;
9
+ }): void;
10
+ export declare function dispatchMemoryTurnStarted(input: {
11
+ readonly abortSignal?: AbortSignal;
12
+ readonly appRoot: string;
13
+ readonly ctx: AlsContext;
14
+ readonly event: TurnStartedStreamEvent;
15
+ readonly memories: readonly ResolvedMemoryDefinition[];
16
+ readonly nodeId: string;
17
+ }): Promise<readonly ModelMessage[]>;
18
+ export declare function drainMemoryCommit(ctx: AlsContext): import("#context/keys.js").PendingMemoryCommit | undefined;
19
+ export declare function prepareMemoryCompaction(ctx: AlsContext, input: {
20
+ readonly history: readonly ModelMessage[];
21
+ readonly state?: Readonly<Record<string, unknown>>;
22
+ }): void;
23
+ export declare function dispatchMemoryCompactionRequested(input: {
24
+ readonly abortSignal?: AbortSignal;
25
+ readonly appRoot: string;
26
+ readonly ctx: AlsContext;
27
+ readonly event: CompactionRequestedStreamEvent;
28
+ readonly memories: readonly ResolvedMemoryDefinition[];
29
+ readonly messages: readonly ModelMessage[];
30
+ readonly nodeId: string;
31
+ }): Promise<void>;
32
+ export declare function dispatchMemoryCompactionCompleted(input: {
33
+ readonly abortSignal?: AbortSignal;
34
+ readonly ctx: AlsContext;
35
+ readonly event: CompactionCompletedStreamEvent;
36
+ readonly memories: readonly ResolvedMemoryDefinition[];
37
+ readonly messages: readonly ModelMessage[];
38
+ }): Promise<readonly ModelMessage[]>;
39
+ export declare function dispatchMemoryTurnCompleted(input: {
40
+ readonly abortSignal?: AbortSignal;
41
+ readonly ctx: AlsContext;
42
+ readonly event: TurnCompletedStreamEvent;
43
+ readonly memories: readonly ResolvedMemoryDefinition[];
44
+ readonly messages: readonly ModelMessage[];
45
+ }): Promise<void>;
46
+ export declare function memoryOperationId(input: {
47
+ readonly phase: string;
48
+ readonly sequence: number;
49
+ readonly sessionId: string;
50
+ readonly slot: string;
51
+ readonly turnId: string | null;
52
+ }): string;
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{PendingMemoryCommitKey,PreparedMemoryCompactionKey,PreparedMemoryPreambleKey,TurnMemoryLocksKey}from"#context/keys.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isEveDevEnvironment}from"#internal/application/dev-environment.js";import{defaultNamespace}from"#public/memory/index.js";import{applyMemoryRecallBatches,createMemoryLock,projectMemoryHistory,validateMemoryRecallResult}from"#shared/memory-state.js";const fallbackAbortSignal=new AbortController().signal,log=createLogger(`memory`);function prepareMemoryPreamble(e,t){e.setVirtualContext(PreparedMemoryPreambleKey,{history:t.history,input:t.input,state:t.state})}async function dispatchMemoryTurnStarted(e){let n=e.ctx.get(PreparedMemoryPreambleKey);if(n===void 0)return[];let o=Object.freeze({id:e.event.data.turnId,input:Object.freeze([...n.input]),sequence:e.event.data.sequence}),s=Object.fromEntries((await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let n=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:o});return n===null?null:[t.slot,n]}))).filter(e=>e!==null));e.ctx.set(TurnMemoryLocksKey,s);let c=projectMemoryHistory({locks:s,messages:n.history}),l=buildCallbackContext(),u=applyMemoryRecallBatches({batches:(await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let n=s[t.slot];if(n===void 0)return null;let r=memoryOperationId({phase:`turn.started`,sequence:e.event.data.sequence,sessionId:l.session.id,slot:t.slot,turnId:o.id});return{lock:n,messages:validateMemoryRecallResult(await t.provider.recall[`turn.started`]({...l,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:n.scope,slot:t.slot},messages:c,operationId:r,turn:o}),t.slot),operationId:r}}))).filter(e=>e!==null),history:n.history,state:n.state}),d=[...projectMemoryHistory({locks:s,messages:u.history}),...n.input];return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:u.history,projectedMessages:d,state:u.state}),d}function drainMemoryCommit(e){let n=e.get(PendingMemoryCommitKey);return e.delete(PendingMemoryCommitKey),e.delete(PreparedMemoryPreambleKey),n}function prepareMemoryCompaction(e,t){e.setVirtualContext(PreparedMemoryCompactionKey,t)}async function dispatchMemoryCompactionRequested(e){let t=buildCallbackContext(),n=await resolveCompactionLocks(e);e.ctx.set(TurnMemoryLocksKey,n);let r=e.event.data.turnId.length===0?null:firstLockedTurn(n);await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=n[i.slot],o=i.provider.capture?.[`compaction.requested`];a===void 0||o===void 0||await o({...t,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId,usageInputTokens:e.event.data.usageInputTokens},memory:{scope:a.scope,slot:i.slot},messages:e.messages,operationId:memoryOperationId({phase:`compaction.requested`,sequence:e.event.data.sequence,sessionId:t.session.id,slot:i.slot,turnId:r?.id??null}),turn:r})}))}async function dispatchMemoryCompactionCompleted(e){let r=e.ctx.get(PreparedMemoryCompactionKey),o=r?.history??e.messages,s=e.ctx.get(TurnMemoryLocksKey)??{},c=projectMemoryHistory({locks:s,messages:o}),l=buildCallbackContext(),u=e.event.data.turnId.length===0?null:firstLockedTurn(s),d=applyMemoryRecallBatches({batches:(await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async t=>{let n=s[t.slot],r=t.provider.recall[`compaction.completed`];if(n===void 0||r===void 0)return null;let i=memoryOperationId({phase:`compaction.completed`,sequence:e.event.data.sequence,sessionId:l.session.id,slot:t.slot,turnId:u?.id??null});return{lock:n,messages:validateMemoryRecallResult(await r({...l,abortSignal:e.abortSignal??fallbackAbortSignal,compaction:{modelId:e.event.data.modelId},memory:{scope:n.scope,slot:t.slot},messages:c,operationId:i,turn:u}),t.slot),operationId:i}}))).filter(e=>e!==null),history:o,state:r?.state}),f=projectMemoryHistory({locks:s,messages:d.history});return e.ctx.setVirtualContext(PendingMemoryCommitKey,{history:d.history,projectedMessages:f,state:d.state}),e.ctx.delete(PreparedMemoryCompactionKey),f}async function dispatchMemoryTurnCompleted(e){let t=e.ctx.get(TurnMemoryLocksKey)??{},n=buildCallbackContext(),r=projectMemoryHistory({locks:t,messages:e.messages});await Promise.all([...e.memories].sort((e,t)=>e.logicalPath.localeCompare(t.logicalPath)).map(async i=>{let a=t[i.slot],o=i.provider.capture?.[`turn.completed`];a===void 0||o===void 0||await o({...n,abortSignal:e.abortSignal??fallbackAbortSignal,memory:{scope:a.scope,slot:i.slot},messages:r,operationId:memoryOperationId({phase:`turn.completed`,sequence:e.event.data.sequence,sessionId:n.session.id,slot:i.slot,turnId:e.event.data.turnId}),turn:a.turn})}))}async function resolveCompactionLocks(e){let t=e.ctx.get(TurnMemoryLocksKey);if(e.event.data.turnId.length>0&&t!==void 0)return t;let n=Object.freeze({id:``,input:[],sequence:e.event.data.sequence});return Object.fromEntries((await Promise.all(e.memories.map(async t=>{let r=await resolveMemoryLock({abortSignal:e.abortSignal??fallbackAbortSignal,appRoot:e.appRoot,ctx:e.ctx,memory:t,nodeId:e.nodeId,turn:n});return r===null?null:[t.slot,r]}))).filter(e=>e!==null))}function firstLockedTurn(e){return Object.values(e)[0]?.turn??null}async function resolveMemoryLock(e){let t=buildResolveContext(e.ctx,[]),n={abortSignal:e.abortSignal,channel:t.channel,session:t.session},r=typeof e.memory.scope==`function`?await e.memory.scope(n):e.memory.scope;if(r===null)return reportDisabledMemorySlot(e.memory.slot,`scope`),null;let i={appRoot:e.appRoot,node:e.nodeId,slot:e.memory.slot},a=e.memory.namespace===void 0?defaultNamespace(i):typeof e.memory.namespace==`function`?await e.memory.namespace(i):e.memory.namespace;return a===null?(reportDisabledMemorySlot(e.memory.slot,`namespace`),null):createMemoryLock({namespace:a,scope:r,slot:e.memory.slot,turn:e.turn,visibility:e.memory.visibility})}function reportDisabledMemorySlot(e,t){isEveDevEnvironment()&&log.info(`Memory slot is disabled for this operation`,{resolver:t,slot:e})}function memoryOperationId(e){return[`eve-memory-operation-v1`,e.sessionId,String(e.sequence),e.turnId??`standalone`,e.phase,e.slot].join(`:`)}export{dispatchMemoryCompactionCompleted,dispatchMemoryCompactionRequested,dispatchMemoryTurnCompleted,dispatchMemoryTurnStarted,drainMemoryCommit,memoryOperationId,prepareMemoryCompaction,prepareMemoryPreamble};
@@ -0,0 +1,12 @@
1
+ import type { MemoryDefinition } from "#public/memory/index.js";
2
+ export declare function createMemoryToolDynamicDefinition(definition: MemoryDefinition, slot: string): import("#dynamic/definition.js").DynamicSentinel<{
3
+ [k: string]: {
4
+ approval?: import("#approval/definition.js").Approval<never>;
5
+ execution?: never;
6
+ execute(input: never, context: import("../tools/definition.ts").ToolContext): unknown | Promise<unknown> | AsyncIterable<unknown>;
7
+ inputSchema: unknown;
8
+ outputSchema?: unknown;
9
+ toModelOutput?: (output: never) => import("../tools/model-output.ts").ToolModelOutput | Promise<import("../tools/model-output.ts").ToolModelOutput>;
10
+ description: string;
11
+ };
12
+ } | null>;
@@ -0,0 +1 @@
1
+ import{TurnMemoryLocksKey}from"#context/keys.js";import{parseJsonObject}from"#shared/json.js";import{defineDynamic}from"#dynamic/definition.js";import{loadContext}from"#context/container.js";import{stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{isBrandedToolEntry}from"#tools/dynamic.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{TOOL_SLUG_PATTERN}from"#discover/grammar.js";import{markDynamicCallbackRebind}from"#internal/dynamic-tool-rebind.js";function createMemoryToolDynamicDefinition(t,a){return markDynamicCallbackRebind(defineDynamic({events:{"turn.started":async(n,o)=>{let s=loadContext().get(TurnMemoryLocksKey)?.[a];if(s===void 0||t.provider.tools===void 0)return null;let c={...o,memory:{scope:s.scope,slot:a},turn:s.turn},l=await t.provider.tools(c);if(l===null)return null;if(typeof l!=`object`||Array.isArray(l))throw Error(`Memory slot "${a}" provider.tools() must return a tool map or null.`);return Object.fromEntries(Object.entries(l).map(([e,n])=>{let r=`${a}__${e}`;if(!TOOL_SLUG_PATTERN.test(r))throw Error(`Memory provider tool name "${r}" must start with an ASCII letter, contain only letters, digits, underscores, or dashes, and be at most 64 characters.`);if(!isBrandedToolEntry(n))throw Error(`Memory provider tool "${r}" must be created with defineTool().`);let o=t.description===void 0?n.description:`${t.description}\n\n${n.description}`,s={...n,description:o};return stampDurableDynamicToolCallbacks(s,createProviderToolCallbacks({context:c,definition:t,key:e,tool:n})),[r,s]}))}}}))}function createProviderToolCallbacks(e){let n=parseJsonObject({context:e.context,key:e.key}),loadTool=async t=>{let n=t.key,r=t.context;if(typeof n!=`string`||typeof r!=`object`||!r)throw Error(`Memory provider tool callback has an invalid durable closure.`);let i=(await e.definition.provider.tools?.(readMemoryToolsContext(r)))?.[n];if(i===void 0||!isBrandedToolEntry(i))throw Error(`Memory provider tool "${n}" was removed or renamed.`);return i},r={execute:{callback:async(e,t,n)=>await(await loadTool(e)).execute(t,n),closure:n}};return e.tool.approval!==void 0&&(r.approvalRequest={callback:async(e,t)=>await resolveApprovalPolicy((await loadTool(e)).approval)(t),closure:n},typeof e.tool.approval!=`function`&&e.tool.approval.response!==void 0&&(r.approvalResponse={callback:async(t,n)=>{let r=(await loadTool(t)).approval;if(r===void 0||typeof r==`function`||r.response===void 0)throw Error(`Memory provider tool "${e.key}" approval response was removed.`);return await r.response(n)},closure:n})),e.tool.toModelOutput!==void 0&&(r.toModelOutput={callback:async(e,t)=>await(await loadTool(e)).toModelOutput(t),closure:n}),r}function readMemoryToolsContext(e){if(typeof e!=`object`||!e||Array.isArray(e))throw Error(`Memory provider tool callback has an invalid durable context.`);let t=e;if(typeof t.channel!=`object`||t.channel===null||typeof t.memory!=`object`||t.memory===null||!Array.isArray(t.messages)||typeof t.session!=`object`||t.session===null||typeof t.turn!=`object`||t.turn===null)throw Error(`Memory provider tool callback has an invalid durable context.`);return t}export{createMemoryToolDynamicDefinition};
@@ -1 +1 @@
1
- import{join,resolve}from"node:path";import{classifyAgentRootEntry,normalizeLogicalPath}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createDiskProjectSource}from"#discover/project-source.js";import{createAgentSourceManifest,createModuleSourceRef}from"#discover/manifest.js";import{DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,locateExtensionMount,mountNamespace}from"#discover/extensions.js";import{DISCOVER_CHANNELS_DIRECTORY_INVALID,DISCOVER_EXTENSIONS_DIRECTORY_INVALID,DISCOVER_HOOKS_DIRECTORY_INVALID,DISCOVER_TOOLS_DIRECTORY_INVALID,createChannelNameDiagnostic,createExtensionNameDiagnostic,createHookNameDiagnostic,createToolNameDiagnostic,createUnsupportedRootDirectoryDiagnostics,discoverFlatModuleSource,discoverInstructionsSource,discoverNamedSourceDirectory,readSortedDirectoryEntries}from"#discover/grammar.js";import{discoverConnectionSources}from"#discover/connections.js";import{discoverSubagents}from"#discover/discover-subagent.js";import{discoverLibSources}from"#discover/lib.js";import{discoverSandboxSource}from"#discover/sandbox.js";import{discoverScheduleSources}from"#discover/schedules.js";import{discoverSkills}from"#discover/skills.js";import{stripNpmPackageScope}from"#shared/package-name.js";async function discoverAgent(r){let s=r.source??createDiskProjectSource(),l=resolve(r.appRoot),u=resolve(r.agentRoot),p=r.role??`agent`,m=[],g=await tryReadPackageJsonName(s,l),_=await readSortedDirectoryEntries(s,u);m.push(...createUnsupportedRootDirectoryDiagnostics({classifyEntry:classifyAgentRootEntry,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the agent root.`},rootEntries:_,rootPath:u}));let v=await discoverInstructionsSource({rootEntries:_,rootPath:u,source:s,required:p!==`extension`});m.push(...v.diagnostics);let y=discoverFlatModuleSource({rootEntries:_,rootPath:u,slotName:`agent`});m.push(...y.diagnostics);let b=discoverFlatModuleSource({rootEntries:_,rootPath:u,slotName:`instrumentation`});m.push(...b.diagnostics);let x=await discoverNamedSourceDirectory({directoryName:`channels`,invalidDirectoryCode:DISCOVER_CHANNELS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(u,`channels`)}" to be a directory of authored channels.`,recursive:!0,rootEntries:_,rootPath:u,source:s,validateSegment:createChannelNameDiagnostic});m.push(...x.diagnostics);let S=await discoverLibSources({agentRoot:u,rootEntries:_,source:s});m.push(...S.diagnostics);let C=await discoverScheduleSources({agentRoot:u,rootEntries:_,source:s});m.push(...C.diagnostics);let w=await discoverConnectionSources({rootEntries:_,rootPath:u,source:s});m.push(...w.diagnostics);let T=await discoverSandboxSource({rootEntries:_,rootPath:u,source:s});m.push(...T.diagnostics),p===`extension`&&(y.module!==void 0&&m.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,message:`An extension may not declare agent config (agent.ts) — model, limits, and sandbox are the consuming agent's to own.`,sourcePath:join(u,y.module.logicalPath)})),T.sandbox!==null&&m.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,message:`An extension may not declare a sandbox — it is the consuming agent's to own.`,sourcePath:join(u,T.sandbox.logicalPath)})));let E=await discoverNamedSourceDirectory({directoryName:`tools`,invalidDirectoryCode:DISCOVER_TOOLS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(u,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:_,rootPath:u,source:s,validateSegment:createToolNameDiagnostic});m.push(...E.diagnostics);let D=await discoverNamedSourceDirectory({directoryName:`hooks`,invalidDirectoryCode:DISCOVER_HOOKS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(u,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:_,rootPath:u,source:s,validateSegment:createHookNameDiagnostic});m.push(...D.diagnostics);let O=await discoverNamedSourceDirectory({directoryName:`extensions`,invalidDirectoryCode:DISCOVER_EXTENSIONS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(u,`extensions`)}" to be a directory of extension mounts.`,recursive:!1,rootEntries:_,rootPath:u,source:s,validateSegment:createExtensionNameDiagnostic});m.push(...O.diagnostics);let k=await discoverSkills({agentRoot:u,source:s});m.push(...k.diagnostics);let A=await discoverSubagents({agentRoot:u,appRoot:l,source:s});m.push(...A.diagnostics);let j=await collectExtensionMounts({agentRoot:u,fileMounts:O.sources,rootEntries:_,source:s});m.push(...j.diagnostics);let M=[];if(p!==`agent`)for(let t of j.mounts)m.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,message:`"${t.mountRef.logicalPath}" mounts an extension from inside an extension, which is not supported yet. Extensions cannot mount other extensions; remove the "extensions/" slot.`,sourcePath:join(u,t.mountRef.logicalPath)}));else{let e=await resolveExtensionMounts({agentRoot:u,appRoot:l,mounts:j.mounts,source:s});m.push(...e.diagnostics),M=e.mounts}let N={agentRoot:u,appRoot:l,channels:x.sources,connections:w.connections,packageName:g,diagnostics:m,extensions:j.mounts.map(e=>e.mountRef),resolvedExtensions:M,hooks:D.sources,lib:S.lib,instructions:v.instructions,sandbox:T.sandbox,sandboxWorkspaces:T.sandboxWorkspace===null?[]:[T.sandboxWorkspace],schedules:C.schedules,skills:k.skills,tools:E.sources,subagents:A.subagents};return y.module!==void 0&&(N.configModule=y.module),b.module!==void 0&&(N.instrumentation=b.module),{diagnostics:m,manifest:createAgentSourceManifest(N)}}async function resolveExtensionMounts(e){let t=[],n=[];for(let r of e.mounts){let i=await locateExtensionMount({source:e.source,agentRoot:e.agentRoot,appRoot:e.appRoot,mount:r.mountRef,namespace:r.namespace});if(t.push(...i.diagnostics),i.location===void 0)continue;let a=await discoverAgent({agentRoot:i.location.sourceRoot,appRoot:i.location.packageRoot,source:e.source,role:`extension`});t.push(...a.diagnostics);let o;if(r.overridesRoot!==void 0){let n=await discoverAgent({agentRoot:r.overridesRoot,appRoot:e.appRoot,source:e.source,role:`extension`});t.push(...n.diagnostics),o=n.manifest}n.push({namespace:i.location.namespace,specifier:i.location.specifier,packageName:i.location.packageName,packageRoot:i.location.packageRoot,sourceRoot:i.location.sourceRoot,manifest:a.manifest,externalDependencies:i.location.externalDependencies,overrides:o})}return{diagnostics:t,mounts:n}}async function discoverExtensionMountDeclarations(n){let r=n.source??createDiskProjectSource(),i=resolve(n.agentRoot),o=await readSortedDirectoryEntries(r,i),s=await discoverNamedSourceDirectory({directoryName:`extensions`,invalidDirectoryCode:DISCOVER_EXTENSIONS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(i,`extensions`)}" to be a directory of extension mounts.`,recursive:!1,rootEntries:o,rootPath:i,source:r,validateSegment:createExtensionNameDiagnostic}),c=await collectExtensionMounts({agentRoot:i,fileMounts:s.sources,rootEntries:o,source:r});return{diagnostics:[...s.diagnostics,...c.diagnostics],mounts:c.mounts}}async function collectExtensionMounts(t){let n=[],a=join(t.agentRoot,`extensions`),o=t.fileMounts.map(e=>({namespace:mountNamespace(e.logicalPath),mountRef:e})),c=new Set(o.map(e=>e.namespace)),d=t.rootEntries.find(e=>e.name===`extensions`),f=[],p=new Set;if(d?.isDirectory()===!0){let o=await readSortedDirectoryEntries(t.source,a);for(let l of o){if(!l.isDirectory())continue;let o=l.name,d=join(a,o),m=createExtensionNameDiagnostic(o,d);if(m!==null){n.push(m);continue}let h=discoverFlatModuleSource({rootEntries:await readSortedDirectoryEntries(t.source,d),rootPath:d,slotName:`extension`});if(n.push(...h.diagnostics),h.module===void 0){n.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,message:`Extension mount directory "extensions/${o}/" must declare its mount in "extension.ts" (or another supported module extension).`,sourcePath:d}));continue}c.has(o)&&p.add(o),f.push({namespace:o,mountRef:createModuleSourceRef({logicalPath:normalizeLogicalPath(join(`extensions`,o,h.module.logicalPath))}),overridesRoot:d})}}for(let e of p)n.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,message:`Extension namespace "${e}" is claimed by both a file mount ("extensions/${e}.ts") and a directory mount ("extensions/${e}/"). Keep only one.`,sourcePath:a}));return{diagnostics:n,mounts:[...o,...f].filter(e=>!p.has(e.namespace))}}async function tryReadPackageJsonName(t,n){try{let r=join(n,`package.json`),i=JSON.parse(await t.readTextFile(r)).name;return typeof i!=`string`||i.length===0?void 0:stripNpmPackageScope(i)}catch{return}}export{discoverAgent,discoverExtensionMountDeclarations,resolveExtensionMounts};
1
+ import{join,resolve}from"node:path";import{classifyAgentRootEntry,normalizeLogicalPath}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createDiskProjectSource}from"#discover/project-source.js";import{createAgentSourceManifest,createModuleSourceRef}from"#discover/manifest.js";import{DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,DISCOVER_EXTENSION_INSTRUMENTATION_UNSUPPORTED,DISCOVER_EXTENSION_MEMORY_UNSUPPORTED,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,locateExtensionMount,mountNamespace}from"#discover/extensions.js";import{DISCOVER_CHANNELS_DIRECTORY_INVALID,DISCOVER_EXTENSIONS_DIRECTORY_INVALID,DISCOVER_HOOKS_DIRECTORY_INVALID,DISCOVER_TOOLS_DIRECTORY_INVALID,createChannelNameDiagnostic,createExtensionNameDiagnostic,createHookNameDiagnostic,createToolNameDiagnostic,createUnsupportedRootDirectoryDiagnostics,discoverFlatModuleSource,discoverInstructionsSource,discoverNamedSourceDirectory,readSortedDirectoryEntries}from"#discover/grammar.js";import{discoverConnectionSources}from"#discover/connections.js";import{discoverSubagents}from"#discover/discover-subagent.js";import{discoverLibSources}from"#discover/lib.js";import{discoverMemorySources}from"#discover/memory.js";import{discoverSandboxSource}from"#discover/sandbox.js";import{discoverScheduleSources}from"#discover/schedules.js";import{discoverSkills}from"#discover/skills.js";import{stripNpmPackageScope}from"#shared/package-name.js";async function discoverAgent(r){let s=r.source??createDiskProjectSource(),d=resolve(r.appRoot),f=resolve(r.agentRoot),h=r.role??`agent`,g=[],_=await tryReadPackageJsonName(s,d),v=await readSortedDirectoryEntries(s,f);g.push(...createUnsupportedRootDirectoryDiagnostics({classifyEntry:classifyAgentRootEntry,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the agent root.`},rootEntries:v,rootPath:f}));let y=await discoverInstructionsSource({rootEntries:v,rootPath:f,source:s,required:h!==`extension`});g.push(...y.diagnostics);let b=discoverFlatModuleSource({rootEntries:v,rootPath:f,slotName:`agent`});g.push(...b.diagnostics);let x=discoverFlatModuleSource({rootEntries:v,rootPath:f,slotName:`instrumentation`});g.push(...x.diagnostics);let S=await discoverNamedSourceDirectory({directoryName:`channels`,invalidDirectoryCode:DISCOVER_CHANNELS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(f,`channels`)}" to be a directory of authored channels.`,recursive:!0,rootEntries:v,rootPath:f,source:s,validateSegment:createChannelNameDiagnostic});g.push(...S.diagnostics);let C=await discoverLibSources({agentRoot:f,rootEntries:v,source:s});g.push(...C.diagnostics);let w=await discoverScheduleSources({agentRoot:f,rootEntries:v,source:s});g.push(...w.diagnostics);let T=await discoverConnectionSources({rootEntries:v,rootPath:f,source:s});g.push(...T.diagnostics);let E=await discoverMemorySources({rootEntries:v,rootPath:f,source:s});g.push(...E.diagnostics);let D=await discoverSandboxSource({rootEntries:v,rootPath:f,source:s});if(g.push(...D.diagnostics),h===`extension`){b.module!==void 0&&g.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,message:`An extension may not declare agent config (agent.ts) — model, limits, and sandbox are the consuming agent's to own.`,sourcePath:join(f,b.module.logicalPath)})),x.module!==void 0&&g.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_INSTRUMENTATION_UNSUPPORTED,message:`An extension may not declare instrumentation — it is a singleton owned by the consuming agent.`,sourcePath:join(f,x.module.logicalPath)}));let[t]=E.memories;t!==void 0&&g.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MEMORY_UNSUPPORTED,message:`An extension may not declare memory — scope and lifecycle state belong to the consuming application.`,sourcePath:join(f,t.logicalPath)})),D.sandbox!==null&&g.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,message:`An extension may not declare a sandbox — it is the consuming agent's to own.`,sourcePath:join(f,D.sandbox.logicalPath)}))}let O=await discoverNamedSourceDirectory({directoryName:`tools`,invalidDirectoryCode:DISCOVER_TOOLS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(f,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:v,rootPath:f,source:s,validateSegment:createToolNameDiagnostic});g.push(...O.diagnostics);let k=await discoverNamedSourceDirectory({directoryName:`hooks`,invalidDirectoryCode:DISCOVER_HOOKS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(f,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:v,rootPath:f,source:s,validateSegment:createHookNameDiagnostic});g.push(...k.diagnostics);let A=await discoverNamedSourceDirectory({directoryName:`extensions`,invalidDirectoryCode:DISCOVER_EXTENSIONS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(f,`extensions`)}" to be a directory of extension mounts.`,recursive:!1,rootEntries:v,rootPath:f,source:s,validateSegment:createExtensionNameDiagnostic});g.push(...A.diagnostics);let j=await discoverSkills({agentRoot:f,source:s});g.push(...j.diagnostics);let M=await discoverSubagents({agentRoot:f,appRoot:d,source:s});g.push(...M.diagnostics);let N=await collectExtensionMounts({agentRoot:f,fileMounts:A.sources,rootEntries:v,source:s});g.push(...N.diagnostics);let P=[];if(h!==`agent`)for(let t of N.mounts)g.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,message:`"${t.mountRef.logicalPath}" mounts an extension from inside an extension, which is not supported yet. Extensions cannot mount other extensions; remove the "extensions/" slot.`,sourcePath:join(f,t.mountRef.logicalPath)}));else{let e=await resolveExtensionMounts({agentRoot:f,appRoot:d,mounts:N.mounts,source:s});g.push(...e.diagnostics),P=e.mounts}let F={agentRoot:f,appRoot:d,channels:S.sources,connections:T.connections,packageName:_,diagnostics:g,extensions:h===`extension`?[]:N.mounts.map(e=>e.mountRef),resolvedExtensions:P,hooks:k.sources,memories:h===`extension`?[]:E.memories,lib:C.lib,instructions:y.instructions,sandbox:h===`extension`?null:D.sandbox,sandboxWorkspaces:h===`extension`||D.sandboxWorkspace===null?[]:[D.sandboxWorkspace],schedules:w.schedules,skills:j.skills,tools:O.sources,subagents:M.subagents};return h!==`extension`&&b.module!==void 0&&(F.configModule=b.module),h!==`extension`&&x.module!==void 0&&(F.instrumentation=x.module),{diagnostics:g,manifest:createAgentSourceManifest(F)}}async function resolveExtensionMounts(e){let t=[],n=[];for(let r of e.mounts){let i=await locateExtensionMount({source:e.source,agentRoot:e.agentRoot,appRoot:e.appRoot,mount:r.mountRef,namespace:r.namespace});if(t.push(...i.diagnostics),i.location===void 0)continue;let a=await discoverAgent({agentRoot:i.location.sourceRoot,appRoot:i.location.packageRoot,source:e.source,role:`extension`});t.push(...a.diagnostics);let o;if(r.overridesRoot!==void 0){let n=await discoverAgent({agentRoot:r.overridesRoot,appRoot:e.appRoot,source:e.source,role:`extension`});t.push(...n.diagnostics),o=n.manifest}n.push({namespace:i.location.namespace,specifier:i.location.specifier,packageName:i.location.packageName,packageRoot:i.location.packageRoot,sourceRoot:i.location.sourceRoot,manifest:a.manifest,externalDependencies:i.location.externalDependencies,overrides:o})}return{diagnostics:t,mounts:n}}async function discoverExtensionMountDeclarations(n){let r=n.source??createDiskProjectSource(),i=resolve(n.agentRoot),o=await readSortedDirectoryEntries(r,i),s=await discoverNamedSourceDirectory({directoryName:`extensions`,invalidDirectoryCode:DISCOVER_EXTENSIONS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(i,`extensions`)}" to be a directory of extension mounts.`,recursive:!1,rootEntries:o,rootPath:i,source:r,validateSegment:createExtensionNameDiagnostic}),c=await collectExtensionMounts({agentRoot:i,fileMounts:s.sources,rootEntries:o,source:r});return{diagnostics:[...s.diagnostics,...c.diagnostics],mounts:c.mounts}}async function collectExtensionMounts(t){let n=[],a=join(t.agentRoot,`extensions`),o=t.fileMounts.map(e=>({namespace:mountNamespace(e.logicalPath),mountRef:e})),c=new Set(o.map(e=>e.namespace)),l=t.rootEntries.find(e=>e.name===`extensions`),u=[],p=new Set;if(l?.isDirectory()===!0){let o=await readSortedDirectoryEntries(t.source,a);for(let l of o){if(!l.isDirectory())continue;let o=l.name,d=join(a,o),m=createExtensionNameDiagnostic(o,d);if(m!==null){n.push(m);continue}let h=discoverFlatModuleSource({rootEntries:await readSortedDirectoryEntries(t.source,d),rootPath:d,slotName:`extension`});if(n.push(...h.diagnostics),h.module===void 0){n.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,message:`Extension mount directory "extensions/${o}/" must declare its mount in "extension.ts" (or another supported module extension).`,sourcePath:d}));continue}c.has(o)&&p.add(o),u.push({namespace:o,mountRef:createModuleSourceRef({logicalPath:normalizeLogicalPath(join(`extensions`,o,h.module.logicalPath))}),overridesRoot:d})}}for(let e of p)n.push(createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,message:`Extension namespace "${e}" is claimed by both a file mount ("extensions/${e}.ts") and a directory mount ("extensions/${e}/"). Keep only one.`,sourcePath:a}));return{diagnostics:n,mounts:[...o,...u].filter(e=>!p.has(e.namespace))}}async function tryReadPackageJsonName(t,n){try{let r=join(n,`package.json`),i=JSON.parse(await t.readTextFile(r)).name;return typeof i!=`string`||i.length===0?void 0:stripNpmPackageScope(i)}catch{return}}export{discoverAgent,discoverExtensionMountDeclarations,resolveExtensionMounts};
@@ -1 +1 @@
1
- import{join,relative,resolve}from"node:path";import{discoverExtensionMountDeclarations,resolveExtensionMounts}from"#discover/discover-agent.js";import{classifyLocalSubagentEntry,getDirectoryEntryType,getSupportedModuleBaseName,normalizeLogicalPath}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createDiskProjectSource}from"#discover/project-source.js";import{createAgentSourceManifest,createLocalSubagentSourceRef,createModuleSourceRef}from"#discover/manifest.js";import{DISCOVER_HOOKS_DIRECTORY_INVALID,DISCOVER_TOOLS_DIRECTORY_INVALID,createHookNameDiagnostic,createToolNameDiagnostic,createUnsupportedRootDirectoryDiagnostics,discoverFlatModuleSource,discoverInstructionsSource,discoverNamedSourceDirectory,readSortedDirectoryEntries}from"#discover/grammar.js";import{discoverConnectionSources}from"#discover/connections.js";import{discoverLibSources}from"#discover/lib.js";import{discoverSandboxSource}from"#discover/sandbox.js";import{discoverSkills}from"#discover/skills.js";const DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID=`discover/local-subagent-schedules-invalid`,DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING=`discover/required-subagent-config-module-missing`,DISCOVER_SUBAGENTS_DIRECTORY_INVALID=`discover/subagents-directory-invalid`;async function discoverSubagents(r){let i=r.source??createDiskProjectSource(),a=resolve(r.agentRoot),o=resolve(r.subagentsDirectoryPath??join(a,`subagents`)),d=normalizeLogicalPath(r.subagentsLogicalPath??relative(a,o)),f=await i.stat(o);if(f===`missing`)return{diagnostics:[],subagents:[]};if(f!==`directory`)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_SUBAGENTS_DIRECTORY_INVALID,message:`Expected "${o}" to be a directory of authored subagents.`,sourcePath:o})],subagents:[]};let p=await readSortedDirectoryEntries(i,o),m=[],h=[];for(let t of p){if(t.isFile()){let n=getSupportedModuleBaseName(t.name);if(n===null)continue;h.push(discoverSingleFileSubagent({agentRoot:a,appRoot:r.appRoot,subagentId:n,subagentLogicalPath:join(d,t.name),subagentPath:join(o,t.name)}));continue}if(!t.isDirectory())continue;let n=await discoverLocalSubagentPackage({appRoot:r.appRoot,source:i,subagentId:t.name,subagentLogicalPath:join(d,t.name),subagentRoot:join(o,t.name)});m.push(...n.diagnostics),h.push(n.subagent)}return{diagnostics:m,subagents:h}}function discoverSingleFileSubagent(e){let t=createModuleSourceRef({logicalPath:e.subagentLogicalPath}),n=createAgentSourceManifest({agentId:e.subagentId,agentRoot:e.agentRoot,appRoot:e.appRoot,configModule:t});return createLocalSubagentSourceRef({entryPath:e.subagentPath,logicalPath:e.subagentLogicalPath,manifest:n,rootPath:e.agentRoot,subagentId:e.subagentId})}async function discoverLocalSubagentPackage(t){let n=[],o=await readSortedDirectoryEntries(t.source,t.subagentRoot);n.push(...createUnsupportedRootDirectoryDiagnostics({classifyEntry:classifyLocalSubagentEntry,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the local subagent root.`},rootEntries:o,rootPath:t.subagentRoot}));let s=await discoverInstructionsSource({required:!1,rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...s.diagnostics);let c=discoverFlatModuleSource({missingDiagnostic:{code:DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING,message:`Expected one authored subagent config module at "agent.ts", "agent.cts", "agent.mts", "agent.js", "agent.cjs", or "agent.mjs".`},rootEntries:o,rootPath:t.subagentRoot,slotName:`agent`});n.push(...c.diagnostics);let l=await discoverConnectionSources({rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...l.diagnostics);let u=await discoverSandboxSource({rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...u.diagnostics);let p=await discoverNamedSourceDirectory({directoryName:`tools`,invalidDirectoryCode:DISCOVER_TOOLS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(t.subagentRoot,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:o,rootPath:t.subagentRoot,source:t.source,validateSegment:createToolNameDiagnostic});n.push(...p.diagnostics);let g=await discoverNamedSourceDirectory({directoryName:`hooks`,invalidDirectoryCode:DISCOVER_HOOKS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(t.subagentRoot,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:o,rootPath:t.subagentRoot,source:t.source,validateSegment:createHookNameDiagnostic});n.push(...g.diagnostics);let _=await discoverLibSources({agentRoot:t.subagentRoot,rootEntries:o,source:t.source});n.push(..._.diagnostics),n.push(...createLocalSubagentScheduleDiagnostics(t.subagentRoot,o));let v=await discoverSkills({agentRoot:t.subagentRoot,source:t.source});n.push(...v.diagnostics);let y=await discoverSubagents({agentRoot:t.subagentRoot,appRoot:t.appRoot,source:t.source});n.push(...y.diagnostics);let b=await discoverExtensionMountDeclarations({agentRoot:t.subagentRoot,source:t.source});n.push(...b.diagnostics);let x=await resolveExtensionMounts({agentRoot:t.subagentRoot,appRoot:t.appRoot,mounts:b.mounts,source:t.source});n.push(...x.diagnostics);let S={agentRoot:t.subagentRoot,appRoot:t.appRoot,connections:l.connections,diagnostics:n,extensions:b.mounts.map(e=>e.mountRef),resolvedExtensions:x.mounts,hooks:g.sources,lib:_.lib,instructions:s.instructions,sandbox:u.sandbox,sandboxWorkspaces:u.sandboxWorkspace===null?[]:[u.sandboxWorkspace],skills:v.skills,tools:p.sources,subagents:y.subagents};c.module!==void 0&&(S.configModule=c.module);let C=createAgentSourceManifest(S);return{diagnostics:n,subagent:createLocalSubagentSourceRef({entryPath:t.subagentRoot,logicalPath:t.subagentLogicalPath,manifest:C,rootPath:t.subagentRoot,subagentId:t.subagentId})}}function createLocalSubagentScheduleDiagnostics(t,n){return n.flatMap(n=>classifyLocalSubagentEntry(n.name,getDirectoryEntryType(n))===`invalid-schedules-directory`?[createDiscoverErrorDiagnostic({code:DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID,message:`Local subagent packages cannot define schedules at "${join(t,n.name)}".`,sourcePath:join(t,n.name)})]:[])}export{DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID,DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING,DISCOVER_SUBAGENTS_DIRECTORY_INVALID,discoverSubagents};
1
+ import{join,relative,resolve}from"node:path";import{discoverExtensionMountDeclarations,resolveExtensionMounts}from"#discover/discover-agent.js";import{classifyLocalSubagentEntry,getDirectoryEntryType,getSupportedModuleBaseName,normalizeLogicalPath}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{createDiskProjectSource}from"#discover/project-source.js";import{createAgentSourceManifest,createLocalSubagentSourceRef,createModuleSourceRef}from"#discover/manifest.js";import{DISCOVER_HOOKS_DIRECTORY_INVALID,DISCOVER_TOOLS_DIRECTORY_INVALID,createHookNameDiagnostic,createToolNameDiagnostic,createUnsupportedRootDirectoryDiagnostics,discoverFlatModuleSource,discoverInstructionsSource,discoverNamedSourceDirectory,readSortedDirectoryEntries}from"#discover/grammar.js";import{discoverConnectionSources}from"#discover/connections.js";import{discoverLibSources}from"#discover/lib.js";import{discoverMemorySources}from"#discover/memory.js";import{discoverSandboxSource}from"#discover/sandbox.js";import{discoverSkills}from"#discover/skills.js";const DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID=`discover/local-subagent-schedules-invalid`,DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING=`discover/required-subagent-config-module-missing`,DISCOVER_SUBAGENTS_DIRECTORY_INVALID=`discover/subagents-directory-invalid`;async function discoverSubagents(r){let i=r.source??createDiskProjectSource(),a=resolve(r.agentRoot),o=resolve(r.subagentsDirectoryPath??join(a,`subagents`)),d=normalizeLogicalPath(r.subagentsLogicalPath??relative(a,o)),f=await i.stat(o);if(f===`missing`)return{diagnostics:[],subagents:[]};if(f!==`directory`)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_SUBAGENTS_DIRECTORY_INVALID,message:`Expected "${o}" to be a directory of authored subagents.`,sourcePath:o})],subagents:[]};let p=await readSortedDirectoryEntries(i,o),m=[],h=[];for(let t of p){if(t.isFile()){let n=getSupportedModuleBaseName(t.name);if(n===null)continue;h.push(discoverSingleFileSubagent({agentRoot:a,appRoot:r.appRoot,subagentId:n,subagentLogicalPath:join(d,t.name),subagentPath:join(o,t.name)}));continue}if(!t.isDirectory())continue;let n=await discoverLocalSubagentPackage({appRoot:r.appRoot,source:i,subagentId:t.name,subagentLogicalPath:join(d,t.name),subagentRoot:join(o,t.name)});m.push(...n.diagnostics),h.push(n.subagent)}return{diagnostics:m,subagents:h}}function discoverSingleFileSubagent(e){let t=createModuleSourceRef({logicalPath:e.subagentLogicalPath}),n=createAgentSourceManifest({agentId:e.subagentId,agentRoot:e.agentRoot,appRoot:e.appRoot,configModule:t});return createLocalSubagentSourceRef({entryPath:e.subagentPath,logicalPath:e.subagentLogicalPath,manifest:n,rootPath:e.agentRoot,subagentId:e.subagentId})}async function discoverLocalSubagentPackage(t){let n=[],o=await readSortedDirectoryEntries(t.source,t.subagentRoot);n.push(...createUnsupportedRootDirectoryDiagnostics({classifyEntry:classifyLocalSubagentEntry,createUnsupportedDirectoryMessage(e){return`Ignoring unsupported directory "${e}/" in the local subagent root.`},rootEntries:o,rootPath:t.subagentRoot}));let s=await discoverInstructionsSource({required:!1,rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...s.diagnostics);let c=discoverFlatModuleSource({missingDiagnostic:{code:DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING,message:`Expected one authored subagent config module at "agent.ts", "agent.cts", "agent.mts", "agent.js", "agent.cjs", or "agent.mjs".`},rootEntries:o,rootPath:t.subagentRoot,slotName:`agent`});n.push(...c.diagnostics);let l=await discoverConnectionSources({rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...l.diagnostics);let u=await discoverMemorySources({rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...u.diagnostics);let p=await discoverSandboxSource({rootEntries:o,rootPath:t.subagentRoot,source:t.source});n.push(...p.diagnostics);let g=await discoverNamedSourceDirectory({directoryName:`tools`,invalidDirectoryCode:DISCOVER_TOOLS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(t.subagentRoot,`tools`)}" to be a directory of authored tools.`,recursive:!0,rootEntries:o,rootPath:t.subagentRoot,source:t.source,validateSegment:createToolNameDiagnostic});n.push(...g.diagnostics);let _=await discoverNamedSourceDirectory({directoryName:`hooks`,invalidDirectoryCode:DISCOVER_HOOKS_DIRECTORY_INVALID,invalidDirectoryMessage:`Expected "${join(t.subagentRoot,`hooks`)}" to be a directory of authored hooks.`,recursive:!0,rootEntries:o,rootPath:t.subagentRoot,source:t.source,validateSegment:createHookNameDiagnostic});n.push(..._.diagnostics);let v=await discoverLibSources({agentRoot:t.subagentRoot,rootEntries:o,source:t.source});n.push(...v.diagnostics),n.push(...createLocalSubagentScheduleDiagnostics(t.subagentRoot,o));let y=await discoverSkills({agentRoot:t.subagentRoot,source:t.source});n.push(...y.diagnostics);let b=await discoverSubagents({agentRoot:t.subagentRoot,appRoot:t.appRoot,source:t.source});n.push(...b.diagnostics);let x=await discoverExtensionMountDeclarations({agentRoot:t.subagentRoot,source:t.source});n.push(...x.diagnostics);let S=await resolveExtensionMounts({agentRoot:t.subagentRoot,appRoot:t.appRoot,mounts:x.mounts,source:t.source});n.push(...S.diagnostics);let C={agentRoot:t.subagentRoot,appRoot:t.appRoot,connections:l.connections,diagnostics:n,extensions:x.mounts.map(e=>e.mountRef),resolvedExtensions:S.mounts,hooks:_.sources,memories:u.memories,lib:v.lib,instructions:s.instructions,sandbox:p.sandbox,sandboxWorkspaces:p.sandboxWorkspace===null?[]:[p.sandboxWorkspace],skills:y.skills,tools:g.sources,subagents:b.subagents};c.module!==void 0&&(C.configModule=c.module);let w=createAgentSourceManifest(C);return{diagnostics:n,subagent:createLocalSubagentSourceRef({entryPath:t.subagentRoot,logicalPath:t.subagentLogicalPath,manifest:w,rootPath:t.subagentRoot,subagentId:t.subagentId})}}function createLocalSubagentScheduleDiagnostics(t,n){return n.flatMap(n=>classifyLocalSubagentEntry(n.name,getDirectoryEntryType(n))===`invalid-schedules-directory`?[createDiscoverErrorDiagnostic({code:DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID,message:`Local subagent packages cannot define schedules at "${join(t,n.name)}".`,sourcePath:join(t,n.name)})]:[])}export{DISCOVER_LOCAL_SUBAGENT_SCHEDULES_INVALID,DISCOVER_REQUIRED_SUBAGENT_CONFIG_MODULE_MISSING,DISCOVER_SUBAGENTS_DIRECTORY_INVALID,discoverSubagents};
@@ -45,6 +45,12 @@ export declare const DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED = "discover/ext
45
45
  * consuming agent's to own.
46
46
  */
47
47
  export declare const DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED = "discover/extension-sandbox-unsupported";
48
+ export declare const DISCOVER_EXTENSION_MEMORY_UNSUPPORTED = "discover/extension-memory-unsupported";
49
+ /**
50
+ * Emitted when an extension declares agent-level instrumentation. Instrumentation
51
+ * is a singleton owned by the consuming agent and cannot be namespace-scoped.
52
+ */
53
+ export declare const DISCOVER_EXTENSION_INSTRUMENTATION_UNSUPPORTED = "discover/extension-instrumentation-unsupported";
48
54
  /**
49
55
  * Resolved on-disk location of one mounted extension package.
50
56
  */
@@ -1 +1 @@
1
- import{dirname,isAbsolute,join,resolve}from"node:path";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest}from"#compiler/extension-compatibility.js";import{parseExtensionMountSpecifier}from"#discover/extension-specifier.js";import{parseExtensionPackageRoots}from"#shared/extension-package-contract.js";const DISCOVER_EXTENSION_MOUNT_UNRESOLVED=`discover/extension-mount-unresolved`,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS=`discover/extension-mount-ambiguous`,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION=`discover/extension-mount-missing-declaration`,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED=`discover/extension-nested-mount-unsupported`,DISCOVER_EXTENSION_PACKAGE_INVALID=`discover/extension-package-invalid`,DISCOVER_EXTENSION_COMPATIBILITY_INVALID=`discover/extension-compatibility-invalid`,DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE=`discover/extension-capability-incompatible`,DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED=`discover/extension-agent-config-unsupported`,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED=`discover/extension-sandbox-unsupported`;function mountNamespace(e){let t=e.slice(e.lastIndexOf(`/`)+1);for(let e of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)if(t.toLowerCase().endsWith(e))return t.slice(0,t.length-e.length);return t}function mountRefNamespace(e){let t=e.replace(/^extensions\//,``),n=t.indexOf(`/`);return n===-1?mountNamespace(e):t.slice(0,n)}function packageStateNamespace(e){return e.replace(/^@/,``).replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`extension`}async function locateExtensionMount(e){let t=await locateExtensionMountPackage(e);if(t.location===void 0)return{diagnostics:t.diagnostics};let{location:r}=t,i=join(r.distRoot,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),l;try{l=parseExtensionCompatibilityManifest(await e.source.readTextFile(i),i)}catch(e){return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_COMPATIBILITY_INVALID,message:`Extension "${r.packageName}" has no valid compatibility manifest at "${i}". Rebuild or reinstall the extension. ${e instanceof Error?e.message:String(e)}`,sourcePath:i})]}}let u=findUnsupportedExtensionCapabilities(l);return u.length>0?{diagnostics:u.map(e=>createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE,message:`Extension "${r.packageName}" requires ${e.capability} contract v${e.requiredVersion}, but this eve supports ${e.capability} contract ${formatSupportedVersions(e.supportedVersions)}. Upgrade eve or install an extension release that requires a supported ${e.capability} contract.`,sourcePath:i}))}:{location:{namespace:r.namespace,specifier:r.specifier,packageName:r.packageName,packageRoot:r.packageRoot,sourceRoot:r.distRoot,externalDependencies:l.build?.externalDependencies??[]},diagnostics:[]}}async function locateExtensionMountPackage(t){let i=join(t.agentRoot,t.mount.logicalPath),{namespace:o}=t,s;try{s=await t.source.readTextFile(i)}catch{return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Could not read extension mount "${t.mount.logicalPath}".`,sourcePath:i})]}}let c=parseExtensionMountSpecifier(s);if(c===null)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Extension mount "${t.mount.logicalPath}" must default-export a mounted extension, e.g. \`export default crm({ ... })\` or \`export { default } from "@acme/crm"\`.`,sourcePath:i})]};let d=await resolvePackageRoot({source:t.source,appRoot:t.appRoot,mountDirectory:dirname(i),specifier:c});if(d===null)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Could not resolve extension package "${c}" mounted by "${t.mount.logicalPath}".`,sourcePath:i})]};let f=join(d,`package.json`),p;try{p=JSON.parse(await t.source.readTextFile(f))}catch{return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_PACKAGE_INVALID,message:`Extension package "${c}" has no readable package.json at "${f}".`,sourcePath:f})]}}let m=parseExtensionPackageRoots(p.eve?.extension);return m===null?{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_PACKAGE_INVALID,message:`Package "${c}" is not an eve extension: its package.json must declare \`eve.extension.dist\`.`,sourcePath:f})]}:{location:{namespace:o,specifier:c,packageName:typeof p.name==`string`&&p.name.length>0?p.name:c,packageRoot:d,...m.source===void 0?{}:{authoredSourceRoot:resolve(d,m.source)},distRoot:resolve(d,m.dist)},diagnostics:[]}}function formatSupportedVersions(e){return e.length===0?`versions: none`:`versions: ${e.map(e=>`v${e}`).join(`, `)}`}async function resolvePackageRoot(i){if(i.specifier.startsWith(`.`)){let e=resolve(i.mountDirectory,i.specifier);return await hasPackageJson(i.source,e)?e:null}if(isAbsolute(i.specifier))return await hasPackageJson(i.source,i.specifier)?i.specifier:null;let a=bareSpecifierPackagePath(i.specifier),o=resolve(i.appRoot);for(;;){let t=join(o,`node_modules`,a);if(await hasPackageJson(i.source,t))return t;let r=dirname(o);if(r===o)return null;o=r}}function bareSpecifierPackagePath(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}async function hasPackageJson(e,t){return await e.stat(join(t,`package.json`))===`file`}export{DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE,DISCOVER_EXTENSION_COMPATIBILITY_INVALID,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,DISCOVER_EXTENSION_MOUNT_UNRESOLVED,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,DISCOVER_EXTENSION_PACKAGE_INVALID,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,locateExtensionMount,locateExtensionMountPackage,mountNamespace,mountRefNamespace,packageStateNamespace};
1
+ import{dirname,isAbsolute,join,resolve}from"node:path";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"#discover/filesystem.js";import{createDiscoverErrorDiagnostic}from"#discover/diagnostics.js";import{EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest}from"#compiler/extension-compatibility.js";import{parseExtensionMountSpecifier}from"#discover/extension-specifier.js";import{parseExtensionPackageRoots}from"#shared/extension-package-contract.js";const DISCOVER_EXTENSION_MOUNT_UNRESOLVED=`discover/extension-mount-unresolved`,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS=`discover/extension-mount-ambiguous`,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION=`discover/extension-mount-missing-declaration`,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED=`discover/extension-nested-mount-unsupported`,DISCOVER_EXTENSION_PACKAGE_INVALID=`discover/extension-package-invalid`,DISCOVER_EXTENSION_COMPATIBILITY_INVALID=`discover/extension-compatibility-invalid`,DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE=`discover/extension-capability-incompatible`,DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED=`discover/extension-agent-config-unsupported`,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED=`discover/extension-sandbox-unsupported`,DISCOVER_EXTENSION_MEMORY_UNSUPPORTED=`discover/extension-memory-unsupported`,DISCOVER_EXTENSION_INSTRUMENTATION_UNSUPPORTED=`discover/extension-instrumentation-unsupported`;function mountNamespace(e){let t=e.slice(e.lastIndexOf(`/`)+1);for(let e of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)if(t.toLowerCase().endsWith(e))return t.slice(0,t.length-e.length);return t}function mountRefNamespace(e){let t=e.replace(/^extensions\//,``),n=t.indexOf(`/`);return n===-1?mountNamespace(e):t.slice(0,n)}function packageStateNamespace(e){return e.replace(/^@/,``).replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``)||`extension`}async function locateExtensionMount(e){let t=await locateExtensionMountPackage(e);if(t.location===void 0)return{diagnostics:t.diagnostics};let{location:r}=t,i=join(r.distRoot,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),l;try{l=parseExtensionCompatibilityManifest(await e.source.readTextFile(i),i)}catch(e){return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_COMPATIBILITY_INVALID,message:`Extension "${r.packageName}" has no valid compatibility manifest at "${i}". Rebuild or reinstall the extension. ${e instanceof Error?e.message:String(e)}`,sourcePath:i})]}}let u=findUnsupportedExtensionCapabilities(l);return u.length>0?{diagnostics:u.map(e=>createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE,message:`Extension "${r.packageName}" requires ${e.capability} contract v${e.requiredVersion}, but this eve supports ${e.capability} contract ${formatSupportedVersions(e.supportedVersions)}. Upgrade eve or install an extension release that requires a supported ${e.capability} contract.`,sourcePath:i}))}:{location:{namespace:r.namespace,specifier:r.specifier,packageName:r.packageName,packageRoot:r.packageRoot,sourceRoot:r.distRoot,externalDependencies:l.build?.externalDependencies??[]},diagnostics:[]}}async function locateExtensionMountPackage(t){let i=join(t.agentRoot,t.mount.logicalPath),{namespace:o}=t,s;try{s=await t.source.readTextFile(i)}catch{return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Could not read extension mount "${t.mount.logicalPath}".`,sourcePath:i})]}}let c=parseExtensionMountSpecifier(s);if(c===null)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Extension mount "${t.mount.logicalPath}" must default-export a mounted extension, e.g. \`export default crm({ ... })\` or \`export { default } from "@acme/crm"\`.`,sourcePath:i})]};let d=await resolvePackageRoot({source:t.source,appRoot:t.appRoot,mountDirectory:dirname(i),specifier:c});if(d===null)return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_MOUNT_UNRESOLVED,message:`Could not resolve extension package "${c}" mounted by "${t.mount.logicalPath}".`,sourcePath:i})]};let f=join(d,`package.json`),p;try{p=JSON.parse(await t.source.readTextFile(f))}catch{return{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_PACKAGE_INVALID,message:`Extension package "${c}" has no readable package.json at "${f}".`,sourcePath:f})]}}let m=parseExtensionPackageRoots(p.eve?.extension);return m===null?{diagnostics:[createDiscoverErrorDiagnostic({code:DISCOVER_EXTENSION_PACKAGE_INVALID,message:`Package "${c}" is not an eve extension: its package.json must declare \`eve.extension.dist\`.`,sourcePath:f})]}:{location:{namespace:o,specifier:c,packageName:typeof p.name==`string`&&p.name.length>0?p.name:c,packageRoot:d,...m.source===void 0?{}:{authoredSourceRoot:resolve(d,m.source)},distRoot:resolve(d,m.dist)},diagnostics:[]}}function formatSupportedVersions(e){return e.length===0?`versions: none`:`versions: ${e.map(e=>`v${e}`).join(`, `)}`}async function resolvePackageRoot(i){if(i.specifier.startsWith(`.`)){let e=resolve(i.mountDirectory,i.specifier);return await hasPackageJson(i.source,e)?e:null}if(isAbsolute(i.specifier))return await hasPackageJson(i.source,i.specifier)?i.specifier:null;let a=bareSpecifierPackagePath(i.specifier),o=resolve(i.appRoot);for(;;){let t=join(o,`node_modules`,a);if(await hasPackageJson(i.source,t))return t;let r=dirname(o);if(r===o)return null;o=r}}function bareSpecifierPackagePath(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}async function hasPackageJson(e,t){return await e.stat(join(t,`package.json`))===`file`}export{DISCOVER_EXTENSION_AGENT_CONFIG_UNSUPPORTED,DISCOVER_EXTENSION_CAPABILITY_INCOMPATIBLE,DISCOVER_EXTENSION_COMPATIBILITY_INVALID,DISCOVER_EXTENSION_INSTRUMENTATION_UNSUPPORTED,DISCOVER_EXTENSION_MEMORY_UNSUPPORTED,DISCOVER_EXTENSION_MOUNT_AMBIGUOUS,DISCOVER_EXTENSION_MOUNT_MISSING_DECLARATION,DISCOVER_EXTENSION_MOUNT_UNRESOLVED,DISCOVER_EXTENSION_NESTED_MOUNT_UNSUPPORTED,DISCOVER_EXTENSION_PACKAGE_INVALID,DISCOVER_EXTENSION_SANDBOX_UNSUPPORTED,locateExtensionMount,locateExtensionMountPackage,mountNamespace,mountRefNamespace,packageStateNamespace};
@@ -15,11 +15,11 @@ export type DirectoryEntryType = "directory" | "file" | "other";
15
15
  /**
16
16
  * Classified root-level agent entry.
17
17
  */
18
- export type AgentRootEntryKind = "agent-config-module" | "channels-directory" | "connections-directory" | "extensions-directory" | "hooks-directory" | "ignored-directory" | "instrumentation-directory" | "instructions-directory" | "instructions-markdown" | "instructions-module" | "lib-directory" | "sandbox-directory" | "schedules-directory" | "skills-directory" | "system-markdown" | "system-module" | "tools-directory" | "unknown" | "subagents-directory";
18
+ export type AgentRootEntryKind = "agent-config-module" | "channels-directory" | "connections-directory" | "extensions-directory" | "hooks-directory" | "ignored-directory" | "instrumentation-directory" | "instructions-directory" | "instructions-markdown" | "instructions-module" | "lib-directory" | "memory-directory" | "memory-module" | "sandbox-directory" | "schedules-directory" | "skills-directory" | "system-markdown" | "system-module" | "tools-directory" | "unknown" | "subagents-directory";
19
19
  /**
20
20
  * Classified local-subagent root entry.
21
21
  */
22
- export type LocalSubagentEntryKind = "agent-config-module" | "connections-directory" | "extensions-directory" | "hooks-directory" | "ignored-directory" | "instructions-directory" | "instructions-markdown" | "instructions-module" | "invalid-schedules-directory" | "lib-directory" | "sandbox-directory" | "skills-directory" | "system-markdown" | "system-module" | "tools-directory" | "unknown" | "subagents-directory";
22
+ export type LocalSubagentEntryKind = "agent-config-module" | "connections-directory" | "extensions-directory" | "hooks-directory" | "ignored-directory" | "instructions-directory" | "instructions-markdown" | "instructions-module" | "invalid-schedules-directory" | "lib-directory" | "memory-directory" | "memory-module" | "sandbox-directory" | "skills-directory" | "system-markdown" | "system-module" | "tools-directory" | "unknown" | "subagents-directory";
23
23
  /**
24
24
  * Classified Agent Skills package entry.
25
25
  */
@@ -1 +1 @@
1
- import{sep}from"node:path";const SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS=[`.cts`,`.mts`,`.cjs`,`.mjs`,`.ts`,`.js`],PROJECT_MARKER_FILE_NAMES=[`package.json`,`vercel.json`],PROJECT_MARKER_FILE_NAME_SET=new Set(PROJECT_MARKER_FILE_NAMES),GENERATED_AGENT_DIRECTORY_NAMES=new Set([`.devtools`,`.eve`,`.next`,`.output`,`.vercel`,`node_modules`]);function getDirectoryEntryType(e){return e.isDirectory()?`directory`:e.isFile()?`file`:`other`}function isProjectMarkerEntry(e,t){return t===`file`&&PROJECT_MARKER_FILE_NAME_SET.has(e)}function classifyAgentRootEntry(e,t){if(t===`file`)return matchesSupportedModuleBaseName(e,`agent`)?`agent-config-module`:e.toLowerCase()===`instructions.md`?`instructions-markdown`:matchesSupportedModuleBaseName(e,`instructions`)?`instructions-module`:e.toLowerCase()===`system.md`?`system-markdown`:matchesSupportedModuleBaseName(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(GENERATED_AGENT_DIRECTORY_NAMES.has(e))return`ignored-directory`;if(e===`channels`)return`channels-directory`;if(e===`connections`)return`connections-directory`;if(e===`extensions`)return`extensions-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`instructions`)return`instructions-directory`;if(e===`instrumentation`)return`instrumentation-directory`;if(e===`lib`)return`lib-directory`;if(e===`skills`)return`skills-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`tools`)return`tools-directory`;if(e===`schedules`)return`schedules-directory`;if(e===`subagents`)return`subagents-directory`}return`unknown`}function classifyLocalSubagentEntry(e,t){if(t===`file`)return matchesSupportedModuleBaseName(e,`agent`)?`agent-config-module`:e.toLowerCase()===`instructions.md`?`instructions-markdown`:matchesSupportedModuleBaseName(e,`instructions`)?`instructions-module`:e.toLowerCase()===`system.md`?`system-markdown`:matchesSupportedModuleBaseName(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(GENERATED_AGENT_DIRECTORY_NAMES.has(e))return`ignored-directory`;if(e===`connections`)return`connections-directory`;if(e===`extensions`)return`extensions-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`instructions`)return`instructions-directory`;if(e===`lib`)return`lib-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`skills`)return`skills-directory`;if(e===`tools`)return`tools-directory`;if(e===`subagents`)return`subagents-directory`;if(e===`schedules`)return`invalid-schedules-directory`}return`unknown`}function classifySkillPackageEntry(e,t){if(t===`file`)return e.toLowerCase()===`skill.md`?`skill-markdown`:`skill-resource`;if(t===`directory`){if(e===`scripts`)return`skill-scripts-directory`;if(e===`references`)return`skill-references-directory`;if(e===`assets`)return`skill-assets-directory`}return`skill-resource`}function classifySkillsDirectoryEntry(e,t){if(t===`directory`)return`skill-package-directory`;if(t===`file`){if(isTypeScriptDeclarationFileName(e))return`ignored-declaration`;if(e.toLowerCase().endsWith(`.md`))return`flat-skill-markdown`;if(getSupportedModuleBaseName(e)!==null)return`flat-skill-module`}return`unknown`}function normalizeLogicalPath(t){return t.replaceAll(sep,`/`).replace(/^\.\//,``).replace(/^\/+/,``)}function getSupportedModuleBaseName(e){if(isTypeScriptDeclarationFileName(e))return null;for(let n of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)if(e.endsWith(n)&&e.length>n.length)return e.slice(0,-n.length);return null}function isTypeScriptDeclarationFileName(e){return/\.d\.(?:cts|mts|ts)$/.test(e)}function matchesSupportedModuleBaseName(e,t){return getSupportedModuleBaseName(e)===t}function stripLogicalPathExtension(e){let t=normalizeLogicalPath(e),n=t.lastIndexOf(`/`),r=t.lastIndexOf(`.`);return r===-1||r<n?t:t.slice(0,r)}export{PROJECT_MARKER_FILE_NAMES,SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS,classifyAgentRootEntry,classifyLocalSubagentEntry,classifySkillPackageEntry,classifySkillsDirectoryEntry,getDirectoryEntryType,getSupportedModuleBaseName,isProjectMarkerEntry,isTypeScriptDeclarationFileName,matchesSupportedModuleBaseName,normalizeLogicalPath,stripLogicalPathExtension};
1
+ import{sep}from"node:path";const SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS=[`.cts`,`.mts`,`.cjs`,`.mjs`,`.ts`,`.js`],PROJECT_MARKER_FILE_NAMES=[`package.json`,`vercel.json`],PROJECT_MARKER_FILE_NAME_SET=new Set(PROJECT_MARKER_FILE_NAMES),GENERATED_AGENT_DIRECTORY_NAMES=new Set([`.devtools`,`.eve`,`.next`,`.output`,`.vercel`,`node_modules`]);function getDirectoryEntryType(e){return e.isDirectory()?`directory`:e.isFile()?`file`:`other`}function isProjectMarkerEntry(e,t){return t===`file`&&PROJECT_MARKER_FILE_NAME_SET.has(e)}function classifyAgentRootEntry(e,t){if(t===`file`)return matchesSupportedModuleBaseName(e,`agent`)?`agent-config-module`:e.toLowerCase()===`instructions.md`?`instructions-markdown`:matchesSupportedModuleBaseName(e,`instructions`)?`instructions-module`:matchesSupportedModuleBaseName(e,`memory`)?`memory-module`:e.toLowerCase()===`system.md`?`system-markdown`:matchesSupportedModuleBaseName(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(GENERATED_AGENT_DIRECTORY_NAMES.has(e))return`ignored-directory`;if(e===`channels`)return`channels-directory`;if(e===`connections`)return`connections-directory`;if(e===`extensions`)return`extensions-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`instructions`)return`instructions-directory`;if(e===`instrumentation`)return`instrumentation-directory`;if(e===`lib`)return`lib-directory`;if(e===`memory`)return`memory-directory`;if(e===`skills`)return`skills-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`tools`)return`tools-directory`;if(e===`schedules`)return`schedules-directory`;if(e===`subagents`)return`subagents-directory`}return`unknown`}function classifyLocalSubagentEntry(e,t){if(t===`file`)return matchesSupportedModuleBaseName(e,`agent`)?`agent-config-module`:e.toLowerCase()===`instructions.md`?`instructions-markdown`:matchesSupportedModuleBaseName(e,`instructions`)?`instructions-module`:matchesSupportedModuleBaseName(e,`memory`)?`memory-module`:e.toLowerCase()===`system.md`?`system-markdown`:matchesSupportedModuleBaseName(e,`system`)?`system-module`:`unknown`;if(t===`directory`){if(GENERATED_AGENT_DIRECTORY_NAMES.has(e))return`ignored-directory`;if(e===`connections`)return`connections-directory`;if(e===`extensions`)return`extensions-directory`;if(e===`hooks`)return`hooks-directory`;if(e===`instructions`)return`instructions-directory`;if(e===`lib`)return`lib-directory`;if(e===`memory`)return`memory-directory`;if(e===`sandbox`)return`sandbox-directory`;if(e===`skills`)return`skills-directory`;if(e===`tools`)return`tools-directory`;if(e===`subagents`)return`subagents-directory`;if(e===`schedules`)return`invalid-schedules-directory`}return`unknown`}function classifySkillPackageEntry(e,t){if(t===`file`)return e.toLowerCase()===`skill.md`?`skill-markdown`:`skill-resource`;if(t===`directory`){if(e===`scripts`)return`skill-scripts-directory`;if(e===`references`)return`skill-references-directory`;if(e===`assets`)return`skill-assets-directory`}return`skill-resource`}function classifySkillsDirectoryEntry(e,t){if(t===`directory`)return`skill-package-directory`;if(t===`file`){if(isTypeScriptDeclarationFileName(e))return`ignored-declaration`;if(e.toLowerCase().endsWith(`.md`))return`flat-skill-markdown`;if(getSupportedModuleBaseName(e)!==null)return`flat-skill-module`}return`unknown`}function normalizeLogicalPath(t){return t.replaceAll(sep,`/`).replace(/^\.\//,``).replace(/^\/+/,``)}function getSupportedModuleBaseName(e){if(isTypeScriptDeclarationFileName(e))return null;for(let n of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)if(e.endsWith(n)&&e.length>n.length)return e.slice(0,-n.length);return null}function isTypeScriptDeclarationFileName(e){return/\.d\.(?:cts|mts|ts)$/.test(e)}function matchesSupportedModuleBaseName(e,t){return getSupportedModuleBaseName(e)===t}function stripLogicalPathExtension(e){let t=normalizeLogicalPath(e),n=t.lastIndexOf(`/`),r=t.lastIndexOf(`.`);return r===-1||r<n?t:t.slice(0,r)}export{PROJECT_MARKER_FILE_NAMES,SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS,classifyAgentRootEntry,classifyLocalSubagentEntry,classifySkillPackageEntry,classifySkillsDirectoryEntry,getDirectoryEntryType,getSupportedModuleBaseName,isProjectMarkerEntry,isTypeScriptDeclarationFileName,matchesSupportedModuleBaseName,normalizeLogicalPath,stripLogicalPathExtension};
@@ -11,7 +11,7 @@ export declare const AGENT_SOURCE_MANIFEST_KIND = "eve-agent-discovery-manifest"
11
11
  /**
12
12
  * Current manifest schema version.
13
13
  */
14
- export declare const AGENT_SOURCE_MANIFEST_VERSION = 14;
14
+ export declare const AGENT_SOURCE_MANIFEST_VERSION = 15;
15
15
  /**
16
16
  * Channel source reference preserved by the discovery manifest.
17
17
  */
@@ -47,6 +47,9 @@ export type SkillSourceRef = MarkdownSourceRef<SkillDefinition> | ModuleSourceRe
47
47
  * Tool source reference preserved by the discovery manifest.
48
48
  */
49
49
  export type ToolSourceRef = ModuleSourceRef;
50
+ export interface MemorySourceRef extends ModuleSourceRef {
51
+ readonly slot: string;
52
+ }
50
53
  /**
51
54
  * Recursive manifest entry for a local subagent package.
52
55
  */
@@ -174,6 +177,7 @@ export interface AgentSourceManifest {
174
177
  */
175
178
  resolvedExtensions: ResolvedExtensionMount[];
176
179
  hooks: ModuleSourceRef[];
180
+ memories: MemorySourceRef[];
177
181
  lib: LibSourceRef[];
178
182
  kind: typeof AGENT_SOURCE_MANIFEST_KIND;
179
183
  /**
@@ -221,6 +225,7 @@ export interface CreateAgentSourceManifestInput {
221
225
  extensions?: readonly ExtensionSourceRef[];
222
226
  resolvedExtensions?: readonly ResolvedExtensionMount[];
223
227
  hooks?: readonly ModuleSourceRef[];
228
+ memories?: readonly MemorySourceRef[];
224
229
  lib?: readonly LibSourceRef[];
225
230
  /**
226
231
  * Optional package name read from the app root's package.json.