@poncho-ai/harness 0.40.1 → 0.42.0

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @poncho-ai/harness@0.40.1 build /home/runner/work/poncho-ai/poncho-ai/packages/harness
2
+ > @poncho-ai/harness@0.42.0 build /home/runner/work/poncho-ai/poncho-ai/packages/harness
3
3
  > node scripts/embed-docs.js && tsup src/index.ts --format esm --dts
4
4
 
5
5
  [embed-docs] Generated poncho-docs.ts with 4 topics
@@ -8,9 +8,9 @@
8
8
  CLI tsup v8.5.1
9
9
  CLI Target: es2022
10
10
  ESM Build start
11
- ESM dist/index.js 489.88 KB
11
+ ESM dist/index.js 504.78 KB
12
12
  ESM dist/isolate-VY35DGLM.js 49.43 KB
13
- ESM ⚡️ Build success in 205ms
13
+ ESM ⚡️ Build success in 228ms
14
14
  DTS Build start
15
- DTS ⚡️ Build success in 7664ms
16
- DTS dist/index.d.ts 75.12 KB
15
+ DTS ⚡️ Build success in 7856ms
16
+ DTS dist/index.d.ts 79.11 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,142 @@
1
1
  # @poncho-ai/harness
2
2
 
3
+ ## 0.42.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`39793b0`](https://github.com/cesr/poncho-ai/commit/39793b0ab11ed26f140af6fc9c0cd3e1b1c83fec) Thanks [@cesr](https://github.com/cesr)! - harness: extract `runConversationTurn` helper; refactor CLI to use it
8
+
9
+ Lifts the inline turn lifecycle from the CLI's
10
+ `POST /api/conversations/:id/messages` handler (~280 lines of orchestration)
11
+ into a new public helper at `@poncho-ai/harness`.
12
+
13
+ The helper handles the full conversation lifecycle for a primary chat
14
+ turn: load the conversation with archive, resolve canonical history,
15
+ upload files via the harness's upload store, build stable user/assistant
16
+ ids, persist the user message immediately, drive `executeConversationTurn`,
17
+ periodically persist the in-flight assistant draft on `step:completed`
18
+ and `tool:approval:required`, persist on `tool:approval:checkpoint` and
19
+ `run:completed` continuation, rebuild history on `compaction:completed`,
20
+ apply turn metadata on success, and persist partial state on
21
+ cancel/error.
22
+
23
+ Caller responsibilities (auth, active-run dedup, streaming, continuation
24
+ HTTP self-fetch, title inference) stay outside the helper — passed in
25
+ via opts or handled around the call. `opts.onEvent` is invoked for every
26
+ `AgentEvent` for downstream forwarding (SSE, WebSocket, telemetry, etc.).
27
+
28
+ The CLI's handler now delegates to `runConversationTurn` (drops from
29
+ ~430 to ~150 lines). Consumers like PonchOS can call the same helper
30
+ to ship the _exact_ same conversation lifecycle without duplicating
31
+ the orchestration.
32
+
33
+ Public API additions:
34
+ - `runConversationTurn(opts): Promise<RunConversationTurnResult>`
35
+ - `RunConversationTurnOpts`
36
+ - `RunConversationTurnResult`
37
+
38
+ No behavior changes. The helper is a verbatim extraction of the CLI's
39
+ prior inline implementation.
40
+
41
+ ### Patch Changes
42
+
43
+ - [`111d24e`](https://github.com/cesr/poncho-ai/commit/111d24efaab054ef7543c396085f8f4d41e7976a) Thanks [@cesr](https://github.com/cesr)! - cli: include VFS skills in the chat input slash command menu
44
+
45
+ The `/api/slash-commands` endpoint was returning only repo-loaded skills,
46
+ so tenant-authored skills stored in the VFS (`/skills/<name>/SKILL.md`)
47
+ never appeared in the `/` autocomplete bar even though the agent could
48
+ already see and run them at conversation time.
49
+
50
+ The endpoint now resolves skills per-tenant via a new
51
+ `harness.listSkillsForTenant(tenantId)` and applies the same repo-wins
52
+ collision semantics used elsewhere in the harness.
53
+
54
+ ## 0.41.0
55
+
56
+ ### Minor Changes
57
+
58
+ - [#110](https://github.com/cesr/poncho-ai/pull/110) [`7d57a88`](https://github.com/cesr/poncho-ai/commit/7d57a88e55a49ec04de3dbd415b2440bb727e31f) Thanks [@cesr](https://github.com/cesr)! - harness: allow programmatic agent + storage injection (no AGENT.md required)
59
+
60
+ `HarnessOptions` gains two optional fields that let callers construct a
61
+ `Harness` without an `AGENT.md` on disk and without the
62
+ `ensureAgentIdentity` filesystem dance:
63
+ - `agentDefinition?: string | ParsedAgent` — raw markdown or a pre-parsed
64
+ agent. When provided, `initialize()` skips the `AGENT.md` read.
65
+ - `storageEngine?: StorageEngine` — pre-constructed engine; required
66
+ whenever `agentDefinition` is provided. The engine's `agentId` (now a
67
+ public readonly field on the `StorageEngine` interface) becomes the
68
+ source of truth for partitioning, and is mirrored onto
69
+ `parsedAgent.frontmatter.id` so existing downstream readers continue
70
+ to resolve correctly.
71
+
72
+ When neither field is provided, behaviour is unchanged: the harness
73
+ reads `AGENT.md` from `workingDir`, calls `ensureAgentIdentity`, and
74
+ constructs the `StorageEngine` internally.
75
+
76
+ `refreshAgentIfChanged()` short-circuits when an agent definition was
77
+ injected — callers who update an agent re-instantiate the harness
78
+ rather than relying on disk file watching.
79
+
80
+ This is the first of a small set of changes that lets `@poncho-ai/harness`
81
+ be embedded as a library by consumer SaaS apps where each user has
82
+ their own per-tenant agent state in a database, no filesystem layout.
83
+
84
+ - [#111](https://github.com/cesr/poncho-ai/pull/111) [`ac18616`](https://github.com/cesr/poncho-ai/commit/ac18616b864189c91d0957c72c537933497505f4) Thanks [@cesr](https://github.com/cesr)! - harness: allow programmatic `PonchoConfig` injection
85
+
86
+ `HarnessOptions` gains an optional `config?: PonchoConfig` field. When
87
+ provided, `initialize()` skips `loadPonchoConfig` (which imports
88
+ `poncho.config.js` from `workingDir`) and uses the supplied object
89
+ directly. Downstream resolvers (`resolveMemoryConfig`,
90
+ `resolveStateConfig`, etc.) run as today, so any validation/normalization
91
+ they perform applies to injected configs identically.
92
+
93
+ Behaviour is unchanged when the field is absent: the disk loader runs
94
+ as before.
95
+
96
+ This is part of a small series of changes that enables
97
+ `@poncho-ai/harness` to be embedded as a library by a consumer SaaS
98
+ where each user's agent configuration comes from a database row, not a
99
+ `poncho.config.js` on disk.
100
+
101
+ - [#112](https://github.com/cesr/poncho-ai/pull/112) [`c22416b`](https://github.com/cesr/poncho-ai/commit/c22416b3d4c4557277aeabf53e70877be6436e85) Thanks [@cesr](https://github.com/cesr)! - harness: cache MCP clients per `(serverName, tenantId)` instead of rebuilding per call
102
+
103
+ When a tenant resolves a different bearer token than the host's
104
+ `process.env` default for an MCP server, the per-call handler used to
105
+ construct a brand-new `StreamableHttpMcpRpcClient` on every tool call.
106
+ For builders this rarely triggered. For consumer/SaaS deployments where
107
+ **every** call resolves a different per-user token, every tool call
108
+ forced a fresh `initialize` round-trip — no session reuse, high
109
+ latency, and a behaviour the recently-added 404 session-retry can't
110
+ help with because there was nothing to retry.
111
+
112
+ `LocalMcpBridge` now keeps a `Map<key, { client, token, lastUsed }>`
113
+ keyed by `(serverName, tenantId)`. Lookups reuse the cached client when
114
+ the token is unchanged and the entry is within the configured idle TTL
115
+ (default 15 minutes). On token rotation or TTL expiry the entry is
116
+ evicted lazily and rebuilt. `stopLocalServers()` closes all cached
117
+ tenant clients alongside the server-default ones.
118
+
119
+ The TTL is configurable via a constructor option (`tenantClientTtlMs`)
120
+ for tests and tuning.
121
+
122
+ ### Patch Changes
123
+
124
+ - [#109](https://github.com/cesr/poncho-ai/pull/109) [`4b5d974`](https://github.com/cesr/poncho-ai/commit/4b5d974345733ac9e68f36201dff7e7d8a8f0327) Thanks [@cesr](https://github.com/cesr)! - harness: re-initialize MCP session on 404 instead of staying wedged
125
+
126
+ Streamable-HTTP MCP clients with session state (e.g. Arcade's gateway
127
+ for Gmail / Google Calendar) issue an `Mcp-Session-Id` on initialize
128
+ and expire it after some idle window. The bridge cached `sessionId`
129
+ and `initialized` in process memory and never reset them, so once the
130
+ server returned 404 for a stale session every subsequent tool call
131
+ also 404'd until the host process restarted. Long-lived deployments
132
+ (e.g. Railway) hit this; serverless platforms masked it because each
133
+ invocation re-initialized.
134
+
135
+ The client now treats `404` with a stored `sessionId` as a session
136
+ expiry signal: it clears the session, re-runs `initialize`, and
137
+ retries the request once. A 404 from initialize itself (no session
138
+ yet) is still treated as a hard endpoint failure with no retry.
139
+
3
140
  ## 0.40.1
4
141
 
5
142
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { LanguageModel } from 'ai';
2
2
  import * as _poncho_ai_sdk from '@poncho-ai/sdk';
3
- import { Message, ToolContext, ToolDefinition, JsonSchema, RunResult, AgentFailure, RunInput, AgentEvent } from '@poncho-ai/sdk';
3
+ import { Message, ToolContext, ToolDefinition, JsonSchema, RunResult, AgentFailure, RunInput, AgentEvent, FileInput } from '@poncho-ai/sdk';
4
4
  export { ToolDefinition, defineTool } from '@poncho-ai/sdk';
5
5
  import { z } from 'zod';
6
6
  import { IFileSystem, BufferEncoding, FsStat, FileContent, MkdirOptions, RmOptions, CpOptions, Bash } from 'just-bash';
@@ -370,12 +370,26 @@ declare class LocalMcpBridge {
370
370
  private readonly unavailableServers;
371
371
  private readonly authFailedServers;
372
372
  private envResolver?;
373
+ /**
374
+ * Per-tenant MCP client cache. For consumer/SaaS deployments where every
375
+ * call resolves a different bearer token, building a fresh
376
+ * `StreamableHttpMcpRpcClient` per call would force a fresh `initialize`
377
+ * round-trip every time. We keep one client per `(serverName, tenantId)`
378
+ * with TTL-based idle eviction; on token rotation we evict the entry
379
+ * lazily and rebuild.
380
+ */
381
+ private readonly tenantClients;
382
+ /** Test/observability hook: bumped every time a new tenant client is constructed. */
383
+ tenantClientConstructions: number;
384
+ private readonly tenantClientTtlMs;
373
385
  /**
374
386
  * Set a resolver for per-tenant env vars (e.g. MCP auth tokens).
375
387
  * Called by the harness after creating the secrets store.
376
388
  */
377
389
  setEnvResolver(resolver: (tenantId: string | undefined, envName: string) => Promise<string | undefined>): void;
378
- constructor(config: McpConfig | undefined);
390
+ constructor(config: McpConfig | undefined, options?: {
391
+ tenantClientTtlMs?: number;
392
+ });
379
393
  private getServerName;
380
394
  private log;
381
395
  /** Set of servers where discovery was deferred (no default token, has env resolver). */
@@ -389,6 +403,7 @@ declare class LocalMcpBridge {
389
403
  private tryDeferredDiscovery;
390
404
  startLocalServers(): Promise<void>;
391
405
  stopLocalServers(): Promise<void>;
406
+ private getOrCreateTenantClient;
392
407
  listServers(): RemoteMcpServerConfig[];
393
408
  listRemoteServers(): RemoteMcpServerConfig[];
394
409
  checkRemoteConnectivity(): Promise<Array<{
@@ -806,6 +821,8 @@ interface VfsDirEntry {
806
821
  type: "file" | "directory" | "symlink";
807
822
  }
808
823
  interface StorageEngine {
824
+ /** Partition key: every read/write is scoped to this agent id. */
825
+ readonly agentId: string;
809
826
  /** Run migrations and prepare the storage backend. */
810
827
  initialize(): Promise<void>;
811
828
  /** Gracefully release resources. */
@@ -1007,6 +1024,27 @@ interface HarnessOptions {
1007
1024
  toolDefinitions?: ToolDefinition[];
1008
1025
  modelProvider?: ModelProviderFactory;
1009
1026
  uploadStore?: UploadStore;
1027
+ /**
1028
+ * Inject the agent definition directly instead of reading AGENT.md from
1029
+ * `workingDir`. Pass raw markdown (string) or a pre-parsed `ParsedAgent`.
1030
+ * When provided, `storageEngine` is also required — the engine's
1031
+ * `agentId` becomes the source of truth for partitioning, and the
1032
+ * filesystem identity dance (`ensureAgentIdentity`) is skipped.
1033
+ */
1034
+ agentDefinition?: string | ParsedAgent;
1035
+ /**
1036
+ * Pre-constructed storage engine. When provided, the harness will not
1037
+ * create one internally. The engine's `agentId` is used wherever the
1038
+ * harness today reads `parsedAgent.frontmatter.id`.
1039
+ */
1040
+ storageEngine?: StorageEngine;
1041
+ /**
1042
+ * Inject a `PonchoConfig` object directly instead of importing
1043
+ * `poncho.config.js` from `workingDir`. When provided, the disk-based
1044
+ * loader is skipped. Downstream resolvers (`resolveMemoryConfig`,
1045
+ * `resolveStateConfig`, etc.) run as today regardless of source.
1046
+ */
1047
+ config?: PonchoConfig;
1010
1048
  }
1011
1049
  interface HarnessRunOutput {
1012
1050
  runId: string;
@@ -1037,6 +1075,7 @@ declare class AgentHarness {
1037
1075
  reminderStore?: ReminderStore;
1038
1076
  secretsStore?: SecretsStore;
1039
1077
  private loadedConfig?;
1078
+ private readonly injectedConfig?;
1040
1079
  private loadedSkills;
1041
1080
  private skillFingerprint;
1042
1081
  private lastSkillRefreshAt;
@@ -1051,6 +1090,8 @@ declare class AgentHarness {
1051
1090
  private _browserMod?;
1052
1091
  private parsedAgent?;
1053
1092
  private agentFileFingerprint;
1093
+ private injectedAgentDefinition?;
1094
+ private injectedStorageEngine;
1054
1095
  private mcpBridge?;
1055
1096
  private subagentManager?;
1056
1097
  private readonly archivedToolResultsByConversation;
@@ -1145,6 +1186,10 @@ declare class AgentHarness {
1145
1186
  name: string;
1146
1187
  description: string;
1147
1188
  }>;
1189
+ listSkillsForTenant(tenantId: string | undefined | null): Promise<Array<{
1190
+ name: string;
1191
+ description: string;
1192
+ }>>;
1148
1193
  /**
1149
1194
  * Wraps the run() generator with an OTel root span (invoke_agent) so all
1150
1195
  * child spans (LLM calls via AI SDK, tool execution) group under one trace.
@@ -1279,7 +1324,7 @@ declare class TelemetryEmitter {
1279
1324
  }
1280
1325
 
1281
1326
  declare class InMemoryEngine implements StorageEngine {
1282
- private readonly agentId;
1327
+ readonly agentId: string;
1283
1328
  private convs;
1284
1329
  private mem;
1285
1330
  private todoData;
@@ -1394,7 +1439,7 @@ declare class ConversationEgressMeter {
1394
1439
  }
1395
1440
  declare abstract class SqlStorageEngine implements StorageEngine {
1396
1441
  protected readonly dialect: Dialect;
1397
- protected readonly agentId: string;
1442
+ readonly agentId: string;
1398
1443
  protected abstract readonly executor: QueryExecutor;
1399
1444
  protected readonly egressMeter: ConversationEgressMeter;
1400
1445
  constructor(dialect: Dialect, agentId: string);
@@ -1838,4 +1883,46 @@ declare class AgentOrchestrator {
1838
1883
  recoverStaleSubagents(): Promise<void>;
1839
1884
  }
1840
1885
 
1841
- export { type ActiveConversationRun, type ActiveSubagentRun, type AgentFrontmatter, AgentHarness, type AgentIdentity, type AgentLimitsConfig, type AgentModelConfig, AgentOrchestrator, type ApprovalEventItem, type ArchivedToolResult$1 as ArchivedToolResult, type BashConfig, BashEnvironmentManager, type BashExecutionLimits, type BuiltInToolToggles, CALLBACK_LOCK_STALE_MS, type CompactMessagesOptions, type CompactResult, type CompactionConfig, type ContinuationHooks, type Conversation, type ConversationCreateInit, type ConversationState, type ConversationStatusSnapshot, type ConversationStore, type ConversationSummary, type CreateSkillToolsOptions, type CronJobConfig, type EventSink, type ExecuteTurnResult, type HarnessOptions, type HarnessRunOutput, type HistorySource, InMemoryConversationStore, InMemoryEngine, InMemoryStateStore, type IsolateBinding, type IsolateConfig, LocalMcpBridge, LocalUploadStore, MAX_CONCURRENT_SUBAGENTS, MAX_CONTINUATION_COUNT, MAX_SUBAGENT_CALLBACK_COUNT, MAX_SUBAGENT_NESTING, type MainMemory, type McpConfig, type MemoryConfig, type MemoryStore, type MessagingChannelConfig, type ModelProviderFactory, type NetworkConfig, OPENAI_CODEX_CLIENT_ID, type OpenAICodexAuthConfig, type OpenAICodexDeviceAuthRequest, type OpenAICodexSession, type OrchestratorHooks, type OrchestratorOptions, type OtlpConfig, type OtlpOption, PONCHO_UPLOAD_SCHEME, type ParsedAgent, type PendingSubagentApproval, type PendingSubagentResult, type PendingToolCall, type PonchoConfig, PonchoFsAdapter, PostgresEngine, type ProviderConfig, type Recurrence, type RecurrenceType, type Reminder, type ReminderCreateInput, type ReminderStatus, type ReminderStore, type RemoteMcpServerConfig, type RunOutcome, type RunRequest, type RuntimeRenderContext, S3UploadStore, STALE_SUBAGENT_THRESHOLD_MS, STORAGE_SCHEMA_VERSION, type SecretsStore, type SkillContextEntry, type SkillMetadata, type SkillSource, SqliteEngine, type StateConfig, type StateProviderName, type StateStore, type StorageConfig, type StorageEngine, type StorageFactoryOptions, type StorageProvider, type StoredApproval, type SubagentManager, type SubagentResult, type SubagentSpawnResult, type SubagentSummary, TOOL_RESULT_ARCHIVE_PARAM, type TelemetryConfig, TelemetryEmitter, type TenantTokenPayload, type ToolAccess, type ToolCall, ToolDispatcher, type ToolExecutionResult, type TurnDraftState, type TurnResultMetadata, type TurnSection, type UploadStore, type UploadsConfig, VFS_SCHEME, VercelBlobUploadStore, type VfsDirEntry, type VfsStat, applyTurnMetadata, buildAgentDirectoryName, buildApprovalCheckpoints, buildAssistantMetadata, buildSkillContextWindow, buildToolCompletedText, cloneSections, compactMessages, completeOpenAICodexDeviceAuth, computeNextOccurrence, createBashTool, createConversationStore, createConversationStoreFromEngine, createDefaultTools, createDeleteDirectoryTool, createDeleteTool, createEditTool, createMemoryStore, createMemoryStoreFromEngine, createMemoryTools, createModelProvider, createReminderStore, createReminderStoreFromEngine, createReminderTools, createSearchTools, createSecretsStore, createSkillTools, createStateStore, createStorageEngine, createSubagentTools, createTodoStoreFromEngine, createTurnDraftState, createUploadStore, createWriteTool, deleteOpenAICodexSession, deriveUploadKey, ensureAgentIdentity, estimateTokens, estimateTotalTokens, executeConversationTurn, findSafeSplitPoint, flushTurnDraft, generateAgentId, getAgentStoreDirectory, getModelContextWindow, getOpenAICodexAccessToken, getOpenAICodexAuthFilePath, getOpenAICodexRequiredScopes, getPonchoStoreRoot, isMessageArray, jsonSchemaToZod, loadCanonicalHistory, loadPonchoConfig, loadRunHistory, loadSkillContext, loadSkillInstructions, loadSkillMetadata, loadVfsSkillMetadata, mergeSkills, normalizeApprovalCheckpoint, normalizeOtlp, normalizeScriptPolicyPath, parseAgentFile, parseAgentMarkdown, parseSkillFrontmatter, ponchoDocsTool, readOpenAICodexSession, readSkillResource, recordStandardTurnEvent, renderAgentPrompt, resolveAgentIdentity, resolveCompactionConfig, resolveEnv, resolveMemoryConfig, resolveRunRequest, resolveSkillDirs, resolveStateConfig, slugifyStorageComponent, startOpenAICodexDeviceAuth, verifyTenantToken, withToolResultArchiveParam, writeOpenAICodexSession };
1886
+ interface RunConversationTurnOpts {
1887
+ /** Initialised harness instance. */
1888
+ harness: AgentHarness;
1889
+ /** Conversation store backing the turn (typically `engine.conversations` from a StorageEngine). */
1890
+ conversationStore: ConversationStore;
1891
+ conversationId: string;
1892
+ /** The user's new message text. Required (use `""` if you only want to attach files). */
1893
+ task: string;
1894
+ /**
1895
+ * Optional file attachments (FileInput.data is base64 / data URI / https URL).
1896
+ * Files are uploaded via `harness.uploadStore` first so the persisted user
1897
+ * message references stable URLs instead of fat base64 blobs.
1898
+ */
1899
+ files?: FileInput[];
1900
+ /**
1901
+ * Extra parameters merged into runInput.parameters. Use this for recall
1902
+ * corpus, archive lookup keys, messaging metadata, etc. Do NOT include
1903
+ * `__activeConversationId`, `__ownerId`, or the tool-result-archive — the
1904
+ * helper sets those itself.
1905
+ */
1906
+ parameters?: Record<string, unknown>;
1907
+ abortSignal?: AbortSignal;
1908
+ tenantId?: string | null;
1909
+ /** Per-event hook — called for every AgentEvent yielded by the run, in order. */
1910
+ onEvent?: (event: AgentEvent) => void | Promise<void>;
1911
+ }
1912
+ interface RunConversationTurnResult {
1913
+ /** runId of the most recent run started during this turn. */
1914
+ latestRunId: string;
1915
+ /** True if the run was cancelled (via abortSignal or run:cancelled event). */
1916
+ cancelled: boolean;
1917
+ /** True if the run errored. The error has been emitted via onEvent as run:error. */
1918
+ errored: boolean;
1919
+ /** True if the run requested a continuation. Caller is responsible for triggering the continuation. */
1920
+ continuation: boolean;
1921
+ /** True if the run paused at a tool-approval checkpoint. */
1922
+ checkpointed: boolean;
1923
+ contextTokens: number;
1924
+ contextWindow: number;
1925
+ }
1926
+ declare const runConversationTurn: (opts: RunConversationTurnOpts) => Promise<RunConversationTurnResult>;
1927
+
1928
+ export { type ActiveConversationRun, type ActiveSubagentRun, type AgentFrontmatter, AgentHarness, type AgentIdentity, type AgentLimitsConfig, type AgentModelConfig, AgentOrchestrator, type ApprovalEventItem, type ArchivedToolResult$1 as ArchivedToolResult, type BashConfig, BashEnvironmentManager, type BashExecutionLimits, type BuiltInToolToggles, CALLBACK_LOCK_STALE_MS, type CompactMessagesOptions, type CompactResult, type CompactionConfig, type ContinuationHooks, type Conversation, type ConversationCreateInit, type ConversationState, type ConversationStatusSnapshot, type ConversationStore, type ConversationSummary, type CreateSkillToolsOptions, type CronJobConfig, type EventSink, type ExecuteTurnResult, type HarnessOptions, type HarnessRunOutput, type HistorySource, InMemoryConversationStore, InMemoryEngine, InMemoryStateStore, type IsolateBinding, type IsolateConfig, LocalMcpBridge, LocalUploadStore, MAX_CONCURRENT_SUBAGENTS, MAX_CONTINUATION_COUNT, MAX_SUBAGENT_CALLBACK_COUNT, MAX_SUBAGENT_NESTING, type MainMemory, type McpConfig, type MemoryConfig, type MemoryStore, type MessagingChannelConfig, type ModelProviderFactory, type NetworkConfig, OPENAI_CODEX_CLIENT_ID, type OpenAICodexAuthConfig, type OpenAICodexDeviceAuthRequest, type OpenAICodexSession, type OrchestratorHooks, type OrchestratorOptions, type OtlpConfig, type OtlpOption, PONCHO_UPLOAD_SCHEME, type ParsedAgent, type PendingSubagentApproval, type PendingSubagentResult, type PendingToolCall, type PonchoConfig, PonchoFsAdapter, PostgresEngine, type ProviderConfig, type Recurrence, type RecurrenceType, type Reminder, type ReminderCreateInput, type ReminderStatus, type ReminderStore, type RemoteMcpServerConfig, type RunConversationTurnOpts, type RunConversationTurnResult, type RunOutcome, type RunRequest, type RuntimeRenderContext, S3UploadStore, STALE_SUBAGENT_THRESHOLD_MS, STORAGE_SCHEMA_VERSION, type SecretsStore, type SkillContextEntry, type SkillMetadata, type SkillSource, SqliteEngine, type StateConfig, type StateProviderName, type StateStore, type StorageConfig, type StorageEngine, type StorageFactoryOptions, type StorageProvider, type StoredApproval, type SubagentManager, type SubagentResult, type SubagentSpawnResult, type SubagentSummary, TOOL_RESULT_ARCHIVE_PARAM, type TelemetryConfig, TelemetryEmitter, type TenantTokenPayload, type ToolAccess, type ToolCall, ToolDispatcher, type ToolExecutionResult, type TurnDraftState, type TurnResultMetadata, type TurnSection, type UploadStore, type UploadsConfig, VFS_SCHEME, VercelBlobUploadStore, type VfsDirEntry, type VfsStat, applyTurnMetadata, buildAgentDirectoryName, buildApprovalCheckpoints, buildAssistantMetadata, buildSkillContextWindow, buildToolCompletedText, cloneSections, compactMessages, completeOpenAICodexDeviceAuth, computeNextOccurrence, createBashTool, createConversationStore, createConversationStoreFromEngine, createDefaultTools, createDeleteDirectoryTool, createDeleteTool, createEditTool, createMemoryStore, createMemoryStoreFromEngine, createMemoryTools, createModelProvider, createReminderStore, createReminderStoreFromEngine, createReminderTools, createSearchTools, createSecretsStore, createSkillTools, createStateStore, createStorageEngine, createSubagentTools, createTodoStoreFromEngine, createTurnDraftState, createUploadStore, createWriteTool, deleteOpenAICodexSession, deriveUploadKey, ensureAgentIdentity, estimateTokens, estimateTotalTokens, executeConversationTurn, findSafeSplitPoint, flushTurnDraft, generateAgentId, getAgentStoreDirectory, getModelContextWindow, getOpenAICodexAccessToken, getOpenAICodexAuthFilePath, getOpenAICodexRequiredScopes, getPonchoStoreRoot, isMessageArray, jsonSchemaToZod, loadCanonicalHistory, loadPonchoConfig, loadRunHistory, loadSkillContext, loadSkillInstructions, loadSkillMetadata, loadVfsSkillMetadata, mergeSkills, normalizeApprovalCheckpoint, normalizeOtlp, normalizeScriptPolicyPath, parseAgentFile, parseAgentMarkdown, parseSkillFrontmatter, ponchoDocsTool, readOpenAICodexSession, readSkillResource, recordStandardTurnEvent, renderAgentPrompt, resolveAgentIdentity, resolveCompactionConfig, resolveEnv, resolveMemoryConfig, resolveRunRequest, resolveSkillDirs, resolveStateConfig, runConversationTurn, slugifyStorageComponent, startOpenAICodexDeviceAuth, verifyTenantToken, withToolResultArchiveParam, writeOpenAICodexSession };