@truefoundry/trueforge-core 0.2.0-rc.1 → 0.2.0-rc.3

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 (112) hide show
  1. package/dist/agent-session/Sessions.d.ts +7 -3
  2. package/dist/agent-session/Sessions.d.ts.map +1 -1
  3. package/dist/agent-session/Sessions.js +2 -1
  4. package/dist/agent-session/Sessions.js.map +1 -1
  5. package/dist/agent-session/Sessions.mjs +2 -1
  6. package/dist/agent-session/Sessions.mjs.map +1 -1
  7. package/dist/agent-session/TurnResourceResolver.d.ts +13 -10
  8. package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -1
  9. package/dist/agent-session/TurnResourceResolver.js +15 -1
  10. package/dist/agent-session/TurnResourceResolver.js.map +1 -1
  11. package/dist/agent-session/TurnResourceResolver.mjs +15 -1
  12. package/dist/agent-session/TurnResourceResolver.mjs.map +1 -1
  13. package/dist/agent-session/index.d.ts +3 -3
  14. package/dist/agent-session/index.d.ts.map +1 -1
  15. package/dist/agent-session/index.js +6 -0
  16. package/dist/agent-session/index.js.map +1 -1
  17. package/dist/agent-session/index.mjs +11 -1
  18. package/dist/agent-session/index.mjs.map +1 -1
  19. package/dist/agent-session/models/SessionRecord.d.ts +5 -1
  20. package/dist/agent-session/models/SessionRecord.d.ts.map +1 -1
  21. package/dist/agent-session/models/SessionRecord.js.map +1 -1
  22. package/dist/agent-session/schemas/agentSpec.d.ts +4 -2
  23. package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -1
  24. package/dist/agent-session/schemas/agentSpec.js +5 -3
  25. package/dist/agent-session/schemas/agentSpec.js.map +1 -1
  26. package/dist/agent-session/schemas/agentSpec.mjs +5 -3
  27. package/dist/agent-session/schemas/agentSpec.mjs.map +1 -1
  28. package/dist/agent-session/schemas/session.d.ts +29 -2
  29. package/dist/agent-session/schemas/session.d.ts.map +1 -1
  30. package/dist/agent-session/schemas/session.js +23 -5
  31. package/dist/agent-session/schemas/session.js.map +1 -1
  32. package/dist/agent-session/schemas/session.mjs +19 -4
  33. package/dist/agent-session/schemas/session.mjs.map +1 -1
  34. package/dist/agent-session/store/ISessionStore.d.ts +28 -3
  35. package/dist/agent-session/store/ISessionStore.d.ts.map +1 -1
  36. package/dist/agent-session/store/ISessionStore.js.map +1 -1
  37. package/dist/agent-session/store/InMemorySessionStore.d.ts +3 -2
  38. package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -1
  39. package/dist/agent-session/store/InMemorySessionStore.js +36 -3
  40. package/dist/agent-session/store/InMemorySessionStore.js.map +1 -1
  41. package/dist/agent-session/store/InMemorySessionStore.mjs +36 -3
  42. package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -1
  43. package/dist/core/index.d.ts +2 -1
  44. package/dist/core/index.d.ts.map +1 -1
  45. package/dist/core/index.js +5 -0
  46. package/dist/core/index.js.map +1 -1
  47. package/dist/core/index.mjs +3 -0
  48. package/dist/core/index.mjs.map +1 -1
  49. package/dist/core/llm/VercelAILLM.d.ts.map +1 -1
  50. package/dist/core/llm/VercelAILLM.js +4 -0
  51. package/dist/core/llm/VercelAILLM.js.map +1 -1
  52. package/dist/core/llm/VercelAILLM.mjs +4 -0
  53. package/dist/core/llm/VercelAILLM.mjs.map +1 -1
  54. package/dist/core/redisKeys.d.ts +7 -0
  55. package/dist/core/redisKeys.d.ts.map +1 -0
  56. package/dist/core/redisKeys.js +36 -0
  57. package/dist/core/redisKeys.js.map +1 -0
  58. package/dist/core/redisKeys.mjs +10 -0
  59. package/dist/core/redisKeys.mjs.map +1 -0
  60. package/dist/core/sandbox/Sandbox.d.ts.map +1 -1
  61. package/dist/core/sandbox/Sandbox.js +13 -6
  62. package/dist/core/sandbox/Sandbox.js.map +1 -1
  63. package/dist/core/sandbox/Sandbox.mjs +9 -2
  64. package/dist/core/sandbox/Sandbox.mjs.map +1 -1
  65. package/dist/core/sandbox/provider/DaytonaProvider.d.ts +1 -1
  66. package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -1
  67. package/dist/core/sandbox/provider/DaytonaProvider.js +3 -3
  68. package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -1
  69. package/dist/core/sandbox/provider/DaytonaProvider.mjs +3 -3
  70. package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -1
  71. package/dist/core/sandbox/provider/Provider.d.ts +20 -4
  72. package/dist/core/sandbox/provider/Provider.d.ts.map +1 -1
  73. package/dist/core/sandbox/provider/Provider.js.map +1 -1
  74. package/dist/core/sandbox/provider/Provider.mjs.map +1 -1
  75. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +2 -2
  76. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -1
  77. package/dist/core/sandbox/provider/TFYSandboxProvider.js +4 -4
  78. package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -1
  79. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +4 -4
  80. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -1
  81. package/dist/core/sandbox/sandboxScripts.gen.d.ts +1 -1
  82. package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -1
  83. package/dist/core/sandbox/sandboxScripts.gen.js +1 -1
  84. package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -1
  85. package/dist/core/sandbox/sandboxScripts.gen.mjs +1 -1
  86. package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -1
  87. package/dist/core/sandbox/skills/ISkillMounter.d.ts +1 -1
  88. package/dist/core/sandbox/skills/ISkillMounter.d.ts.map +1 -1
  89. package/dist/core/sandbox/skills/ISkillMounter.js.map +1 -1
  90. package/dist/core/sandbox/skills/SkillMounter.d.ts +20 -2
  91. package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -1
  92. package/dist/core/sandbox/skills/SkillMounter.js +59 -23
  93. package/dist/core/sandbox/skills/SkillMounter.js.map +1 -1
  94. package/dist/core/sandbox/skills/SkillMounter.mjs +58 -23
  95. package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -1
  96. package/dist/core/sandbox/skills/index.d.ts +1 -1
  97. package/dist/core/sandbox/skills/index.d.ts.map +1 -1
  98. package/dist/core/sandbox/skills/index.js.map +1 -1
  99. package/dist/core/sandbox/skills/index.mjs.map +1 -1
  100. package/dist/request-reply/executor.d.ts +1 -1
  101. package/dist/request-reply/executor.d.ts.map +1 -1
  102. package/dist/request-reply/executor.js +1 -1
  103. package/dist/request-reply/executor.js.map +1 -1
  104. package/dist/request-reply/executor.mjs +1 -1
  105. package/dist/request-reply/executor.mjs.map +1 -1
  106. package/dist/request-reply/utils.d.ts +0 -1
  107. package/dist/request-reply/utils.d.ts.map +1 -1
  108. package/dist/request-reply/utils.js +4 -6
  109. package/dist/request-reply/utils.js.map +1 -1
  110. package/dist/request-reply/utils.mjs +4 -5
  111. package/dist/request-reply/utils.mjs.map +1 -1
  112. package/package.json +1 -1
