@harness-kernel/core 0.1.1 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/agent/context.d.ts +1 -1
  2. package/dist/agent/context.js +1 -1
  3. package/dist/agent/event.js +2 -2
  4. package/dist/agent/hook.d.ts +2 -2
  5. package/dist/agent/hook.js +1 -1
  6. package/dist/agent/mode.d.ts +1 -1
  7. package/dist/agent/mode.js +1 -1
  8. package/dist/agent/role.js +1 -1
  9. package/dist/agent/session.d.ts +1 -1
  10. package/dist/agent/session.js +1 -1
  11. package/dist/agent/tool.d.ts +1 -1
  12. package/dist/agent/tool.js +1 -1
  13. package/dist/agent.d.ts +4 -4
  14. package/dist/{approval-DfvjpbFs.d.ts → approval-D_G2w-fW.d.ts} +10 -14
  15. package/dist/{chunk-4A2P4QU5.js → chunk-B4Q6CPYO.js} +2 -1
  16. package/dist/chunk-B4Q6CPYO.js.map +1 -0
  17. package/dist/{chunk-4SYLFKIX.js → chunk-JIJHGB6H.js} +2 -2
  18. package/dist/chunk-ONYDIU4X.js +284 -0
  19. package/dist/chunk-ONYDIU4X.js.map +1 -0
  20. package/dist/{chunk-4WWSQAWA.js → chunk-QEVKKJ7N.js} +199 -75
  21. package/dist/chunk-QEVKKJ7N.js.map +1 -0
  22. package/dist/{chunk-AD3BCYWU.js → chunk-ZU6ADDET.js} +1 -1
  23. package/dist/chunk-ZU6ADDET.js.map +1 -0
  24. package/dist/{context-75mlon5x.d.ts → context-BfpLqV11.d.ts} +5 -3
  25. package/dist/{hook-DMb9fw9Z.d.ts → hook-CfBbhUQf.d.ts} +1 -1
  26. package/dist/index.d.ts +13 -11
  27. package/dist/index.js +9 -5
  28. package/dist/{model-provider-BrZ2RRmS.d.ts → model-provider-Ch7tzk1x.d.ts} +6 -8
  29. package/dist/runner/approval.d.ts +5 -5
  30. package/dist/runner/event.js +2 -2
  31. package/dist/runner/model-provider.d.ts +4 -4
  32. package/dist/runner/sandbox.d.ts +1 -1
  33. package/dist/runner/sandbox.js +1 -1
  34. package/dist/runner/storage.d.ts +2 -2
  35. package/dist/runner/storage.js +5 -1
  36. package/dist/{runner-Dxo7ALtp.d.ts → runner-B41JEovO.d.ts} +16 -9
  37. package/dist/runner.d.ts +6 -6
  38. package/dist/runner.js +5 -5
  39. package/dist/{storage-BmOEwW-p.d.ts → storage-DCZE_hES.d.ts} +84 -2
  40. package/package.json +2 -2
  41. package/dist/chunk-4A2P4QU5.js.map +0 -1
  42. package/dist/chunk-4WWSQAWA.js.map +0 -1
  43. package/dist/chunk-AD3BCYWU.js.map +0 -1
  44. package/dist/chunk-AZVA22HW.js +0 -135
  45. package/dist/chunk-AZVA22HW.js.map +0 -1
  46. /package/dist/{chunk-4SYLFKIX.js.map → chunk-JIJHGB6H.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  export { c as HarnessRoleSelector } from '../role-BN6KhQxx.js';
2
- export { a as AgentContextProvider, b as AgentContextReader, c as AgentContextSession, C as ContextConsume, z as ContextContribution, B as ContextContributionInput, D as ContextEntry, E as ContextEntryFilter, F as ContextProviderBinding, G as ContextProviderOutput, H as ContextProviderReference, I as ContextProviderRenderResult, J as ContextProviderSummary, K as ContextRegistrationOptions, L as ContextScopes, M as ContextSnapshot, N as HarnessContextProvider, O as HarnessContextProviderClass, P as HarnessContextProviderSelector } from '../context-75mlon5x.js';
2
+ export { a as AgentContextProvider, b as AgentContextReader, c as AgentContextSession, C as ContextConsume, z as ContextContribution, B as ContextContributionInput, D as ContextEntry, E as ContextEntryFilter, F as ContextProviderBinding, G as ContextProviderOutput, H as ContextProviderReference, I as ContextProviderRenderResult, J as ContextProviderSummary, K as ContextRegistrationOptions, L as ContextScopes, M as ContextSnapshot, N as HarnessContextProvider, O as HarnessContextProviderClass, P as HarnessContextProviderSelector } from '../context-BfpLqV11.js';
3
3
  import '../events-D4xcDi53.js';
4
4
  import '../types-BPmsw-mF.js';
5
5
  import '../runner/sandbox.js';
@@ -2,7 +2,7 @@ import {
2
2
  ContextConsume,
3
3
  ContextScopes,
4
4
  HarnessContextProvider
5
- } from "../chunk-4A2P4QU5.js";
5
+ } from "../chunk-B4Q6CPYO.js";
6
6
  export {
7
7
  ContextConsume,
8
8
  ContextScopes,
@@ -19,11 +19,11 @@ import {
19
19
  TranscriptCursorChangedEvent,
20
20
  TurnEndEvent,
21
21
  TurnStartEvent
22
- } from "../chunk-4SYLFKIX.js";
22
+ } from "../chunk-JIJHGB6H.js";
23
23
  import "../chunk-OBKS4AJR.js";
24
24
  import {
25
25
  HarnessEvent
26
- } from "../chunk-4A2P4QU5.js";
26
+ } from "../chunk-B4Q6CPYO.js";
27
27
  export {
28
28
  ContextReadyEvent,
29
29
  ErrorEvent,
@@ -1,6 +1,6 @@
1
1
  export { H as HarnessEvent, a as HarnessEventClass } from '../events-D4xcDi53.js';
2
- export { H as HarnessHook, a as HarnessHookEventClass } from '../hook-DMb9fw9Z.js';
3
- import '../context-75mlon5x.js';
2
+ export { H as HarnessHook, a as HarnessHookEventClass } from '../hook-CfBbhUQf.js';
3
+ import '../context-BfpLqV11.js';
4
4
  import '../role-BN6KhQxx.js';
5
5
  import '../types-BPmsw-mF.js';
6
6
  import '../runner/sandbox.js';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HarnessHook
3
- } from "../chunk-4A2P4QU5.js";
3
+ } from "../chunk-B4Q6CPYO.js";
4
4
  export {
5
5
  HarnessHook
6
6
  };
@@ -1,4 +1,4 @@
1
- export { m as AgentModeDefinition, H as ContextProviderReference, Q as HarnessMode, R as HarnessModeClass, S as HarnessModeSelector, T as HarnessModeSummary, a3 as ToolApprovalMode } from '../context-75mlon5x.js';
1
+ export { m as AgentModeDefinition, H as ContextProviderReference, Q as HarnessMode, R as HarnessModeClass, S as HarnessModeSelector, T as HarnessModeSummary, a3 as ToolApprovalMode } from '../context-BfpLqV11.js';
2
2
  import '../role-BN6KhQxx.js';
3
3
  import '../events-D4xcDi53.js';
4
4
  import '../types-BPmsw-mF.js';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HarnessMode
3
- } from "../chunk-4A2P4QU5.js";
3
+ } from "../chunk-B4Q6CPYO.js";
4
4
  export {
5
5
  HarnessMode
6
6
  };
@@ -10,7 +10,7 @@ import {
10
10
  systemRole,
11
11
  toolRole,
12
12
  userRole
13
- } from "../chunk-4A2P4QU5.js";
13
+ } from "../chunk-B4Q6CPYO.js";
14
14
  export {
15
15
  AssistantRole,
16
16
  HarnessRole,
@@ -1,5 +1,5 @@
1
1
  export { E as EventCursor, d as HarnessEventQuery, e as HarnessEventRecord } from '../events-D4xcDi53.js';
2
- export { A as AgentActionSession, b as AgentContextReader, c as AgentContextSession, d as AgentEventReader, e as AgentEventSession, f as AgentHistorySession, g as AgentLogSession, h as AgentMessage, i as AgentMessageEnqueueOptions, j as AgentMessageInput, l as AgentMessageSession, n as AgentModeReader, o as AgentModeSession, p as AgentReadSession, t as AgentStateReader, u as AgentStateSession, w as AgentToolResult, x as AgentToolSession, C as ContextConsume, D as ContextEntry, E as ContextEntryFilter, K as ContextRegistrationOptions, L as ContextScopes, T as HarnessModeSummary, U as HarnessSnapshot, V as HarnessSnapshotCreator, W as HarnessSnapshotInput, X as HarnessSnapshotSession, Y as HarnessSnapshotSummary, a0 as HarnessTranscriptSession, aa as TranscriptBranch, ab as TranscriptCursor, ac as TranscriptQuery, ad as TranscriptSeekTarget } from '../context-75mlon5x.js';
2
+ export { A as AgentActionSession, b as AgentContextReader, c as AgentContextSession, d as AgentEventReader, e as AgentEventSession, f as AgentHistorySession, g as AgentLogSession, h as AgentMessage, i as AgentMessageEnqueueOptions, j as AgentMessageInput, l as AgentMessageSession, n as AgentModeReader, o as AgentModeSession, p as AgentReadSession, t as AgentStateReader, u as AgentStateSession, w as AgentToolResult, x as AgentToolSession, C as ContextConsume, D as ContextEntry, E as ContextEntryFilter, K as ContextRegistrationOptions, L as ContextScopes, T as HarnessModeSummary, U as HarnessSnapshot, V as HarnessSnapshotCreator, W as HarnessSnapshotInput, X as HarnessSnapshotSession, Y as HarnessSnapshotSummary, a0 as HarnessTranscriptSession, aa as TranscriptBranch, ab as TranscriptCursor, ac as TranscriptQuery, ad as TranscriptSeekTarget } from '../context-BfpLqV11.js';
3
3
  export { c as HarnessRoleSelector, N as NativeRoles, R as RoleTargets } from '../role-BN6KhQxx.js';
4
4
  export { T as ToolErrorCode, a as ToolErrorPayload, b as ToolInvalidField } from '../tool-errors-CygY1Nba.js';
5
5
  import '../types-BPmsw-mF.js';
@@ -3,7 +3,7 @@ import {
3
3
  ContextScopes,
4
4
  NativeRoles,
5
5
  RoleTargets
6
- } from "../chunk-4A2P4QU5.js";
6
+ } from "../chunk-B4Q6CPYO.js";
7
7
  export {
8
8
  ContextConsume,
9
9
  ContextScopes,
@@ -1,4 +1,4 @@
1
- export { v as AgentToolDefinition, w as AgentToolResult, y as AgentToolSource, Z as HarnessTool, _ as HarnessToolClass, $ as HarnessToolSelector, a5 as ToolApprovalResolver, a6 as ToolCatalogEntry, a7 as ToolPermission, a8 as ToolRef, a9 as ToolRisk } from '../context-75mlon5x.js';
1
+ export { v as AgentToolDefinition, w as AgentToolResult, y as AgentToolSource, Z as HarnessTool, _ as HarnessToolClass, $ as HarnessToolSelector, a5 as ToolApprovalResolver, a6 as ToolCatalogEntry, a7 as ToolPermission, a8 as ToolRef, a9 as ToolRisk } from '../context-BfpLqV11.js';
2
2
  import '../role-BN6KhQxx.js';
3
3
  import '../events-D4xcDi53.js';
4
4
  import '../types-BPmsw-mF.js';
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  HarnessTool
3
- } from "../chunk-4A2P4QU5.js";
3
+ } from "../chunk-B4Q6CPYO.js";
4
4
  export {
5
5
  HarnessTool
6
6
  };
package/dist/agent.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { A as AgentDefinition } from './model-provider-BrZ2RRmS.js';
1
+ import { A as AgentDefinition } from './model-provider-Ch7tzk1x.js';
2
2
  export { J as JsonObject } from './events-D4xcDi53.js';
3
- export { r as AgentSharedState, s as AgentSharedStateDefinition } from './context-75mlon5x.js';
3
+ export { r as AgentSharedState, s as AgentSharedStateDefinition } from './context-BfpLqV11.js';
4
4
  import './role-BN6KhQxx.js';
5
5
  import './runner/sandbox.js';
6
- import './storage-BmOEwW-p.js';
7
- import './hook-DMb9fw9Z.js';
6
+ import './storage-DCZE_hES.js';
7
+ import './hook-CfBbhUQf.js';
8
8
  import './types-BPmsw-mF.js';
9
9
 
10
10
  declare function defineAgent(definition: AgentDefinition): AgentDefinition;
@@ -1,10 +1,10 @@
1
- import { A as AgentDefinition, H as HarnessModelProvider, e as ModelProviderInfo } from './model-provider-BrZ2RRmS.js';
1
+ import { A as AgentDefinition, H as HarnessModelProvider, e as ModelProviderInfo } from './model-provider-Ch7tzk1x.js';
2
2
  import { j as HarnessLoggingConfig } from './types-BPmsw-mF.js';
3
3
  import { e as HarnessEventRecord, a as HarnessEventClass, d as HarnessEventQuery, H as HarnessEvent } from './events-D4xcDi53.js';
4
- import { T as HarnessModeSummary, J as ContextProviderSummary, a6 as ToolCatalogEntry, S as HarnessModeSelector, a3 as ToolApprovalMode, h as AgentMessage, a9 as ToolRisk, a7 as ToolPermission, w as AgentToolResult, r as AgentSharedState, a0 as HarnessTranscriptSession, X as HarnessSnapshotSession, M as ContextSnapshot } from './context-75mlon5x.js';
4
+ import { T as HarnessModeSummary, J as ContextProviderSummary, a6 as ToolCatalogEntry, h as AgentMessage, a9 as ToolRisk, a7 as ToolPermission, w as AgentToolResult, S as HarnessModeSelector, r as AgentSharedState, a0 as HarnessTranscriptSession, X as HarnessSnapshotSession, M as ContextSnapshot } from './context-BfpLqV11.js';
5
5
  import { d as HarnessRoleSummary, c as HarnessRoleSelector } from './role-BN6KhQxx.js';
6
- import { H as HarnessRunStorage, d as RunMetrics } from './storage-BmOEwW-p.js';
7
- import { b as HarnessHookSummary } from './hook-DMb9fw9Z.js';
6
+ import { c as HarnessSessionStorage, h as RunMetrics, S as SessionListQuery, i as SessionListResult } from './storage-DCZE_hES.js';
7
+ import { b as HarnessHookSummary } from './hook-CfBbhUQf.js';
8
8
  import { HarnessSandbox } from './runner/sandbox.js';
9
9
 