@@ -1,8 +1,12 @@
1
1
  import { SessionHandle } from './SessionHandle';
2
2
  import type { CreateSessionInput, GetSessionByExternalIdInput, GetSessionInput, ISessionStore } from './store/ISessionStore';
3
- export type SessionsCreateInput<TSessionCustom extends object> = Omit<CreateSessionInput<TSessionCustom>, 'custom' | 'metadata'> & {
4
- custom?: TSessionCustom | undefined;
5
- metadata?: CreateSessionInput<TSessionCustom>['metadata'] | undefined;
3
+ /**
4
+ * Domain create input: same as {@link CreateSessionInput}, but `custom`,
5
+ * `metadata`, and `source` are optional — {@link Sessions.create} defaults them
6
+ * (`null` / `{}` / `null`). The store contract requires those fields explicitly.
7
+ */
8
+ export type SessionsCreateInput<TSessionCustom extends object> = Omit<CreateSessionInput<TSessionCustom>, 'custom' | 'metadata' | 'source'> & {
9
+ [K in 'custom' | 'metadata' | 'source']?: CreateSessionInput<TSessionCustom>[K] | undefined;
6
10
  };
7
11
  export declare class Sessions<TSessionCustom extends object = Record<string, never>, TTurnCustom extends object = Record<string, never>> {
8
12
  private readonly store;
@@ -1 +1 @@
1
- {"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../../src/agent-session/Sessions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,eAAe,EACf,aAAa,EACd,MAAM,uBAAuB,CAAC;AAG/B,MAAM,MAAM,mBAAmB,CAAC,cAAc,SAAS,MAAM,IAAI,IAAI,CACnE,kBAAkB,CAAC,cAAc,CAAC,EAClC,QAAQ,GAAG,UAAU,CACtB,GAAG;IACF,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;CACvE,CAAC;AAEF,qBAAa,QAAQ,CACnB,cAAc,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrD,WAAW,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE,YAAY,IAAI,EAAE;QAAE,YAAY,EAAE,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;KAAE,EAE7E;IAED;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAiB5G;IAED;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,CASjG;IAED;;;OAGG;IACG,eAAe,CACnB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,CASjE;IAED;;OAEG;IACG,uBAAuB,CAC3B,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GACvG,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAyBpF;CACF"}
1
+ {"version":3,"file":"Sessions.d.ts","sourceRoot":"","sources":["../../src/agent-session/Sessions.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,eAAe,EACf,aAAa,EACd,MAAM,uBAAuB,CAAC;AAG/B;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,CAAC,cAAc,SAAS,MAAM,IAAI,IAAI,CACnE,kBAAkB,CAAC,cAAc,CAAC,EAClC,QAAQ,GAAG,UAAU,GAAG,QAAQ,CACjC,GAAG;KACD,CAAC,IAAI,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;CAC5F,CAAC;AAEF,qBAAa,QAAQ,CACnB,cAAc,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrD,WAAW,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE,YAAY,IAAI,EAAE;QAAE,YAAY,EAAE,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;KAAE,EAE7E;IAED;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAkB5G;IAED;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,CASjG;IAED;;;OAGG;IACG,eAAe,CACnB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,CASjE;IAED;;OAEG;IACG,uBAAuB,CAC3B,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GACvG,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAyBpF;CACF"}
@@ -38,7 +38,8 @@ var Sessions = class {
38
38
  await this.store.createSession({
39
39
  ...input,
40
40
  custom: input.custom ?? null,
41
- metadata: input.metadata ?? {}
41
+ metadata: input.metadata ?? {},
42
+ source: input.source ?? null
42
43
  });
43
44
  const record = await this.store.getSession({
44
45
  tenant_id: input.tenant_id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/Sessions.ts"],"sourcesContent":["/**\n * Storage-only session collection: create / get. Behavior arrives per run via\n * the resolver on {@link SessionHandle.createTurn}.\n */\nimport { ulid } from 'ulid';\nimport { SessionHandle } from './SessionHandle';\nimport type {\n CreateSessionInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n ISessionStore,\n} from './store/ISessionStore';\nimport { SessionExternalIdConflictError } from './store/SessionStoreErrors';\n\nexport type SessionsCreateInput<TSessionCustom extends object> = Omit<\n CreateSessionInput<TSessionCustom>,\n 'custom' | 'metadata'\n> & {\n custom?: TSessionCustom | undefined;\n metadata?: CreateSessionInput<TSessionCustom>['metadata'] | undefined;\n};\n\nexport class Sessions<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> {\n private readonly store: ISessionStore<TSessionCustom, TTurnCustom>;\n\n constructor(deps: { sessionStore: ISessionStore<TSessionCustom, TTurnCustom> }) {\n this.store = deps.sessionStore;\n }\n\n /**\n * Creates and persists a new session with a reference or inline agent binding.\n */\n async create(input: SessionsCreateInput<TSessionCustom>): Promise<SessionHandle<TSessionCustom, TTurnCustom>> {\n await this.store.createSession({\n ...input,\n custom: input.custom ?? null,\n metadata: input.metadata ?? {},\n });\n const record = await this.store.getSession({\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n });\n if (!record) {\n throw new Error(`Session create succeeded but getSession returned undefined: ${input.session_id}`);\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session as stored (ref agents are not hydrated to a value), or\n * undefined if not found. Read-only: does not bump last_activity_timestamp_ms.\n */\n async get(input: GetSessionInput): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSession(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session bound to this tenant-scoped external id, or undefined.\n * Read-only: does not bump last_activity_timestamp_ms.\n */\n async getByExternalId(\n input: GetSessionByExternalIdInput,\n ): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSessionByExternalId(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Get-or-create the session bound to a tenant-scoped `external_id`.\n */\n async getOrCreateByExternalId(\n input: Omit<SessionsCreateInput<TSessionCustom>, 'session_id' | 'external_id'> & { external_id: string },\n ): Promise<{ session: SessionHandle<TSessionCustom, TTurnCustom>; created: boolean }> {\n const { tenant_id, external_id } = input;\n\n const existing = await this.getByExternalId({ tenant_id, external_id });\n if (existing !== undefined) {\n return { session: existing, created: false };\n }\n\n try {\n const session = await this.create({\n ...input,\n session_id: ulid().toLowerCase(),\n external_id,\n });\n return { session, created: true };\n } catch (error) {\n if (!(error instanceof SessionExternalIdConflictError)) {\n throw error;\n }\n const winner = await this.getByExternalId({ tenant_id, external_id });\n if (winner === undefined) {\n throw error;\n }\n return { session: winner, created: false };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,kBAAqB;AACrB,2BAA8B;AAO9B,gCAA+C;AAUxC,IAAM,WAAN,MAGL;AAAA,EACiB;AAAA,EAEjB,YAAY,MAAoE;AAC9E,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiG;AAC5G,UAAM,KAAK,MAAM,cAAc;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY,CAAC;AAAA,IAC/B,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW;AAAA,MACzC,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+DAA+D,MAAM,UAAU,EAAE;AAAA,IACnG;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,OAAyF;AACjG,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW,KAAK;AAChD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBACJ,OACiE;AACjE,UAAM,SAAS,MAAM,KAAK,MAAM,uBAAuB,KAAK;AAC5D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,OACoF;AACpF,UAAM,EAAE,WAAW,YAAY,IAAI;AAEnC,UAAM,WAAW,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACtE,QAAI,aAAa,QAAW;AAC1B,aAAO,EAAE,SAAS,UAAU,SAAS,MAAM;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,GAAG;AAAA,QACH,gBAAY,kBAAK,EAAE,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AACD,aAAO,EAAE,SAAS,SAAS,KAAK;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,2DAAiC;AACtD,cAAM;AAAA,MACR;AACA,YAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACpE,UAAI,WAAW,QAAW;AACxB,cAAM;AAAA,MACR;AACA,aAAO,EAAE,SAAS,QAAQ,SAAS,MAAM;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/Sessions.ts"],"sourcesContent":["/**\n * Storage-only session collection: create / get. Behavior arrives per run via\n * the resolver on {@link SessionHandle.createTurn}.\n */\nimport { ulid } from 'ulid';\nimport { SessionHandle } from './SessionHandle';\nimport type {\n CreateSessionInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n ISessionStore,\n} from './store/ISessionStore';\nimport { SessionExternalIdConflictError } from './store/SessionStoreErrors';\n\n/**\n * Domain create input: same as {@link CreateSessionInput}, but `custom`,\n * `metadata`, and `source` are optional — {@link Sessions.create} defaults them\n * (`null` / `{}` / `null`). The store contract requires those fields explicitly.\n */\nexport type SessionsCreateInput<TSessionCustom extends object> = Omit<\n CreateSessionInput<TSessionCustom>,\n 'custom' | 'metadata' | 'source'\n> & {\n [K in 'custom' | 'metadata' | 'source']?: CreateSessionInput<TSessionCustom>[K] | undefined;\n};\n\nexport class Sessions<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> {\n private readonly store: ISessionStore<TSessionCustom, TTurnCustom>;\n\n constructor(deps: { sessionStore: ISessionStore<TSessionCustom, TTurnCustom> }) {\n this.store = deps.sessionStore;\n }\n\n /**\n * Creates and persists a new session with a reference or inline agent binding.\n */\n async create(input: SessionsCreateInput<TSessionCustom>): Promise<SessionHandle<TSessionCustom, TTurnCustom>> {\n await this.store.createSession({\n ...input,\n custom: input.custom ?? null,\n metadata: input.metadata ?? {},\n source: input.source ?? null,\n });\n const record = await this.store.getSession({\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n });\n if (!record) {\n throw new Error(`Session create succeeded but getSession returned undefined: ${input.session_id}`);\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session as stored (ref agents are not hydrated to a value), or\n * undefined if not found. Read-only: does not bump last_activity_timestamp_ms.\n */\n async get(input: GetSessionInput): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSession(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session bound to this tenant-scoped external id, or undefined.\n * Read-only: does not bump last_activity_timestamp_ms.\n */\n async getByExternalId(\n input: GetSessionByExternalIdInput,\n ): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSessionByExternalId(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Get-or-create the session bound to a tenant-scoped `external_id`.\n */\n async getOrCreateByExternalId(\n input: Omit<SessionsCreateInput<TSessionCustom>, 'session_id' | 'external_id'> & { external_id: string },\n ): Promise<{ session: SessionHandle<TSessionCustom, TTurnCustom>; created: boolean }> {\n const { tenant_id, external_id } = input;\n\n const existing = await this.getByExternalId({ tenant_id, external_id });\n if (existing !== undefined) {\n return { session: existing, created: false };\n }\n\n try {\n const session = await this.create({\n ...input,\n session_id: ulid().toLowerCase(),\n external_id,\n });\n return { session, created: true };\n } catch (error) {\n if (!(error instanceof SessionExternalIdConflictError)) {\n throw error;\n }\n const winner = await this.getByExternalId({ tenant_id, external_id });\n if (winner === undefined) {\n throw error;\n }\n return { session: winner, created: false };\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,kBAAqB;AACrB,2BAA8B;AAO9B,gCAA+C;AAcxC,IAAM,WAAN,MAGL;AAAA,EACiB;AAAA,EAEjB,YAAY,MAAoE;AAC9E,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiG;AAC5G,UAAM,KAAK,MAAM,cAAc;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY,CAAC;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,IAC1B,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW;AAAA,MACzC,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+DAA+D,MAAM,UAAU,EAAE;AAAA,IACnG;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,OAAyF;AACjG,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW,KAAK;AAChD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBACJ,OACiE;AACjE,UAAM,SAAS,MAAM,KAAK,MAAM,uBAAuB,KAAK;AAC5D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,mCAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,OACoF;AACpF,UAAM,EAAE,WAAW,YAAY,IAAI;AAEnC,UAAM,WAAW,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACtE,QAAI,aAAa,QAAW;AAC1B,aAAO,EAAE,SAAS,UAAU,SAAS,MAAM;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,GAAG;AAAA,QACH,gBAAY,kBAAK,EAAE,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AACD,aAAO,EAAE,SAAS,SAAS,KAAK;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,2DAAiC;AACtD,cAAM;AAAA,MACR;AACA,YAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACpE,UAAI,WAAW,QAAW;AACxB,cAAM;AAAA,MACR;AACA,aAAO,EAAE,SAAS,QAAQ,SAAS,MAAM;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
@@ -14,7 +14,8 @@ var Sessions = class {
14
14
  await this.store.createSession({
15
15
  ...input,
16
16
  custom: input.custom ?? null,
17
- metadata: input.metadata ?? {}
17
+ metadata: input.metadata ?? {},
18
+ source: input.source ?? null
18
19
  });
19
20
  const record = await this.store.getSession({
20
21
  tenant_id: input.tenant_id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/Sessions.ts"],"sourcesContent":["/**\n * Storage-only session collection: create / get. Behavior arrives per run via\n * the resolver on {@link SessionHandle.createTurn}.\n */\nimport { ulid } from 'ulid';\nimport { SessionHandle } from './SessionHandle';\nimport type {\n CreateSessionInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n ISessionStore,\n} from './store/ISessionStore';\nimport { SessionExternalIdConflictError } from './store/SessionStoreErrors';\n\nexport type SessionsCreateInput<TSessionCustom extends object> = Omit<\n CreateSessionInput<TSessionCustom>,\n 'custom' | 'metadata'\n> & {\n custom?: TSessionCustom | undefined;\n metadata?: CreateSessionInput<TSessionCustom>['metadata'] | undefined;\n};\n\nexport class Sessions<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> {\n private readonly store: ISessionStore<TSessionCustom, TTurnCustom>;\n\n constructor(deps: { sessionStore: ISessionStore<TSessionCustom, TTurnCustom> }) {\n this.store = deps.sessionStore;\n }\n\n /**\n * Creates and persists a new session with a reference or inline agent binding.\n */\n async create(input: SessionsCreateInput<TSessionCustom>): Promise<SessionHandle<TSessionCustom, TTurnCustom>> {\n await this.store.createSession({\n ...input,\n custom: input.custom ?? null,\n metadata: input.metadata ?? {},\n });\n const record = await this.store.getSession({\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n });\n if (!record) {\n throw new Error(`Session create succeeded but getSession returned undefined: ${input.session_id}`);\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session as stored (ref agents are not hydrated to a value), or\n * undefined if not found. Read-only: does not bump last_activity_timestamp_ms.\n */\n async get(input: GetSessionInput): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSession(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session bound to this tenant-scoped external id, or undefined.\n * Read-only: does not bump last_activity_timestamp_ms.\n */\n async getByExternalId(\n input: GetSessionByExternalIdInput,\n ): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSessionByExternalId(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Get-or-create the session bound to a tenant-scoped `external_id`.\n */\n async getOrCreateByExternalId(\n input: Omit<SessionsCreateInput<TSessionCustom>, 'session_id' | 'external_id'> & { external_id: string },\n ): Promise<{ session: SessionHandle<TSessionCustom, TTurnCustom>; created: boolean }> {\n const { tenant_id, external_id } = input;\n\n const existing = await this.getByExternalId({ tenant_id, external_id });\n if (existing !== undefined) {\n return { session: existing, created: false };\n }\n\n try {\n const session = await this.create({\n ...input,\n session_id: ulid().toLowerCase(),\n external_id,\n });\n return { session, created: true };\n } catch (error) {\n if (!(error instanceof SessionExternalIdConflictError)) {\n throw error;\n }\n const winner = await this.getByExternalId({ tenant_id, external_id });\n if (winner === undefined) {\n throw error;\n }\n return { session: winner, created: false };\n }\n }\n}\n"],"mappings":";AAIA,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAO9B,SAAS,sCAAsC;AAUxC,IAAM,WAAN,MAGL;AAAA,EACiB;AAAA,EAEjB,YAAY,MAAoE;AAC9E,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiG;AAC5G,UAAM,KAAK,MAAM,cAAc;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY,CAAC;AAAA,IAC/B,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW;AAAA,MACzC,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+DAA+D,MAAM,UAAU,EAAE;AAAA,IACnG;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,OAAyF;AACjG,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW,KAAK;AAChD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBACJ,OACiE;AACjE,UAAM,SAAS,MAAM,KAAK,MAAM,uBAAuB,KAAK;AAC5D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,OACoF;AACpF,UAAM,EAAE,WAAW,YAAY,IAAI;AAEnC,UAAM,WAAW,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACtE,QAAI,aAAa,QAAW;AAC1B,aAAO,EAAE,SAAS,UAAU,SAAS,MAAM;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,GAAG;AAAA,QACH,YAAY,KAAK,EAAE,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AACD,aAAO,EAAE,SAAS,SAAS,KAAK;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,iCAAiC;AACtD,cAAM;AAAA,MACR;AACA,YAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACpE,UAAI,WAAW,QAAW;AACxB,cAAM;AAAA,MACR;AACA,aAAO,EAAE,SAAS,QAAQ,SAAS,MAAM;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/Sessions.ts"],"sourcesContent":["/**\n * Storage-only session collection: create / get. Behavior arrives per run via\n * the resolver on {@link SessionHandle.createTurn}.\n */\nimport { ulid } from 'ulid';\nimport { SessionHandle } from './SessionHandle';\nimport type {\n CreateSessionInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n ISessionStore,\n} from './store/ISessionStore';\nimport { SessionExternalIdConflictError } from './store/SessionStoreErrors';\n\n/**\n * Domain create input: same as {@link CreateSessionInput}, but `custom`,\n * `metadata`, and `source` are optional — {@link Sessions.create} defaults them\n * (`null` / `{}` / `null`). The store contract requires those fields explicitly.\n */\nexport type SessionsCreateInput<TSessionCustom extends object> = Omit<\n CreateSessionInput<TSessionCustom>,\n 'custom' | 'metadata' | 'source'\n> & {\n [K in 'custom' | 'metadata' | 'source']?: CreateSessionInput<TSessionCustom>[K] | undefined;\n};\n\nexport class Sessions<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> {\n private readonly store: ISessionStore<TSessionCustom, TTurnCustom>;\n\n constructor(deps: { sessionStore: ISessionStore<TSessionCustom, TTurnCustom> }) {\n this.store = deps.sessionStore;\n }\n\n /**\n * Creates and persists a new session with a reference or inline agent binding.\n */\n async create(input: SessionsCreateInput<TSessionCustom>): Promise<SessionHandle<TSessionCustom, TTurnCustom>> {\n await this.store.createSession({\n ...input,\n custom: input.custom ?? null,\n metadata: input.metadata ?? {},\n source: input.source ?? null,\n });\n const record = await this.store.getSession({\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n });\n if (!record) {\n throw new Error(`Session create succeeded but getSession returned undefined: ${input.session_id}`);\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session as stored (ref agents are not hydrated to a value), or\n * undefined if not found. Read-only: does not bump last_activity_timestamp_ms.\n */\n async get(input: GetSessionInput): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSession(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Returns the session bound to this tenant-scoped external id, or undefined.\n * Read-only: does not bump last_activity_timestamp_ms.\n */\n async getByExternalId(\n input: GetSessionByExternalIdInput,\n ): Promise<SessionHandle<TSessionCustom, TTurnCustom> | undefined> {\n const record = await this.store.getSessionByExternalId(input);\n if (!record) {\n return undefined;\n }\n return new SessionHandle({\n store: this.store,\n session: record,\n });\n }\n\n /**\n * Get-or-create the session bound to a tenant-scoped `external_id`.\n */\n async getOrCreateByExternalId(\n input: Omit<SessionsCreateInput<TSessionCustom>, 'session_id' | 'external_id'> & { external_id: string },\n ): Promise<{ session: SessionHandle<TSessionCustom, TTurnCustom>; created: boolean }> {\n const { tenant_id, external_id } = input;\n\n const existing = await this.getByExternalId({ tenant_id, external_id });\n if (existing !== undefined) {\n return { session: existing, created: false };\n }\n\n try {\n const session = await this.create({\n ...input,\n session_id: ulid().toLowerCase(),\n external_id,\n });\n return { session, created: true };\n } catch (error) {\n if (!(error instanceof SessionExternalIdConflictError)) {\n throw error;\n }\n const winner = await this.getByExternalId({ tenant_id, external_id });\n if (winner === undefined) {\n throw error;\n }\n return { session: winner, created: false };\n }\n }\n}\n"],"mappings":";AAIA,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAO9B,SAAS,sCAAsC;AAcxC,IAAM,WAAN,MAGL;AAAA,EACiB;AAAA,EAEjB,YAAY,MAAoE;AAC9E,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAiG;AAC5G,UAAM,KAAK,MAAM,cAAc;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,MAAM,UAAU;AAAA,MACxB,UAAU,MAAM,YAAY,CAAC;AAAA,MAC7B,QAAQ,MAAM,UAAU;AAAA,IAC1B,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW;AAAA,MACzC,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,+DAA+D,MAAM,UAAU,EAAE;AAAA,IACnG;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,OAAyF;AACjG,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW,KAAK;AAChD,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBACJ,OACiE;AACjE,UAAM,SAAS,MAAM,KAAK,MAAM,uBAAuB,KAAK;AAC5D,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,IAAI,cAAc;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,OACoF;AACpF,UAAM,EAAE,WAAW,YAAY,IAAI;AAEnC,UAAM,WAAW,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACtE,QAAI,aAAa,QAAW;AAC1B,aAAO,EAAE,SAAS,UAAU,SAAS,MAAM;AAAA,IAC7C;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,GAAG;AAAA,QACH,YAAY,KAAK,EAAE,YAAY;AAAA,QAC/B;AAAA,MACF,CAAC;AACD,aAAO,EAAE,SAAS,SAAS,KAAK;AAAA,IAClC,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,iCAAiC;AACtD,cAAM;AAAA,MACR;AACA,YAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE,WAAW,YAAY,CAAC;AACpE,UAAI,WAAW,QAAW;AACxB,cAAM;AAAA,MACR;AACA,aAAO,EAAE,SAAS,QAAQ,SAAS,MAAM;AAAA,IAC3C;AAAA,EACF;AACF;","names":[]}
@@ -26,15 +26,16 @@ export type TurnSandboxFactory = (input: {
26
26
  * behavior; subclass and override to customize (tool sources, sandbox,
27
27
  * tracing).
28
28
  */
29
+ interface ResolvedModel {
30
+ modelClient: ILLM;
31
+ defaultModelParams: ModelParams;
32
+ modelProperties?: AgentDefinition['modelProperties'];
33
+ }
29
34
  export declare class TurnResourceResolver<TTurnCustom extends object = Record<string, never>> implements ITurnResourceResolver<TTurnCustom> {
30
35
  #private;
31
36
  protected readonly deps: {
32
37
  /** Model name → client and defaults. Called once per resolved definition; may load provider config. */
33
- llm: (model: string) => Promise<{
34
- modelClient: ILLM;
35
- defaultModelParams: ModelParams;
36
- modelProperties?: AgentDefinition['modelProperties'];
37
- }>;
38
+ llm: (model: string) => Promise<ResolvedModel>;
38
39
  /**
39
40
  * MCP server name → connection details. Required to use spec.mcp_servers:
40
41
  * the AgentSpec carries names only (no url/headers on the wire) — the
@@ -59,11 +60,7 @@ export declare class TurnResourceResolver<TTurnCustom extends object = Record<st
59
60
  };
60
61
  constructor(deps: {
61
62
  /** Model name → client and defaults. Called once per resolved definition; may load provider config. */
62
- llm: (model: string) => Promise<{
63
- modelClient: ILLM;
64
- defaultModelParams: ModelParams;
65
- modelProperties?: AgentDefinition['modelProperties'];
66
- }>;
63
+ llm: (model: string) => Promise<ResolvedModel>;
67
64
  /**
68
65
  * MCP server name → connection details. Required to use spec.mcp_servers:
69
66
  * the AgentSpec carries names only (no url/headers on the wire) — the
@@ -147,5 +144,11 @@ export declare class TurnResourceResolver<TTurnCustom extends object = Record<st
147
144
  id: string;
148
145
  create: () => Promise<ToolSource>;
149
146
  }): Promise<ToolSource>;
147
+ /**
148
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
149
+ * sub-agents with the same catalog model share one promise.
150
+ */
151
+ protected getModel(modelName: string): Promise<ResolvedModel>;
150
152
  }
153
+ export {};
151
154
  //# sourceMappingURL=TurnResourceResolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TurnResourceResolver.d.ts","sourceRoot":"","sources":["../../src/agent-session/TurnResourceResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;CACvB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAoBvB;;;;GAIG;AACH,qBAAa,oBAAoB,CAC/B,WAAW,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAClD,YAAW,qBAAqB,CAAC,WAAW,CAAC;;IAK3C,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE;QACvB,uGAAuG;QACvG,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;YAC9B,WAAW,EAAE,IAAI,CAAC;YAClB,kBAAkB,EAAE,WAAW,CAAC;YAChC,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;SACtD,CAAC,CAAC;QACH;;;;;WAKG;QACH,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;SAAE,CAAC,CAAC;QAC5E,mBAAmB,EAAE,MAAM,CAAC;QAC5B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,+DAA+D;QAC/D,eAAe,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;QACjD;;;WAGG;QACH,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC;QAC9D,6EAA6E;QAC7E,MAAM,EAAE,MAAM,CAAC;KAChB;IA1BH,YACqB,IAAI,EAAE;QACvB,uGAAuG;QACvG,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;YAC9B,WAAW,EAAE,IAAI,CAAC;YAClB,kBAAkB,EAAE,WAAW,CAAC;YAChC,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;SACtD,CAAC,CAAC;QACH;;;;;WAKG;QACH,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,gBAAgB,CAAA;SAAE,CAAC,CAAC;QAC5E,mBAAmB,EAAE,MAAM,CAAC;QAC5B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,+DAA+D;QAC/D,eAAe,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;QACjD;;;WAGG;QACH,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC;QAC9D,6EAA6E;QAC7E,MAAM,EAAE,MAAM,CAAC;KAChB,EACC;IAEJ,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,iEAAiE;IACjE,aAAa,IAAI,YAAY,CAE5B;IAED,uEAAuE;IACjE,gBAAgB,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAStE;IAED;;;;;OAKG;IACG,cAAc,CAAC,KAAK,EAAE;QAC1B,IAAI,EAAE,SAAS,CAAC;QAChB,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;QACnC,YAAY,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;QACnD,MAAM,EAAE,WAAW,CAAC;QACpB,OAAO,EAAE,YAAY,CAAC;KACvB,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAW/B;IAED;;;;;;;;;;;;;OAaG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3B;IAED;;;;;;OAMG;IACG,sBAAsB,CAAC,KAAK,EAAE;QAClC,IAAI,EAAE,SAAS,CAAC;QAChB,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;QACnC,YAAY,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;QACnD,MAAM,EAAE,WAAW,CAAC;QACpB,OAAO,EAAE,YAAY,CAAC;KACvB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAqDnC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ7G;CACF"}
1
+ {"version":3,"file":"TurnResourceResolver.d.ts","sourceRoot":"","sources":["../../src/agent-session/TurnResourceResolver.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,7 @@ var TurnResourceResolver = class {
43
43
  }
44
44
  deps;
45
45
  #sources = /* @__PURE__ */ new Map();
46
+ #models = /* @__PURE__ */ new Map();
46
47
  #sandbox;
47
48
  get logger() {
48
49
  return this.deps.logger;
@@ -135,7 +136,7 @@ var TurnResourceResolver = class {
135
136
  })
136
137
  );
137
138
  const modelName = agentInfo?.model ?? spec.model.name;
138
- const resolvedModel = await this.deps.llm(modelName);
139
+ const resolvedModel = await this.getModel(modelName);
139
140
  return {
140
141
  definition: {
141
142
  modelClient: resolvedModel.modelClient,
@@ -172,6 +173,19 @@ var TurnResourceResolver = class {
172
173
  this.#sources.set(input.id, made);
173
174
  return made;
174
175
  }
176
+ /**
177
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
178
+ * sub-agents with the same catalog model share one promise.
179
+ */
180
+ getModel(modelName) {
181
+ const cached = this.#models.get(modelName);
182
+ if (cached) {
183
+ return cached;
184
+ }
185
+ const made = this.deps.llm(modelName);
186
+ this.#models.set(modelName, made);
187
+ return made;
188
+ }
175
189
  };
176
190
  // Annotate the CommonJS export names for ESM import in node:
177
191
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver, ResolvedAgentDefinition } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({ role: 'user' as const, content: m.content })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver, ResolvedAgentDefinition } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\ninterface ResolvedModel {\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n}\n\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n readonly #models = new Map<string, Promise<ResolvedModel>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<ResolvedModel>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.getModel(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({ role: 'user' as const, content: m.content })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n\n /**\n * Resolves `deps.llm` once per distinct model name for this turn — parent and\n * sub-agents with the same catalog model share one promise.\n */\n protected getModel(modelName: string): Promise<ResolvedModel> {\n const cached = this.#models.get(modelName);\n if (cached) {\n return cached;\n }\n const made = this.deps.llm(modelName);\n this.#models.set(modelName, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
@@ -19,6 +19,7 @@ var TurnResourceResolver = class {
19
19
  }
20
20
  deps;
21
21
  #sources = /* @__PURE__ */ new Map();
22
+ #models = /* @__PURE__ */ new Map();
22
23
  #sandbox;
23
24
  get logger() {
24
25
  return this.deps.logger;
@@ -111,7 +112,7 @@ var TurnResourceResolver = class {
111
112
  })
112
113
  );
113
114
  const modelName = agentInfo?.model ?? spec.model.name;
114
- const resolvedModel = await this.deps.llm(modelName);
115
+ const resolvedModel = await this.getModel(modelName);
115
116
  return {
116
117
  definition: {
117
118
  modelClient: resolvedModel.modelClient,
@@ -148,6 +149,19 @@ var TurnResourceResolver = class {
148
149
  this.#sources.set(input.id, made);
149
150
  return made;
150
151
  }
152
+ /**
153
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
154
+ * sub-agents with the same catalog model share one promise.
155
+ */
156
+ getModel(modelName) {
157
+ const cached = this.#models.get(modelName);
158
+ if (cached) {
159
+ return cached;
160
+ }
161
+ const made = this.deps.llm(modelName);
162
+ this.#models.set(modelName, made);
163
+ return made;
164
+ }
151
165
  };
152
166
  export {
153
167
  TurnResourceResolver
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver, ResolvedAgentDefinition } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({ role: 'user' as const, content: m.content })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver, ResolvedAgentDefinition } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\ninterface ResolvedModel {\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n}\n\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n readonly #models = new Map<string, Promise<ResolvedModel>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<ResolvedModel>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.getModel(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({ role: 'user' as const, content: m.content })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n\n /**\n * Resolves `deps.llm` once per distinct model name for this turn — parent and\n * sub-agents with the same catalog model share one promise.\n */\n protected getModel(modelName: string): Promise<ResolvedModel> {\n const cached = this.#models.get(modelName);\n if (cached) {\n return cached;\n }\n const made = this.deps.llm(modelName);\n this.#models.set(modelName, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
@@ -6,8 +6,8 @@ export { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSch
6
6
  export type { AgentSpec, Skill } from './schemas/agentSpec';
7
7
  export { CancellationReason, CreateTurnRequestSchema, TurnInputItemSchema, TurnMetricsSchema, TurnSchema, TurnStateCancelledReasonSchema, TurnStateCancelledSchema, TurnStateDoneSchema, TurnStateErrorSchema, TurnStateRunningSchema, TurnStateSchema, } from './schemas/turn';
8
8
  export type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';
9
- export { SessionMetadataSchema, SessionMetricsSchema, SessionSchema } from './schemas/session';
10
- export type { Session, SessionAgent, SessionMetadata, SessionMetrics } from './schemas/session';
9
+ export { SessionMetadataSchema, SessionMetricsSchema, SessionSchema, SessionSourceScheduleSchema, SessionSourceSchema, SessionSourceTypeSchema, } from './schemas/session';
10
+ export type { Session, SessionAgent, SessionMetadata, SessionMetrics, SessionSource, SessionSourceType, } from './schemas/session';
11
11
  export { CreatedBySubjectSchema } from './schemas/subject';
12
12
  export type { CreatedBySubject } from './schemas/subject';
13
13
  export { EventType, SessionEventItemSchema, SessionEventSchema, TurnCreatedEventSchema, TurnDoneEventSchema, } from './schemas/events';
@@ -19,7 +19,7 @@ export { MAIN_THREAD_ID } from './models/TurnRecord';
19
19
  export type { TurnRecord, TurnSnapshot } from './models/TurnRecord';
20
20
  export { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';
21
21
  export { InMemorySessionStore } from './store/InMemorySessionStore';
22
- export type { AddThreadsInput, AppendToEventsInput, AppendToThreadContextInput, CreateSessionInput, CreateTurnInput, DeleteSessionInput, FreezeAndGetTurnInput, GetSessionByExternalIdInput, GetSessionInput, GetTurnInput, ISessionStore, ListSessionEventsInput, ListSessionsInput, ListTurnEventsInput, ListTurnsInput, NewThreadInit, OverwriteThreadContextInput, PatchMCPServersInput, PatchSandboxInfoInput, PatchThreadCapabilityStateInput, RemoveThreadsInput, TurnContextAppend, TurnRecordWithoutSnapshot, UpdateSessionInput, UpdateTurnStateInput, } from './store/ISessionStore';
22
+ export type { AddThreadsInput, AppendToEventsInput, AppendToThreadContextInput, CreateSessionInput, CreateTurnInput, DeleteSessionInput, FreezeAndGetTurnInput, GetOwnedIdsInput, GetSessionByExternalIdInput, GetSessionInput, GetTurnInput, ISessionStore, ListSessionEventsInput, ListSessionsInput, ListTurnEventsInput, ListTurnsInput, NewThreadInit, OverwriteThreadContextInput, PatchMCPServersInput, PatchSandboxInfoInput, PatchThreadCapabilityStateInput, RemoveThreadsInput, TurnContextAppend, TurnRecordWithoutSnapshot, UpdateSessionInput, UpdateTurnStateInput, } from './store/ISessionStore';
23
23
  export { InvalidPageTokenError, PreviousTurnRunningError, SessionAlreadyExistsError, SessionExternalIdConflictError, SessionNotFoundError, SessionStoreConflictError, SessionStoreInvariantError, SessionStoreNotFoundError, TurnAlreadyExistsError, TurnNotFoundError, TurnNotRunningError, } from './store/SessionStoreErrors';
24
24
  export type { ITurnResourceResolver } from './ITurnResourceResolver';
25
25
  export { TurnResourceResolver } from './TurnResourceResolver';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,oCAAoC,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACjH,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,8BAA8B,EAC9B,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC/F,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEhG,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,2BAA2B,EAC3B,eAAe,EACf,YAAY,EACZ,aAAa,EACb,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,+BAA+B,EAC/B,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-session/index.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,9 @@ __export(agent_session_exports, {
40
40
  SessionMetricsSchema: () => import_session.SessionMetricsSchema,
41
41
  SessionNotFoundError: () => import_SessionStoreErrors.SessionNotFoundError,
42
42
  SessionSchema: () => import_session.SessionSchema,
43
+ SessionSourceScheduleSchema: () => import_session.SessionSourceScheduleSchema,
44
+ SessionSourceSchema: () => import_session.SessionSourceSchema,
45
+ SessionSourceTypeSchema: () => import_session.SessionSourceTypeSchema,
43
46
  SessionStoreConflictError: () => import_SessionStoreErrors.SessionStoreConflictError,
44
47
  SessionStoreInvariantError: () => import_SessionStoreErrors.SessionStoreInvariantError,
45
48
  SessionStoreNotFoundError: () => import_SessionStoreErrors.SessionStoreNotFoundError,
@@ -100,6 +103,9 @@ var import_TurnHandle = require("./TurnHandle.js");
100
103
  SessionMetricsSchema,
101
104
  SessionNotFoundError,
102
105
  SessionSchema,
106
+ SessionSourceScheduleSchema,
107
+ SessionSourceSchema,
108
+ SessionSourceTypeSchema,
103
109
  SessionStoreConflictError,
104
110
  SessionStoreInvariantError,
105
111
  SessionStoreNotFoundError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport { SessionMetadataSchema, SessionMetricsSchema, SessionSchema } from './schemas/session';\nexport type { Session, SessionAgent, SessionMetadata, SessionMetrics } from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAA2F;AAG3F,kBAYO;AAGP,qBAA2E;AAG3E,qBAAuC;AAGvC,oBAMO;AASP,wBAAsC;AAItC,wBAA+B;AAG/B,yCAA4C;AAC5C,kCAAqC;AA4BrC,gCAYO;AAGP,kCAAqC;AAGrC,2BAA8B;AAC9B,sBAAyB;AACzB,wBAA2B;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetOwnedIdsInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAA2F;AAG3F,kBAYO;AAGP,qBAOO;AAUP,qBAAuC;AAGvC,oBAMO;AASP,wBAAsC;AAItC,wBAA+B;AAG/B,yCAA4C;AAC5C,kCAAqC;AA6BrC,gCAYO;AAGP,kCAAqC;AAGrC,2BAA8B;AAC9B,sBAAyB;AACzB,wBAA2B;","names":[]}
@@ -13,7 +13,14 @@ import {
13
13
  TurnStateRunningSchema,
14
14
  TurnStateSchema
15
15
  } from "./schemas/turn.mjs";
16
- import { SessionMetadataSchema, SessionMetricsSchema, SessionSchema } from "./schemas/session.mjs";
16
+ import {
17
+ SessionMetadataSchema,
18
+ SessionMetricsSchema,
19
+ SessionSchema,
20
+ SessionSourceScheduleSchema,
21
+ SessionSourceSchema,
22
+ SessionSourceTypeSchema
23
+ } from "./schemas/session.mjs";
17
24
  import { CreatedBySubjectSchema } from "./schemas/subject.mjs";
18
25
  import {
19
26
  EventType,
@@ -64,6 +71,9 @@ export {
64
71
  SessionMetricsSchema,
65
72
  SessionNotFoundError,
66
73
  SessionSchema,
74
+ SessionSourceScheduleSchema,
75
+ SessionSourceSchema,
76
+ SessionSourceTypeSchema,
67
77
  SessionStoreConflictError,
68
78
  SessionStoreInvariantError,
69
79
  SessionStoreNotFoundError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport { SessionMetadataSchema, SessionMetricsSchema, SessionSchema } from './schemas/session';\nexport type { Session, SessionAgent, SessionMetadata, SessionMetrics } from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";AAKA,SAAS,iBAAiB,sCAAsC,2BAA2B;AAG3F;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,uBAAuB,sBAAsB,qBAAqB;AAG3E,SAAS,8BAA8B;AAGvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,6BAA6B;AAItC,SAAS,sBAAsB;AAG/B,SAAS,mCAAmC;AAC5C,SAAS,4BAA4B;AA4BrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,4BAA4B;AAGrC,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetOwnedIdsInput,\n GetSessionByExternalIdInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";AAKA,SAAS,iBAAiB,sCAAsC,2BAA2B;AAG3F;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP,SAAS,8BAA8B;AAGvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,6BAA6B;AAItC,SAAS,sBAAsB;AAG/B,SAAS,mCAAmC;AAC5C,SAAS,4BAA4B;AA6BrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,4BAA4B;AAGrC,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;","names":[]}
@@ -1,4 +1,4 @@
1
- import type { SessionAgent, SessionMetadata, SessionMetrics } from '../schemas/session';
1
+ import type { SessionAgent, SessionMetadata, SessionMetrics, SessionSource } from '../schemas/session';
2
2
  import type { CreatedBySubject } from '../schemas/subject';
3
3
  /**
4
4
  * Session persistence record. Agent binding is a single discriminated `agent`
@@ -21,6 +21,10 @@ export interface SessionRecord<TCustom extends object = Record<string, never>> {
21
21
  * Null means the session has no external id.
22
22
  */
23
23
  external_id: string | null;
24
+ /**
25
+ * How the session was created. Null for interactive sessions.
26
+ */
27
+ source: SessionSource | null;
24
28
  /**
25
29
  * Session tip — used for `previous_turn_id: 'auto'` resolution and turn
26
30
  * listing anchors. Advanced only by `createTurn` (atomic link).
@@ -1 +1 @@
1
- {"version":3,"file":"SessionRecord.d.ts","sourceRoot":"","sources":["../../../src/agent-session/models/SessionRecord.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sFAAsF;IACtF,UAAU,EAAE,IAAI,CAAC;IACjB,2FAA2F;IAC3F,UAAU,EAAE,IAAI,CAAC;IACjB;;;OAGG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB"}
1
+ {"version":3,"file":"SessionRecord.d.ts","sourceRoot":"","sources":["../../../src/agent-session/models/SessionRecord.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sFAAsF;IACtF,UAAU,EAAE,IAAI,CAAC;IACjB,2FAA2F;IAC3F,UAAU,EAAE,IAAI,CAAC;IACjB;;;OAGG;IACH,0BAA0B,EAAE,MAAM,CAAC;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACxB"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/models/SessionRecord.ts"],"sourcesContent":["import type { SessionAgent, SessionMetadata, SessionMetrics } from '../schemas/session';\nimport type { CreatedBySubject } from '../schemas/subject';\n\n/**\n * Session persistence record. Agent binding is a single discriminated `agent`\n * (`reference` | `inline`). Reference rows carry create-time `name` snapshot\n * (nullable for legacy/orphan). Named agents are not hydrated to inline on read.\n */\nexport interface SessionRecord<TCustom extends object = Record<string, never>> {\n tenant_id: string;\n session_id: string;\n /** Caller identity that created the session (immutable after create). */\n created_by_subject: CreatedBySubject;\n agent: SessionAgent;\n /**\n * Public session title (nullable). Written via updateSession patch or createTurn's\n * update_session_title_if_not_exist (first write wins; caller derives).\n */\n title: string | null;\n /**\n * Optional caller-supplied key, unique within a tenant when set.\n * Null means the session has no external id.\n */\n external_id: string | null;\n /**\n * Session tip — used for `previous_turn_id: 'auto'` resolution and turn\n * listing anchors. Advanced only by `createTurn` (atomic link).\n */\n last_turn_id: string | null;\n /** Instant the session was created (store domain). Wire/API serialize as ISO-8601. */\n created_at: Date;\n /** Instant the session was last updated (store domain). Wire/API serialize as ISO-8601. */\n updated_at: Date;\n /**\n * Liveness clock (ms since epoch). The store bumps it on createSession,\n * updateSession, and createTurn — never on reads.\n */\n last_activity_timestamp_ms: number;\n metrics: SessionMetrics;\n metadata: SessionMetadata;\n custom: TCustom | null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/agent-session/models/SessionRecord.ts"],"sourcesContent":["import type { SessionAgent, SessionMetadata, SessionMetrics, SessionSource } from '../schemas/session';\nimport type { CreatedBySubject } from '../schemas/subject';\n\n/**\n * Session persistence record. Agent binding is a single discriminated `agent`\n * (`reference` | `inline`). Reference rows carry create-time `name` snapshot\n * (nullable for legacy/orphan). Named agents are not hydrated to inline on read.\n */\nexport interface SessionRecord<TCustom extends object = Record<string, never>> {\n tenant_id: string;\n session_id: string;\n /** Caller identity that created the session (immutable after create). */\n created_by_subject: CreatedBySubject;\n agent: SessionAgent;\n /**\n * Public session title (nullable). Written via updateSession patch or createTurn's\n * update_session_title_if_not_exist (first write wins; caller derives).\n */\n title: string | null;\n /**\n * Optional caller-supplied key, unique within a tenant when set.\n * Null means the session has no external id.\n */\n external_id: string | null;\n /**\n * How the session was created. Null for interactive sessions.\n */\n source: SessionSource | null;\n /**\n * Session tip — used for `previous_turn_id: 'auto'` resolution and turn\n * listing anchors. Advanced only by `createTurn` (atomic link).\n */\n last_turn_id: string | null;\n /** Instant the session was created (store domain). Wire/API serialize as ISO-8601. */\n created_at: Date;\n /** Instant the session was last updated (store domain). Wire/API serialize as ISO-8601. */\n updated_at: Date;\n /**\n * Liveness clock (ms since epoch). The store bumps it on createSession,\n * updateSession, and createTurn — never on reads.\n */\n last_activity_timestamp_ms: number;\n metrics: SessionMetrics;\n metadata: SessionMetadata;\n custom: TCustom | null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -1,4 +1,4 @@
1
- /** DB AgentSpec wire schema — FQN model names and name-only skill refs. */
1
+ /** DB AgentSpec wire schema — FQN model names and skill refs (name + optional preload). */
2
2
  import { z } from '@hono/zod-openapi';
3
3
  export declare const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;
4
4
  export declare const RuntimeConfigSchema: z.ZodObject<{
@@ -29,9 +29,10 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
29
29
  enabled: z.ZodDefault<z.ZodBoolean>;
30
30
  }, z.core.$strip>>;
31
31
  }, z.core.$strip>;
32
- /** Name-only skill selection; mount fields come from the skill store. */
32
+ /** Skill selection; mount fields come from the skill store. */
33
33
  declare const SkillSchema: z.ZodObject<{
34
34
  name: z.ZodString;
35
+ preload: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
35
36
  }, z.core.$strict>;
36
37
  declare const InitialUserMessageSchema: z.ZodObject<{
37
38
  type: z.ZodLiteral<"user.message">;
@@ -90,6 +91,7 @@ export declare const AgentSpecSchema: z.ZodObject<{
90
91
  }, z.core.$loose>], "type">>;
91
92
  skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
92
93
  name: z.ZodString;
94
+ preload: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
93
95
  }, z.core.$strict>>>;
94
96
  config: z.ZodDefault<z.ZodObject<{
95
97
  iteration_limit: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"agentSpec.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/agentSpec.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAgBtC,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAuLxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBL,CAAC;AAO5B,yEAAyE;AACzE,QAAA,MAAM,WAAW;;kBAaE,CAAC;AAIpB,QAAA,MAAM,wBAAwB;;;iBASE,CAAC;AAIjC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBL,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"agentSpec.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/agentSpec.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAgBtC,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAuLxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBL,CAAC;AAS5B,+DAA+D;AAC/D,QAAA,MAAM,WAAW;;;kBAaE,CAAC;AAIpB,QAAA,MAAM,wBAAwB;;;iBASE,CAAC;AAIjC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBL,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}