10
10
  interface HarnessEventSummary {
@@ -30,21 +30,15 @@ interface HarnessAgentManifest {
30
30
  type HarnessAgentInput = {
31
31
  definition: AgentDefinition;
32
32
  };
33
- type HarnessStorageConfig = HarnessRunStorage;
33
+ type HarnessStorageConfig = HarnessSessionStorage;
34
34
  interface HarnessAppConfig {
35
35
  agent: HarnessAgentInput;
36
36
  providers: HarnessModelProvider[];
37
37
  defaultModel: string;
38
- workDir?: string;
39
38
  storage?: HarnessStorageConfig;
40
39
  sandbox?: HarnessSandbox;
41
- initialMode?: HarnessModeSelector | string;
42
- toolApproval?: ToolApprovalMode;
43
- maxTurns?: number;
44
- services?: Record<string, unknown>;
40
+ resources?: Record<string, unknown>;
45
41
  logging?: HarnessLoggingConfig;
46
- sessionTtlMs?: number;
47
- toolApprovalTimeoutMs?: number;
48
42
  }
49
43
  interface HarnessUserInput {
50
44
  id?: string;
@@ -231,9 +225,11 @@ type HarnessSessionStoreListener = (event: HarnessSessionStoreEvent) => void | P
231
225
  interface HarnessSessionStore {
232
226
  getOrCreate(sessionId?: string, overrides?: Partial<HarnessAppConfig>): Promise<HarnessSession>;
233
227
  get(sessionId: string): HarnessSession | undefined;
234
- list(): HarnessSessionStatus[];
228
+ list(query?: SessionListQuery): Promise<SessionListResult>;
229
+ close(sessionId: string): Promise<boolean>;
235
230
  delete(sessionId: string): Promise<boolean>;
236
- clear(): Promise<void>;
231
+ clearActive(): Promise<void>;
232
+ closeAll(): Promise<void>;
237
233
  send(sessionId: string | undefined, input: string | HarnessUserInput, options?: SendOptions): Promise<SendResult>;
238
234
  stream(sessionId: string | undefined, input: string | HarnessUserInput, options?: StreamOptions): Promise<HarnessRunStream>;
239
235
  getPendingApprovals(sessionId?: string): ToolApprovalHandle[];
@@ -94,6 +94,7 @@ var HarnessTool = class {
94
94
  risk;
95
95
  permissions;
96
96
  requiresApproval;
97
+ approvalTimeoutMs;
97
98
  get type() {
98
99
  return constructTypeOf(this);
99
100
  }
@@ -176,4 +177,4 @@ export {
176
177
  HarnessMode,
177
178
  HarnessHook
178
179
  };
179
- //# sourceMappingURL=chunk-4A2P4QU5.js.map
180
+ //# sourceMappingURL=chunk-B4Q6CPYO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/types/events.ts","../src/runtime/types/naming.ts","../src/runtime/types/roles.ts","../src/runtime/types/tools.ts","../src/runtime/types/context.ts","../src/runtime/types/modes.ts","../src/runtime/types/hooks.ts"],"sourcesContent":["import type { JsonObject } from \"./json.js\";\n\nexport interface HarnessEventMetadata extends JsonObject {\n label?: string;\n}\n\nexport interface HarnessEventSource {\n kind: \"runtime\" | \"model_provider\" | \"tool\" | \"hook\" | \"context_provider\" | \"mode\" | \"user\" | \"custom\";\n id?: string;\n name?: string;\n}\n\nexport interface HarnessEventRecord<TPayload = unknown> {\n id: string;\n seq: number;\n branchId: string;\n type: string;\n eventClassId: string;\n at: string;\n source: HarnessEventSource;\n payload: TPayload;\n runId: string;\n turnId?: string;\n modeId?: string;\n correlationId?: string;\n causationId?: string;\n hidden: true;\n metadata?: HarnessEventMetadata;\n}\n\nexport abstract class HarnessEvent<TPayload = unknown> {\n static type?: string;\n static schema?: unknown;\n\n constructor(readonly record: HarnessEventRecord<TPayload>) {}\n\n get id(): string {\n return this.record.id;\n }\n\n get type(): string {\n return this.record.type;\n }\n\n get payload(): TPayload {\n return this.record.payload;\n }\n\n get at(): string {\n return this.record.at;\n }\n}\n\nexport type HarnessEventClass<\n TPayload = unknown,\n TEvent extends HarnessEvent<TPayload> = HarnessEvent<TPayload>,\n> = {\n readonly type?: string;\n readonly schema?: unknown;\n new (record: HarnessEventRecord<any>): TEvent;\n};\n\nexport interface HarnessEventEmitOptions {\n source?: HarnessEventSource;\n correlationId?: string;\n causationId?: string;\n metadata?: HarnessEventMetadata;\n hiddenTranscript?: boolean;\n skipHooks?: boolean;\n}\n\nexport interface HarnessEventQuery<TPayload = unknown> {\n event?: HarnessEventClass<TPayload>;\n type?: string;\n sourceKind?: HarnessEventSource[\"kind\"];\n limit?: number;\n since?: string;\n until?: string;\n includeInactive?: boolean;\n}\n\nexport interface EventCursor {\n id: string;\n branchId: string;\n headEventId?: string;\n seq: number;\n updatedAt: string;\n}\n\nexport type RunnerEventListener = (event: HarnessEventRecord) => void | Promise<void>;\n","function constructorOf(value: object): { readonly type?: string; readonly label?: string; readonly name?: string } {\n return value.constructor as { readonly type?: string; readonly label?: string; readonly name?: string };\n}\n\nexport function constructTypeOf(value: object): string {\n const ctor = constructorOf(value);\n return ctor.type ?? ctor.name ?? \"AnonymousConstruct\";\n}\n\nfunction stripConstructSuffix(name: string): string {\n return name.replace(/(Tool|Mode|Provider|ContextProvider|Hook|Role|Event)$/u, \"\");\n}\n\nfunction wordsFromName(name: string): string[] {\n const spaced = name\n .replace(/[_:-]+/gu, \" \")\n .replace(/([a-z0-9])([A-Z])/gu, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/gu, \"$1 $2\")\n .trim();\n return spaced ? spaced.split(/\\s+/u) : [name];\n}\n\nexport function labelFromType(type: string): string {\n return wordsFromName(stripConstructSuffix(type))\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nexport function snakeFromType(type: string): string {\n return wordsFromName(stripConstructSuffix(type))\n .map((word) => word.toLowerCase())\n .join(\"_\");\n}\n","import { constructTypeOf } from \"./naming.js\";\n\nexport interface HarnessRoleSummary {\n type: string;\n name: string;\n label?: string;\n target: string;\n nativeRole?: string;\n default?: boolean;\n description?: string;\n}\n\nexport enum RoleTargets {\n System = \"system\",\n Messages = \"messages\",\n Hidden = \"hidden\",\n}\n\nexport enum NativeRoles {\n System = \"system\",\n User = \"user\",\n Assistant = \"assistant\",\n Tool = \"tool\",\n}\n\nexport abstract class HarnessRole {\n protected declare readonly __harnessRoleBrand: true;\n\n label?: string;\n name?: string;\n abstract target: RoleTargets | (string & {});\n nativeRole?: NativeRoles | (string & {});\n default?: boolean;\n description?: string;\n\n get type(): string {\n return constructTypeOf(this);\n }\n\n}\n\nexport type HarnessRoleClass<TRole extends HarnessRole = HarnessRole> = abstract new (...args: any[]) => TRole;\nexport type HarnessRoleDefinition = HarnessRole;\nexport type HarnessRoleSelector<TRole extends HarnessRole = HarnessRole> = TRole | HarnessRoleClass<TRole>;\n\nexport class SystemRole extends HarnessRole {\n static type = \"system\";\n label = \"System\";\n name = \"system\";\n target = RoleTargets.System;\n nativeRole = NativeRoles.System;\n default = true;\n}\n\nexport class UserRole extends HarnessRole {\n static type = \"user\";\n label = \"User\";\n name = \"user\";\n target = RoleTargets.Messages;\n nativeRole = NativeRoles.User;\n}\n\nexport class AssistantRole extends HarnessRole {\n static type = \"assistant\";\n label = \"Assistant\";\n name = \"assistant\";\n target = RoleTargets.Messages;\n nativeRole = NativeRoles.Assistant;\n}\n\nexport class ToolRole extends HarnessRole {\n static type = \"tool\";\n label = \"Tool\";\n name = \"tool\";\n target = RoleTargets.Messages;\n nativeRole = NativeRoles.Tool;\n}\n\nexport const systemRole = new SystemRole();\nexport const userRole = new UserRole();\nexport const assistantRole = new AssistantRole();\nexport const toolRole = new ToolRole();\n","import type { AgentActionSession } from \"./sessions.js\";\nimport type { JsonObject } from \"./json.js\";\nimport { constructTypeOf } from \"./naming.js\";\n\nexport type ToolApprovalMode = \"auto\" | \"ask\" | \"deny\" | \"tool-default\";\nexport type ToolApprovalDecision = \"approved\" | \"denied\";\nexport type ToolRisk = \"safe\" | \"read\" | \"write\" | \"execute\" | \"network\" | \"destructive\";\n\nexport interface ToolPermission {\n kind: \"filesystem\" | \"shell\" | \"network\" | \"custom\";\n access?: \"read\" | \"write\" | \"execute\";\n path?: string;\n description?: string;\n}\n\nexport type ToolRef =\n | { kind: \"file\"; path: string; role?: \"created\" | \"modified\" | \"read\" | \"evidence\" }\n | { kind: \"url\"; url: string; role?: string }\n | { kind: \"command\"; command: string; exitCode?: number; role?: string }\n | { kind: \"tool_call\"; toolName: string; callId?: string; role?: string }\n | { kind: \"session\"; sessionId: string; role?: string }\n | { kind: \"external\"; label: string; uri?: string; role?: string };\n\nexport interface ToolCatalogEntry {\n name: string;\n description: string;\n risk?: ToolRisk;\n permissions?: ToolPermission[];\n requiresApproval?: boolean;\n}\n\nexport type ToolApprovalResolver = (\n args: unknown,\n session: AgentActionSession,\n) => boolean | Promise<boolean>;\n\nexport interface AgentToolResult<TData = unknown> {\n content: string;\n data?: TData;\n refs?: ToolRef[];\n metadata?: JsonObject;\n isError?: boolean;\n}\n\nexport abstract class HarnessTool<TInput = unknown, TData = unknown> {\n protected declare readonly __harnessToolBrand: true;\n\n label?: string;\n abstract name: string;\n abstract description: string;\n schema?: unknown;\n risk?: ToolRisk;\n permissions?: ToolPermission[];\n requiresApproval?: boolean | ToolApprovalResolver;\n approvalTimeoutMs?: number;\n\n get type(): string {\n return constructTypeOf(this);\n }\n\n get inputSchema(): unknown {\n return this.schema;\n }\n\n abstract execute(args: TInput, session: AgentActionSession): AgentToolResult<TData> | Promise<AgentToolResult<TData>>;\n}\n\nexport type HarnessToolClass<TTool extends HarnessTool = HarnessTool> = abstract new (...args: any[]) => TTool;\nexport type HarnessToolSelector<TTool extends HarnessTool = HarnessTool> = TTool | HarnessToolClass<TTool>;\nexport type AgentToolDefinition<TInput = unknown, TData = unknown> = HarnessTool<TInput, TData>;\nexport type AgentToolSource = HarnessTool;\n\nexport interface ToolApprovalRequest {\n id: string;\n name: string;\n args: unknown;\n modeId: string;\n risk?: ToolRisk;\n permissions?: ToolPermission[];\n approvalTimeoutMs?: number;\n}\n","import type { AgentReadSession } from \"./sessions.js\";\nimport type { AgentMessage } from \"./messages.js\";\nimport type { HarnessEventClass } from \"./events.js\";\nimport type { HarnessRoleSelector } from \"./roles.js\";\nimport type { JsonObject } from \"./json.js\";\nimport { constructTypeOf } from \"./naming.js\";\n\nexport type HarnessContextProviderClass<\n TProvider extends HarnessContextProvider = HarnessContextProvider,\n> = abstract new (...args: any[]) => TProvider;\n\nexport type HarnessContextProviderSelector<TOptions extends JsonObject = JsonObject> =\n | HarnessContextProvider<TOptions>\n | HarnessContextProviderClass<HarnessContextProvider<TOptions>>;\n\nexport interface ContextProviderBinding<TOptions extends JsonObject = JsonObject> {\n provider: HarnessContextProviderSelector<TOptions>;\n options?: TOptions;\n}\n\nexport type ContextProviderReference<TOptions extends JsonObject = JsonObject> =\n | HarnessContextProviderSelector<TOptions>\n | ContextProviderBinding<TOptions>;\n\nexport interface ContextProviderSummary {\n type: string;\n label?: string;\n options?: JsonObject;\n}\n\nexport interface ContextContribution {\n providerId?: string;\n providerLabel?: string;\n role: string;\n authorRole?: string;\n roleType?: string;\n content: unknown;\n metadata?: JsonObject;\n}\n\nexport enum ContextScopes {\n Turn = \"turn\",\n Run = \"run\",\n Session = \"session\",\n}\n\nexport enum ContextConsume {\n Once = \"once\",\n WhileActive = \"while_active\",\n}\n\nexport interface ContextRegistrationOptions {\n scope?: ContextScopes;\n on?: HarnessEventClass;\n consume?: ContextConsume;\n id?: string;\n replace?: boolean;\n metadata?: JsonObject;\n}\n\nexport interface ContextEntry {\n id: string;\n scope: ContextScopes;\n on: string;\n consume: ContextConsume;\n createdAt: string;\n activatedAt?: string;\n activatedByEventId?: string;\n activatedByEventType?: string;\n runId: string;\n turnId?: string;\n modeId: string;\n contribution: ContextContribution;\n metadata?: JsonObject;\n}\n\nexport interface ContextEntryFilter {\n id?: string;\n scope?: ContextScopes;\n consume?: ContextConsume;\n providerId?: string;\n role?: string;\n on?: HarnessEventClass;\n}\n\nexport type ContextProviderOutput =\n | string\n | ContextContributionInput\n | Array<string | ContextContributionInput>\n | null\n | undefined;\n\nexport interface ContextContributionInput {\n role?: HarnessRoleSelector;\n content: unknown;\n metadata?: JsonObject;\n}\n\nexport interface ContextProviderRenderResult {\n providerId: string;\n providerLabel?: string;\n binding: ContextProviderSummary;\n contributions: ContextContribution[];\n}\n\nexport interface ContextSnapshot {\n id: string;\n turnId?: string;\n modeId: string;\n createdAt: string;\n providers: ContextProviderRenderResult[];\n contributions: ContextContribution[];\n systemPrompt: string;\n messages: AgentMessage[];\n}\n\nexport abstract class HarnessContextProvider<TOptions extends JsonObject = JsonObject> {\n protected declare readonly __harnessContextProviderBrand: true;\n\n label?: string;\n priority?: number;\n role?: HarnessRoleSelector;\n\n get type(): string {\n return constructTypeOf(this);\n }\n\n with(options: TOptions): ContextProviderBinding<TOptions> {\n return { provider: this, options };\n }\n\n abstract render(session: AgentReadSession, options?: TOptions): ContextProviderOutput | Promise<ContextProviderOutput>;\n}\n\nexport type AgentContextProvider<TOptions extends JsonObject = JsonObject> = HarnessContextProvider<TOptions>;\n","import type { AgentActionSession, AgentReadSession } from \"./sessions.js\";\nimport type { AgentToolSource, ToolApprovalMode } from \"./tools.js\";\nimport type { ContextProviderReference } from \"./context.js\";\nimport { constructTypeOf } from \"./naming.js\";\n\nexport interface HarnessModeSummary {\n type: string;\n label: string;\n}\n\nexport abstract class HarnessMode {\n protected declare readonly __harnessModeBrand: true;\n\n label?: string;\n model?: string;\n prompt?: string | ((session: AgentReadSession) => string | Promise<string>);\n providers?: \"all\" | ContextProviderReference[];\n excludeProviders?: string[];\n tools?: AgentToolSource[];\n maxTurns?: number;\n toolApproval?: ToolApprovalMode;\n\n get type(): string {\n return constructTypeOf(this);\n }\n\n getPrompt?(session: AgentReadSession): string | Promise<string>;\n onEnter?(session: AgentActionSession, input?: unknown): void | Promise<void>;\n onExit?(session: AgentActionSession, nextMode: HarnessModeSummary): void | Promise<void>;\n}\n\nexport type HarnessModeClass<TMode extends HarnessMode = HarnessMode> = abstract new (...args: any[]) => TMode;\nexport type HarnessModeSelector<TMode extends HarnessMode = HarnessMode> = TMode | HarnessModeClass<TMode>;\nexport type AgentModeDefinition = HarnessMode;\n","import type { AgentActionSession } from \"./sessions.js\";\nimport type { HarnessEvent, HarnessEventClass } from \"./events.js\";\nimport { constructTypeOf } from \"./naming.js\";\n\nexport interface HarnessHookSummary {\n type: string;\n label: string;\n eventType: string;\n eventClassId: string;\n}\n\nexport abstract class HarnessHook<TEvent extends HarnessEvent = HarnessEvent> {\n protected declare readonly __harnessHookBrand: true;\n\n label?: string;\n readonly eventClass?: HarnessEventClass<any, TEvent>;\n\n static for<TPayload, TEvent extends HarnessEvent<TPayload>>(\n eventClass: HarnessEventClass<TPayload, TEvent>,\n ): abstract new () => HarnessHook<TEvent> {\n abstract class BoundHarnessHook extends HarnessHook<TEvent> {\n override readonly eventClass: HarnessEventClass<any, TEvent> = eventClass;\n }\n return BoundHarnessHook;\n }\n\n get type(): string {\n return constructTypeOf(this);\n }\n\n abstract onActive(session: AgentActionSession, event: TEvent): void | Promise<void>;\n}\n\nexport type HarnessHookEventClass<TEvent extends HarnessEvent = HarnessEvent> = abstract new () => HarnessHook<TEvent>;\n"],"mappings":"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","names":["RoleTargets","NativeRoles","ContextScopes","ContextConsume"]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-OBKS4AJR.js";
4
4
  import {
5
5
  HarnessEvent
6
- } from "./chunk-4A2P4QU5.js";
6
+ } from "./chunk-B4Q6CPYO.js";
7
7
 
8
8
  // src/runtime/events.ts
9
9
  var RunStartEvent = class extends HarnessEvent {
@@ -204,4 +204,4 @@ export {
204
204
  TranscriptCursorChangedEvent,
205
205
  runtimeEventClasses
206
206
  };
207
- //# sourceMappingURL=chunk-4SYLFKIX.js.map
207
+ //# sourceMappingURL=chunk-JIJHGB6H.js.map
@@ -0,0 +1,284 @@
1
+ // src/runtime/storage.ts
2
+ function nowIso() {
3
+ return (/* @__PURE__ */ new Date()).toISOString();
4
+ }
5
+ function cloneJSON(value) {
6
+ return JSON.parse(JSON.stringify(value));
7
+ }
8
+ function encodeSessionCursor(summary) {
9
+ return Buffer.from(JSON.stringify([summary.lastActiveAt, summary.sessionId]), "utf8").toString("base64url");
10
+ }
11
+ function decodeSessionCursor(cursor) {
12
+ if (!cursor) return void 0;
13
+ try {
14
+ const parsed = JSON.parse(Buffer.from(cursor, "base64url").toString("utf8"));
15
+ if (!Array.isArray(parsed) || typeof parsed[0] !== "string" || typeof parsed[1] !== "string") return void 0;
16
+ return [parsed[0], parsed[1]];
17
+ } catch {
18
+ return void 0;
19
+ }
20
+ }
21
+ function sortSessionSummaries(summaries) {
22
+ return [...summaries].sort((a, b) => {
23
+ const byLastActive = b.lastActiveAt.localeCompare(a.lastActiveAt);
24
+ return byLastActive || a.sessionId.localeCompare(b.sessionId);
25
+ });
26
+ }
27
+ function paginateSessionSummaries(summaries, query) {
28
+ const limit = Math.max(1, Math.min(query?.limit ?? 50, 100));
29
+ const cursor = decodeSessionCursor(query?.cursor);
30
+ const filtered = sortSessionSummaries(summaries).filter((summary) => !query?.agentKey || summary.agentKey === query.agentKey).filter((summary) => {
31
+ if (!cursor) return true;
32
+ const [lastActiveAt, sessionId] = cursor;
33
+ return summary.lastActiveAt < lastActiveAt || summary.lastActiveAt === lastActiveAt && summary.sessionId > sessionId;
34
+ });
35
+ const items = filtered.slice(0, limit);
36
+ const nextCursor = filtered.length > limit && items.length > 0 ? encodeSessionCursor(items[items.length - 1]) : void 0;
37
+ return { items: items.map((item) => cloneJSON(item)), nextCursor };
38
+ }
39
+ var HarnessRunStorage = class {
40
+ label;
41
+ };
42
+ var HarnessSessionStorage = class {
43
+ label;
44
+ };
45
+ var HarnessRunStore = class {
46
+ outputDir;
47
+ runDir;
48
+ };
49
+ var NoopRunStorage = class extends HarnessRunStorage {
50
+ id = "noop";
51
+ label = "Noop";
52
+ openRun(input) {
53
+ return new NoopRunStore(input.runId);
54
+ }
55
+ };
56
+ var NoopRunStore = class extends HarnessRunStore {
57
+ constructor(runId) {
58
+ super();
59
+ this.runId = runId;
60
+ }
61
+ runId;
62
+ outputDir = void 0;
63
+ runDir = void 0;
64
+ init() {
65
+ }
66
+ recordEvent(_event) {
67
+ }
68
+ loadEvents() {
69
+ return [];
70
+ }
71
+ saveTranscript(_messages) {
72
+ }
73
+ loadTranscript() {
74
+ return [];
75
+ }
76
+ saveMetrics(_metrics) {
77
+ }
78
+ saveSnapshot(_snapshot) {
79
+ }
80
+ loadSnapshots() {
81
+ return [];
82
+ }
83
+ deleteSnapshot(_id) {
84
+ }
85
+ saveCursors(_cursors) {
86
+ }
87
+ loadCursors() {
88
+ return void 0;
89
+ }
90
+ saveContextSnapshot(_snapshot) {
91
+ }
92
+ loadContextSnapshots() {
93
+ return [];
94
+ }
95
+ };
96
+ var MemoryRunStorage = class extends HarnessRunStorage {
97
+ id = "memory";
98
+ label = "Memory";
99
+ runs = /* @__PURE__ */ new Map();
100
+ openRun(input) {
101
+ let state = this.runs.get(input.runId);
102
+ if (!state) {
103
+ state = {
104
+ events: [],
105
+ transcript: [],
106
+ snapshots: /* @__PURE__ */ new Map(),
107
+ contextSnapshots: /* @__PURE__ */ new Map()
108
+ };
109
+ this.runs.set(input.runId, state);
110
+ }
111
+ return new MemoryRunStore(input.runId, state);
112
+ }
113
+ };
114
+ var MemorySessionStorage = class extends HarnessSessionStorage {
115
+ id = "memory-session";
116
+ label = "Memory Session";
117
+ sessions = /* @__PURE__ */ new Map();
118
+ runStates = /* @__PURE__ */ new Map();
119
+ createSession(input) {
120
+ const existing = this.sessions.get(input.sessionId)?.summary;
121
+ if (existing) return cloneJSON(existing);
122
+ const createdAt = input.createdAt ?? nowIso();
123
+ const summary = {
124
+ sessionId: input.sessionId,
125
+ agentKey: input.agentKey,
126
+ createdAt,
127
+ lastActiveAt: input.lastActiveAt ?? createdAt,
128
+ mode: input.mode,
129
+ latestRunId: input.latestRunId,
130
+ metadata: input.metadata ? cloneJSON(input.metadata) : void 0
131
+ };
132
+ this.sessions.set(summary.sessionId, { summary, runs: [] });
133
+ return cloneJSON(summary);
134
+ }
135
+ getSession(sessionId) {
136
+ const summary = this.sessions.get(sessionId)?.summary;
137
+ return summary ? cloneJSON(summary) : void 0;
138
+ }
139
+ listSessions(query) {
140
+ return paginateSessionSummaries([...this.sessions.values()].map((entry) => entry.summary), query);
141
+ }
142
+ touchSession(input) {
143
+ const entry = this.sessions.get(input.sessionId);
144
+ if (!entry) return;
145
+ entry.summary = {
146
+ ...entry.summary,
147
+ lastActiveAt: input.lastActiveAt ?? nowIso(),
148
+ mode: input.mode ?? entry.summary.mode,
149
+ latestRunId: input.latestRunId ?? entry.summary.latestRunId,
150
+ metadata: input.metadata ? cloneJSON(input.metadata) : entry.summary.metadata
151
+ };
152
+ }
153
+ deleteSession(sessionId) {
154
+ const entry = this.sessions.get(sessionId);
155
+ if (!entry) return false;
156
+ this.sessions.delete(sessionId);
157
+ for (const run of entry.runs) this.runStates.delete(run.runId);
158
+ return true;
159
+ }
160
+ createRun(input) {
161
+ const entry = this.sessions.get(input.sessionId);
162
+ if (!entry) throw new Error(`Harness session '${input.sessionId}' was not found.`);
163
+ const existing = entry.runs.find((run2) => run2.runId === input.runId);
164
+ if (existing) return cloneJSON(existing);
165
+ const latestRun = entry.summary.latestRunId;
166
+ const previousState = latestRun ? this.runStates.get(latestRun) : void 0;
167
+ const state = previousState ? cloneRunState(previousState) : createMemoryRunState();
168
+ this.runStates.set(input.runId, state);
169
+ const run = {
170
+ runId: input.runId,
171
+ sessionId: input.sessionId,
172
+ agentKey: input.agentKey,
173
+ createdAt: input.createdAt ?? nowIso(),
174
+ mode: input.mode,
175
+ outputDir: input.outputDir,
176
+ metadata: input.metadata ? cloneJSON(input.metadata) : void 0
177
+ };
178
+ entry.runs.push(run);
179
+ entry.summary = {
180
+ ...entry.summary,
181
+ latestRunId: run.runId,
182
+ lastActiveAt: run.createdAt,
183
+ mode: run.mode
184
+ };
185
+ return cloneJSON(run);
186
+ }
187
+ getLatestRun(sessionId) {
188
+ const entry = this.sessions.get(sessionId);
189
+ const latestRunId = entry?.summary.latestRunId;
190
+ if (!entry || !latestRunId) return void 0;
191
+ const run = entry.runs.find((candidate) => candidate.runId === latestRunId);
192
+ return run ? cloneJSON(run) : void 0;
193
+ }
194
+ listRuns(sessionId) {
195
+ return (this.sessions.get(sessionId)?.runs ?? []).map((run) => cloneJSON(run));
196
+ }
197
+ openRun(input) {
198
+ let state = this.runStates.get(input.runId);
199
+ if (!state) {
200
+ state = createMemoryRunState();
201
+ this.runStates.set(input.runId, state);
202
+ }
203
+ return new MemoryRunStore(input.runId, state);
204
+ }
205
+ };
206
+ function createMemoryRunState() {
207
+ return {
208
+ events: [],
209
+ transcript: [],
210
+ snapshots: /* @__PURE__ */ new Map(),
211
+ contextSnapshots: /* @__PURE__ */ new Map()
212
+ };
213
+ }
214
+ function cloneRunState(state) {
215
+ return {
216
+ events: cloneJSON(state.events),
217
+ transcript: cloneJSON(state.transcript),
218
+ metrics: state.metrics ? cloneJSON(state.metrics) : void 0,
219
+ snapshots: new Map([...state.snapshots.entries()].map(([id, snapshot]) => [id, cloneJSON(snapshot)])),
220
+ cursors: state.cursors ? cloneJSON(state.cursors) : void 0,
221
+ contextSnapshots: new Map([...state.contextSnapshots.entries()].map(([id, snapshot]) => [id, cloneJSON(snapshot)]))
222
+ };
223
+ }
224
+ var MemoryRunStore = class extends HarnessRunStore {
225
+ constructor(runId, state) {
226
+ super();
227
+ this.runId = runId;
228
+ this.state = state;
229
+ }
230
+ runId;
231
+ state;
232
+ outputDir = void 0;
233
+ runDir = void 0;
234
+ init() {
235
+ }
236
+ recordEvent(event) {
237
+ this.state.events.push(cloneJSON(event));
238
+ }
239
+ loadEvents() {
240
+ return cloneJSON(this.state.events);
241
+ }
242
+ saveTranscript(messages) {
243
+ this.state.transcript = cloneJSON(messages);
244
+ }
245
+ loadTranscript() {
246
+ return cloneJSON(this.state.transcript);
247
+ }
248
+ saveMetrics(metrics) {
249
+ this.state.metrics = cloneJSON(metrics);
250
+ }
251
+ saveSnapshot(snapshot) {
252
+ this.state.snapshots.set(snapshot.id, cloneJSON(snapshot));
253
+ }
254
+ loadSnapshots() {
255
+ return [...this.state.snapshots.values()].map((snapshot) => cloneJSON(snapshot)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
256
+ }
257
+ deleteSnapshot(id) {
258
+ this.state.snapshots.delete(id);
259
+ }
260
+ saveCursors(cursors) {
261
+ this.state.cursors = cloneJSON(cursors);
262
+ }
263
+ loadCursors() {
264
+ return this.state.cursors ? cloneJSON(this.state.cursors) : void 0;
265
+ }
266
+ saveContextSnapshot(snapshot) {
267
+ this.state.contextSnapshots.set(snapshot.id, cloneJSON(snapshot));
268
+ }
269
+ loadContextSnapshots() {
270
+ return [...this.state.contextSnapshots.values()].map((snapshot) => cloneJSON(snapshot)).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
271
+ }
272
+ };
273
+
274
+ export {
275
+ HarnessRunStorage,
276
+ HarnessSessionStorage,
277
+ HarnessRunStore,
278
+ NoopRunStorage,
279
+ NoopRunStore,
280
+ MemoryRunStorage,
281
+ MemorySessionStorage,
282
+ MemoryRunStore
283
+ };
284
+ //# sourceMappingURL=chunk-ONYDIU4X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/storage.ts"],"sourcesContent":["import type {\n AgentMessage,\n ContextSnapshot,\n EventCursor,\n HarnessEventRecord,\n HarnessSnapshot,\n RunMetrics,\n TranscriptBranch,\n TranscriptCursor,\n} from \"./types.js\";\n\nexport interface RunCursorState {\n transcriptCursor: TranscriptCursor;\n eventCursor: EventCursor;\n branches?: TranscriptBranch[];\n}\n\nexport interface OpenRunStoreInput {\n runId: string;\n sessionId: string;\n agentKey: string;\n outputDir?: string;\n}\n\nexport interface HarnessSessionSummary {\n sessionId: string;\n agentKey: string;\n createdAt: string;\n lastActiveAt: string;\n mode: string;\n latestRunId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SessionListQuery {\n agentKey?: string;\n active?: boolean;\n limit?: number;\n cursor?: string;\n}\n\nexport interface SessionListResult {\n items: HarnessSessionSummary[];\n nextCursor?: string;\n}\n\nexport interface StoredRunSummary {\n runId: string;\n sessionId: string;\n agentKey: string;\n createdAt: string;\n mode: string;\n outputDir?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateStoredSessionInput {\n sessionId: string;\n agentKey: string;\n createdAt?: string;\n lastActiveAt?: string;\n mode: string;\n latestRunId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TouchStoredSessionInput {\n sessionId: string;\n lastActiveAt?: string;\n mode?: string;\n latestRunId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateStoredRunInput {\n runId: string;\n sessionId: string;\n agentKey: string;\n createdAt?: string;\n mode: string;\n outputDir?: string;\n metadata?: Record<string, unknown>;\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction cloneJSON<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction encodeSessionCursor(summary: HarnessSessionSummary): string {\n return Buffer.from(JSON.stringify([summary.lastActiveAt, summary.sessionId]), \"utf8\").toString(\"base64url\");\n}\n\nfunction decodeSessionCursor(cursor: string | undefined): [string, string] | undefined {\n if (!cursor) return undefined;\n try {\n const parsed = JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf8\")) as unknown;\n if (!Array.isArray(parsed) || typeof parsed[0] !== \"string\" || typeof parsed[1] !== \"string\") return undefined;\n return [parsed[0], parsed[1]];\n } catch {\n return undefined;\n }\n}\n\nfunction sortSessionSummaries(summaries: HarnessSessionSummary[]): HarnessSessionSummary[] {\n return [...summaries].sort((a, b) => {\n const byLastActive = b.lastActiveAt.localeCompare(a.lastActiveAt);\n return byLastActive || a.sessionId.localeCompare(b.sessionId);\n });\n}\n\nfunction paginateSessionSummaries(\n summaries: HarnessSessionSummary[],\n query: SessionListQuery | undefined,\n): SessionListResult {\n const limit = Math.max(1, Math.min(query?.limit ?? 50, 100));\n const cursor = decodeSessionCursor(query?.cursor);\n const filtered = sortSessionSummaries(summaries)\n .filter((summary) => !query?.agentKey || summary.agentKey === query.agentKey)\n .filter((summary) => {\n if (!cursor) return true;\n const [lastActiveAt, sessionId] = cursor;\n return summary.lastActiveAt < lastActiveAt\n || (summary.lastActiveAt === lastActiveAt && summary.sessionId > sessionId);\n });\n const items = filtered.slice(0, limit);\n const nextCursor = filtered.length > limit && items.length > 0\n ? encodeSessionCursor(items[items.length - 1]!)\n : undefined;\n return { items: items.map((item) => cloneJSON(item)), nextCursor };\n}\n\nexport abstract class HarnessRunStorage {\n abstract readonly id: string;\n label?: string;\n\n abstract openRun(input: OpenRunStoreInput): Promise<HarnessRunStore> | HarnessRunStore;\n}\n\nexport abstract class HarnessSessionStorage {\n abstract readonly id: string;\n label?: string;\n\n init?(): Promise<void> | void;\n abstract createSession(input: CreateStoredSessionInput): Promise<HarnessSessionSummary> | HarnessSessionSummary;\n abstract getSession(sessionId: string): Promise<HarnessSessionSummary | undefined> | HarnessSessionSummary | undefined;\n abstract listSessions(query?: SessionListQuery): Promise<SessionListResult> | SessionListResult;\n abstract touchSession(input: TouchStoredSessionInput): Promise<void> | void;\n abstract deleteSession(sessionId: string): Promise<boolean> | boolean;\n abstract createRun(input: CreateStoredRunInput): Promise<StoredRunSummary> | StoredRunSummary;\n abstract getLatestRun(sessionId: string): Promise<StoredRunSummary | undefined> | StoredRunSummary | undefined;\n abstract listRuns(sessionId: string): Promise<StoredRunSummary[]> | StoredRunSummary[];\n abstract openRun(input: OpenRunStoreInput): Promise<HarnessRunStore> | HarnessRunStore;\n}\n\nexport abstract class HarnessRunStore {\n abstract readonly runId: string;\n readonly outputDir?: string;\n readonly runDir?: string;\n\n abstract init(): Promise<void> | void;\n abstract recordEvent(event: HarnessEventRecord): Promise<void> | void;\n abstract loadEvents(): Promise<HarnessEventRecord[]> | HarnessEventRecord[];\n abstract saveTranscript(messages: AgentMessage[]): Promise<void> | void;\n abstract loadTranscript(): Promise<AgentMessage[]> | AgentMessage[];\n abstract saveMetrics(metrics: RunMetrics): Promise<void> | void;\n abstract saveSnapshot(snapshot: HarnessSnapshot): Promise<void> | void;\n abstract loadSnapshots(): Promise<HarnessSnapshot[]> | HarnessSnapshot[];\n abstract deleteSnapshot(id: string): Promise<void> | void;\n abstract saveCursors(cursors: RunCursorState): Promise<void> | void;\n abstract loadCursors(): Promise<RunCursorState | undefined> | RunCursorState | undefined;\n abstract saveContextSnapshot(snapshot: ContextSnapshot): Promise<void> | void;\n abstract loadContextSnapshots(): Promise<ContextSnapshot[]> | ContextSnapshot[];\n\n close?(): Promise<void>;\n}\n\nexport class NoopRunStorage extends HarnessRunStorage {\n readonly id = \"noop\";\n label = \"Noop\";\n\n openRun(input: OpenRunStoreInput): HarnessRunStore {\n return new NoopRunStore(input.runId);\n }\n}\n\nexport class NoopRunStore extends HarnessRunStore {\n readonly outputDir = undefined;\n readonly runDir = undefined;\n\n constructor(readonly runId: string) {\n super();\n }\n\n init(): void {}\n recordEvent(_event: HarnessEventRecord): void {}\n loadEvents(): HarnessEventRecord[] { return []; }\n saveTranscript(_messages: AgentMessage[]): void {}\n loadTranscript(): AgentMessage[] { return []; }\n saveMetrics(_metrics: RunMetrics): void {}\n saveSnapshot(_snapshot: HarnessSnapshot): void {}\n loadSnapshots(): HarnessSnapshot[] { return []; }\n deleteSnapshot(_id: string): void {}\n saveCursors(_cursors: RunCursorState): void {}\n loadCursors(): RunCursorState | undefined { return undefined; }\n saveContextSnapshot(_snapshot: ContextSnapshot): void {}\n loadContextSnapshots(): ContextSnapshot[] { return []; }\n}\n\ninterface MemoryRunState {\n events: HarnessEventRecord[];\n transcript: AgentMessage[];\n metrics?: RunMetrics;\n snapshots: Map<string, HarnessSnapshot>;\n cursors?: RunCursorState;\n contextSnapshots: Map<string, ContextSnapshot>;\n}\n\nexport class MemoryRunStorage extends HarnessRunStorage {\n readonly id = \"memory\";\n label = \"Memory\";\n private readonly runs = new Map<string, MemoryRunState>();\n\n openRun(input: OpenRunStoreInput): HarnessRunStore {\n let state = this.runs.get(input.runId);\n if (!state) {\n state = {\n events: [],\n transcript: [],\n snapshots: new Map(),\n contextSnapshots: new Map(),\n };\n this.runs.set(input.runId, state);\n }\n return new MemoryRunStore(input.runId, state);\n }\n}\n\ninterface MemoryStoredSession {\n summary: HarnessSessionSummary;\n runs: StoredRunSummary[];\n}\n\nexport class MemorySessionStorage extends HarnessSessionStorage {\n readonly id = \"memory-session\";\n label = \"Memory Session\";\n private readonly sessions = new Map<string, MemoryStoredSession>();\n private readonly runStates = new Map<string, MemoryRunState>();\n\n createSession(input: CreateStoredSessionInput): HarnessSessionSummary {\n const existing = this.sessions.get(input.sessionId)?.summary;\n if (existing) return cloneJSON(existing);\n const createdAt = input.createdAt ?? nowIso();\n const summary: HarnessSessionSummary = {\n sessionId: input.sessionId,\n agentKey: input.agentKey,\n createdAt,\n lastActiveAt: input.lastActiveAt ?? createdAt,\n mode: input.mode,\n latestRunId: input.latestRunId,\n metadata: input.metadata ? cloneJSON(input.metadata) : undefined,\n };\n this.sessions.set(summary.sessionId, { summary, runs: [] });\n return cloneJSON(summary);\n }\n\n getSession(sessionId: string): HarnessSessionSummary | undefined {\n const summary = this.sessions.get(sessionId)?.summary;\n return summary ? cloneJSON(summary) : undefined;\n }\n\n listSessions(query?: SessionListQuery): SessionListResult {\n return paginateSessionSummaries([...this.sessions.values()].map((entry) => entry.summary), query);\n }\n\n touchSession(input: TouchStoredSessionInput): void {\n const entry = this.sessions.get(input.sessionId);\n if (!entry) return;\n entry.summary = {\n ...entry.summary,\n lastActiveAt: input.lastActiveAt ?? nowIso(),\n mode: input.mode ?? entry.summary.mode,\n latestRunId: input.latestRunId ?? entry.summary.latestRunId,\n metadata: input.metadata ? cloneJSON(input.metadata) : entry.summary.metadata,\n };\n }\n\n deleteSession(sessionId: string): boolean {\n const entry = this.sessions.get(sessionId);\n if (!entry) return false;\n this.sessions.delete(sessionId);\n for (const run of entry.runs) this.runStates.delete(run.runId);\n return true;\n }\n\n createRun(input: CreateStoredRunInput): StoredRunSummary {\n const entry = this.sessions.get(input.sessionId);\n if (!entry) throw new Error(`Harness session '${input.sessionId}' was not found.`);\n const existing = entry.runs.find((run) => run.runId === input.runId);\n if (existing) return cloneJSON(existing);\n const latestRun = entry.summary.latestRunId;\n const previousState = latestRun ? this.runStates.get(latestRun) : undefined;\n const state = previousState ? cloneRunState(previousState) : createMemoryRunState();\n this.runStates.set(input.runId, state);\n const run: StoredRunSummary = {\n runId: input.runId,\n sessionId: input.sessionId,\n agentKey: input.agentKey,\n createdAt: input.createdAt ?? nowIso(),\n mode: input.mode,\n outputDir: input.outputDir,\n metadata: input.metadata ? cloneJSON(input.metadata) : undefined,\n };\n entry.runs.push(run);\n entry.summary = {\n ...entry.summary,\n latestRunId: run.runId,\n lastActiveAt: run.createdAt,\n mode: run.mode,\n };\n return cloneJSON(run);\n }\n\n getLatestRun(sessionId: string): StoredRunSummary | undefined {\n const entry = this.sessions.get(sessionId);\n const latestRunId = entry?.summary.latestRunId;\n if (!entry || !latestRunId) return undefined;\n const run = entry.runs.find((candidate) => candidate.runId === latestRunId);\n return run ? cloneJSON(run) : undefined;\n }\n\n listRuns(sessionId: string): StoredRunSummary[] {\n return (this.sessions.get(sessionId)?.runs ?? []).map((run) => cloneJSON(run));\n }\n\n openRun(input: OpenRunStoreInput): HarnessRunStore {\n let state = this.runStates.get(input.runId);\n if (!state) {\n state = createMemoryRunState();\n this.runStates.set(input.runId, state);\n }\n return new MemoryRunStore(input.runId, state);\n }\n}\n\nfunction createMemoryRunState(): MemoryRunState {\n return {\n events: [],\n transcript: [],\n snapshots: new Map(),\n contextSnapshots: new Map(),\n };\n}\n\nfunction cloneRunState(state: MemoryRunState): MemoryRunState {\n return {\n events: cloneJSON(state.events),\n transcript: cloneJSON(state.transcript),\n metrics: state.metrics ? cloneJSON(state.metrics) : undefined,\n snapshots: new Map([...state.snapshots.entries()].map(([id, snapshot]) => [id, cloneJSON(snapshot)])),\n cursors: state.cursors ? cloneJSON(state.cursors) : undefined,\n contextSnapshots: new Map([...state.contextSnapshots.entries()].map(([id, snapshot]) => [id, cloneJSON(snapshot)])),\n };\n}\n\nexport class MemoryRunStore extends HarnessRunStore {\n readonly outputDir = undefined;\n readonly runDir = undefined;\n\n constructor(\n readonly runId: string,\n private readonly state: MemoryRunState,\n ) {\n super();\n }\n\n init(): void {}\n recordEvent(event: HarnessEventRecord): void { this.state.events.push(cloneJSON(event)); }\n loadEvents(): HarnessEventRecord[] { return cloneJSON(this.state.events); }\n saveTranscript(messages: AgentMessage[]): void { this.state.transcript = cloneJSON(messages); }\n loadTranscript(): AgentMessage[] { return cloneJSON(this.state.transcript); }\n saveMetrics(metrics: RunMetrics): void { this.state.metrics = cloneJSON(metrics); }\n saveSnapshot(snapshot: HarnessSnapshot): void { this.state.snapshots.set(snapshot.id, cloneJSON(snapshot)); }\n loadSnapshots(): HarnessSnapshot[] {\n return [...this.state.snapshots.values()]\n .map((snapshot) => cloneJSON(snapshot))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n }\n deleteSnapshot(id: string): void { this.state.snapshots.delete(id); }\n saveCursors(cursors: RunCursorState): void { this.state.cursors = cloneJSON(cursors); }\n loadCursors(): RunCursorState | undefined { return this.state.cursors ? cloneJSON(this.state.cursors) : undefined; }\n saveContextSnapshot(snapshot: ContextSnapshot): void { this.state.contextSnapshots.set(snapshot.id, cloneJSON(snapshot)); }\n loadContextSnapshots(): ContextSnapshot[] {\n return [...this.state.contextSnapshots.values()]\n .map((snapshot) => cloneJSON(snapshot))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n }\n}\n"],"mappings":"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","names":["run"]}