elepha 0.1.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.
- package/LICENSE.md +375 -0
- package/README.md +135 -0
- package/bin/elepha.js +2 -0
- package/dist/adapters/base.js +600 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code.js +260 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.js +499 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/discriminators.js +39 -0
- package/dist/adapters/discriminators.js.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/internal-command.js +3 -0
- package/dist/adapters/internal-command.js.map +1 -0
- package/dist/cli/backup-wizard.js +97 -0
- package/dist/cli/backup-wizard.js.map +1 -0
- package/dist/cli/capture-service.js +80 -0
- package/dist/cli/capture-service.js.map +1 -0
- package/dist/cli/commands/backfills.js +336 -0
- package/dist/cli/commands/backfills.js.map +1 -0
- package/dist/cli/commands/backup.js +234 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/config.js +66 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/consent.js +237 -0
- package/dist/cli/commands/consent.js.map +1 -0
- package/dist/cli/commands/daemon-control.js +76 -0
- package/dist/cli/commands/daemon-control.js.map +1 -0
- package/dist/cli/commands/doctor.js +31 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/hook.js +24 -0
- package/dist/cli/commands/hook.js.map +1 -0
- package/dist/cli/commands/import.js +611 -0
- package/dist/cli/commands/import.js.map +1 -0
- package/dist/cli/commands/init.js +19 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/inspect.js +54 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/install.js +49 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/internal.js +16 -0
- package/dist/cli/commands/internal.js.map +1 -0
- package/dist/cli/commands/mcp.js +12 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/projects.js +26 -0
- package/dist/cli/commands/projects.js.map +1 -0
- package/dist/cli/commands/purge.js +216 -0
- package/dist/cli/commands/purge.js.map +1 -0
- package/dist/cli/commands/reingest.js +80 -0
- package/dist/cli/commands/reingest.js.map +1 -0
- package/dist/cli/commands/rekey.js +58 -0
- package/dist/cli/commands/rekey.js.map +1 -0
- package/dist/cli/commands/restore.js +376 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/rollup.js +130 -0
- package/dist/cli/commands/rollup.js.map +1 -0
- package/dist/cli/commands/sanitize.js +72 -0
- package/dist/cli/commands/sanitize.js.map +1 -0
- package/dist/cli/commands/segment.js +153 -0
- package/dist/cli/commands/segment.js.map +1 -0
- package/dist/cli/commands/self-update.js +26 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/start.js +53 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.js +42 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/status.js +73 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/uninstall.js +23 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/config-wizard.js +104 -0
- package/dist/cli/config-wizard.js.map +1 -0
- package/dist/cli/destructive-op.js +32 -0
- package/dist/cli/destructive-op.js.map +1 -0
- package/dist/cli/import-wizard.js +89 -0
- package/dist/cli/import-wizard.js.map +1 -0
- package/dist/cli/index.js +74 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init-wizard.js +80 -0
- package/dist/cli/init-wizard.js.map +1 -0
- package/dist/cli/init.js +159 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/launcher-probe.js +71 -0
- package/dist/cli/launcher-probe.js.map +1 -0
- package/dist/cli/project-path.js +16 -0
- package/dist/cli/project-path.js.map +1 -0
- package/dist/cli/purge-wizard.js +200 -0
- package/dist/cli/purge-wizard.js.map +1 -0
- package/dist/cli/restore-wizard.js +101 -0
- package/dist/cli/restore-wizard.js.map +1 -0
- package/dist/cli/shared.js +128 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/status.js +22 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/wordmark.js +15 -0
- package/dist/cli/wordmark.js.map +1 -0
- package/dist/config/constants.js +115 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/env.js +168 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/memory-config.js +63 -0
- package/dist/config/memory-config.js.map +1 -0
- package/dist/config/paths.js +343 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/settings.js +132 -0
- package/dist/config/settings.js.map +1 -0
- package/dist/config/version.js +12 -0
- package/dist/config/version.js.map +1 -0
- package/dist/daemon/failure-window.js +38 -0
- package/dist/daemon/failure-window.js.map +1 -0
- package/dist/daemon/heartbeat.js +40 -0
- package/dist/daemon/heartbeat.js.map +1 -0
- package/dist/daemon/index.js +873 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/log-rotation.js +27 -0
- package/dist/daemon/log-rotation.js.map +1 -0
- package/dist/daemon/readability-guard.js +89 -0
- package/dist/daemon/readability-guard.js.map +1 -0
- package/dist/daemon/rollup-service.js +239 -0
- package/dist/daemon/rollup-service.js.map +1 -0
- package/dist/daemon/update-check.js +87 -0
- package/dist/daemon/update-check.js.map +1 -0
- package/dist/daemon/work-queue.js +28 -0
- package/dist/daemon/work-queue.js.map +1 -0
- package/dist/discovery/session-projects.js +242 -0
- package/dist/discovery/session-projects.js.map +1 -0
- package/dist/hooks/codex-trust.js +80 -0
- package/dist/hooks/codex-trust.js.map +1 -0
- package/dist/hooks/common.js +81 -0
- package/dist/hooks/common.js.map +1 -0
- package/dist/hooks/hook-log.js +38 -0
- package/dist/hooks/hook-log.js.map +1 -0
- package/dist/hooks/installer.js +200 -0
- package/dist/hooks/installer.js.map +1 -0
- package/dist/hooks/session-start.js +321 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/hooks/user-prompt-submit.js +248 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/install/binary.js +72 -0
- package/dist/install/binary.js.map +1 -0
- package/dist/install/config-file.js +119 -0
- package/dist/install/config-file.js.map +1 -0
- package/dist/install/daemon-health.js +48 -0
- package/dist/install/daemon-health.js.map +1 -0
- package/dist/install/daemon-service.js +309 -0
- package/dist/install/daemon-service.js.map +1 -0
- package/dist/install/doctor.js +180 -0
- package/dist/install/doctor.js.map +1 -0
- package/dist/install/health-checks.js +90 -0
- package/dist/install/health-checks.js.map +1 -0
- package/dist/install/installer.js +411 -0
- package/dist/install/installer.js.map +1 -0
- package/dist/install/launchd-backend.js +261 -0
- package/dist/install/launchd-backend.js.map +1 -0
- package/dist/install/launcher.js +224 -0
- package/dist/install/launcher.js.map +1 -0
- package/dist/install/markers.js +14 -0
- package/dist/install/markers.js.map +1 -0
- package/dist/install/platform.js +29 -0
- package/dist/install/platform.js.map +1 -0
- package/dist/install/present-tools.js +16 -0
- package/dist/install/present-tools.js.map +1 -0
- package/dist/install/self-update.js +120 -0
- package/dist/install/self-update.js.map +1 -0
- package/dist/install/service-backend.js +36 -0
- package/dist/install/service-backend.js.map +1 -0
- package/dist/install/service-manifest.js +36 -0
- package/dist/install/service-manifest.js.map +1 -0
- package/dist/install/status.js +58 -0
- package/dist/install/status.js.map +1 -0
- package/dist/install/systemd-backend.js +225 -0
- package/dist/install/systemd-backend.js.map +1 -0
- package/dist/markers.js +5 -0
- package/dist/markers.js.map +1 -0
- package/dist/mcp/installer.js +131 -0
- package/dist/mcp/installer.js.map +1 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-context.js +3 -0
- package/dist/mcp/tools/get-context.js.map +1 -0
- package/dist/mcp/tools/list-projects.js +3 -0
- package/dist/mcp/tools/list-projects.js.map +1 -0
- package/dist/mcp/tools/save-memory.js +3 -0
- package/dist/mcp/tools/save-memory.js.map +1 -0
- package/dist/mcp/tools.js +288 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/rendering/raw-turn-renderer.js +85 -0
- package/dist/rendering/raw-turn-renderer.js.map +1 -0
- package/dist/security/file-permissions.js +15 -0
- package/dist/security/file-permissions.js.map +1 -0
- package/dist/security/provider-transcript.js +74 -0
- package/dist/security/provider-transcript.js.map +1 -0
- package/dist/security/sanitize.js +210 -0
- package/dist/security/sanitize.js.map +1 -0
- package/dist/security/self-ingestion.js +47 -0
- package/dist/security/self-ingestion.js.map +1 -0
- package/dist/security/sentinel.js +19 -0
- package/dist/security/sentinel.js.map +1 -0
- package/dist/security/subprocess-allowlist.js +421 -0
- package/dist/security/subprocess-allowlist.js.map +1 -0
- package/dist/serving/instructions.js +33 -0
- package/dist/serving/instructions.js.map +1 -0
- package/dist/serving/lexical-recall.js +249 -0
- package/dist/serving/lexical-recall.js.map +1 -0
- package/dist/serving/session-reader.js +302 -0
- package/dist/serving/session-reader.js.map +1 -0
- package/dist/storage/backfill-runner.js +34 -0
- package/dist/storage/backfill-runner.js.map +1 -0
- package/dist/storage/backup.js +46 -0
- package/dist/storage/backup.js.map +1 -0
- package/dist/storage/candidate-validator.js +77 -0
- package/dist/storage/candidate-validator.js.map +1 -0
- package/dist/storage/consent-store.js +198 -0
- package/dist/storage/consent-store.js.map +1 -0
- package/dist/storage/custom-title-backfill.js +68 -0
- package/dist/storage/custom-title-backfill.js.map +1 -0
- package/dist/storage/db.js +312 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/external-agent-import-purge.js +182 -0
- package/dist/storage/external-agent-import-purge.js.map +1 -0
- package/dist/storage/first-prompt-search-backfill.js +76 -0
- package/dist/storage/first-prompt-search-backfill.js.map +1 -0
- package/dist/storage/first-prompt-search.js +7 -0
- package/dist/storage/first-prompt-search.js.map +1 -0
- package/dist/storage/injection-store.js +37 -0
- package/dist/storage/injection-store.js.map +1 -0
- package/dist/storage/memory-store.js +428 -0
- package/dist/storage/memory-store.js.map +1 -0
- package/dist/storage/project-resolver.js +294 -0
- package/dist/storage/project-resolver.js.map +1 -0
- package/dist/storage/project-store.js +104 -0
- package/dist/storage/project-store.js.map +1 -0
- package/dist/storage/rendered-chars-backfill.js +85 -0
- package/dist/storage/rendered-chars-backfill.js.map +1 -0
- package/dist/storage/resegmentation.js +582 -0
- package/dist/storage/resegmentation.js.map +1 -0
- package/dist/storage/rollup-store.js +246 -0
- package/dist/storage/rollup-store.js.map +1 -0
- package/dist/storage/root-commit-backfill.js +32 -0
- package/dist/storage/root-commit-backfill.js.map +1 -0
- package/dist/storage/sanitize-backfill.js +184 -0
- package/dist/storage/sanitize-backfill.js.map +1 -0
- package/dist/storage/segmentation.js +87 -0
- package/dist/storage/segmentation.js.map +1 -0
- package/dist/storage/session-fields-backfill.js +196 -0
- package/dist/storage/session-fields-backfill.js.map +1 -0
- package/dist/storage/session-read-model.js +130 -0
- package/dist/storage/session-read-model.js.map +1 -0
- package/dist/storage/session-store.js +200 -0
- package/dist/storage/session-store.js.map +1 -0
- package/dist/storage/session-title-backfill.js +75 -0
- package/dist/storage/session-title-backfill.js.map +1 -0
- package/dist/storage/session-title.js +71 -0
- package/dist/storage/session-title.js.map +1 -0
- package/dist/storage/shown-session-list-store.js +33 -0
- package/dist/storage/shown-session-list-store.js.map +1 -0
- package/dist/storage/stats.js +30 -0
- package/dist/storage/stats.js.map +1 -0
- package/dist/storage/turn-store.js +202 -0
- package/dist/storage/turn-store.js.map +1 -0
- package/dist/storage/ulid.js +17 -0
- package/dist/storage/ulid.js.map +1 -0
- package/dist/summarizer/anthropic-call.js +76 -0
- package/dist/summarizer/anthropic-call.js.map +1 -0
- package/dist/summarizer/call-log.js +120 -0
- package/dist/summarizer/call-log.js.map +1 -0
- package/dist/summarizer/haiku-provider.js +136 -0
- package/dist/summarizer/haiku-provider.js.map +1 -0
- package/dist/summarizer/pricing.js +8 -0
- package/dist/summarizer/pricing.js.map +1 -0
- package/dist/summarizer/prompt-cache.js +6 -0
- package/dist/summarizer/prompt-cache.js.map +1 -0
- package/dist/summarizer/prompt.js +47 -0
- package/dist/summarizer/prompt.js.map +1 -0
- package/dist/summarizer/provider-config.js +25 -0
- package/dist/summarizer/provider-config.js.map +1 -0
- package/dist/summarizer/rollup-prompt.js +225 -0
- package/dist/summarizer/rollup-prompt.js.map +1 -0
- package/dist/summarizer/rollup-provider.js +224 -0
- package/dist/summarizer/rollup-provider.js.map +1 -0
- package/dist/types/index.js +10 -0
- package/dist/types/index.js.map +1 -0
- package/dist/util/error.js +5 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/fs.js +97 -0
- package/dist/util/fs.js.map +1 -0
- package/dist/util/relative-time.js +12 -0
- package/dist/util/relative-time.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
// Adapter for ~/.codex/sessions/YYYY/MM/DD/rollout-*.jsonl[.zst] session files.
|
|
2
|
+
//
|
|
3
|
+
// Turn boundary has two observed forms: event_msg.payload.type "user_message"
|
|
4
|
+
// and a non-synthetic response_item message whose role is "user". A file uses
|
|
5
|
+
// one form consistently; the adapter identifies which before parsing so a
|
|
6
|
+
// rollout that contains both records does not create duplicate turns. Real
|
|
7
|
+
// Some primary rollouts omit the event form entirely, so the response item
|
|
8
|
+
// must remain a boundary on its own. Synthetic
|
|
9
|
+
// role:"user"/"developer" response_items remain excluded: in particular,
|
|
10
|
+
// <environment_context> is a resume marker and never turn content.
|
|
11
|
+
//
|
|
12
|
+
// File edits arrive as a response_item with payload.type "custom_tool_call"
|
|
13
|
+
// and payload.name "apply_patch" - the patch text is a RAW string under
|
|
14
|
+
// payload.input (real newlines, not JSON-encoded), not the OpenAI-style
|
|
15
|
+
// function_call/arguments envelope. Verified against 542 real apply_patch
|
|
16
|
+
// calls across CLI versions 0.136.0-0.147.0: the custom_tool_call envelope
|
|
17
|
+
// was 100% of them, 0 used function_call. An earlier version of this adapter
|
|
18
|
+
// assumed function_call/arguments without a real sample and missed every
|
|
19
|
+
// apply_patch call as a result - see test/fixtures/codex for the real
|
|
20
|
+
// samples that now guard against regressing this.
|
|
21
|
+
//
|
|
22
|
+
// function_call/function_call_output IS the real envelope for genuine
|
|
23
|
+
// OpenAI-style tool calls (MCP servers, read_file, exec_command, ...) -
|
|
24
|
+
// arguments there really is a JSON-encoded string.
|
|
25
|
+
//
|
|
26
|
+
// Every payload.type/top-level type this adapter treats as skip is listed
|
|
27
|
+
// explicitly below (KNOWN_*). Anything not in one of those sets triggers
|
|
28
|
+
// warnUnknownLine() instead of silently falling through - the exact failure
|
|
29
|
+
// mode that let the apply_patch envelope bug ship unnoticed.
|
|
30
|
+
import path from 'node:path';
|
|
31
|
+
import { codexSessionsRoot, isWithin, toPosix } from '../config/paths.js';
|
|
32
|
+
import { classifyEmptyJsonlSession, JsonlTurnAdapter, OversizedTranscriptRecordError, readBoundedLines, resolveAbsolute, safeDiscriminator, textValues, } from './base.js';
|
|
33
|
+
import { INTERNAL_COMMAND_NAME, INTERNAL_COMMAND_TAGS } from './internal-command.js';
|
|
34
|
+
const ROLLOUT_ID_RE = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.jsonl$/i;
|
|
35
|
+
const EXTERNAL_IMPORT_TURN_PREFIX = 'external-import-turn-';
|
|
36
|
+
// Top-level line types this adapter has observed and deliberately ignores
|
|
37
|
+
// (none carry turn content; session_meta/turn_context are mined for cwd only).
|
|
38
|
+
const KNOWN_TOP_LEVEL_SKIP = new Set(['session_meta', 'turn_context', 'world_state', 'compacted', 'inter_agent_communication_metadata']);
|
|
39
|
+
// event_msg.payload.type subtypes other than "user_message". agent_message is
|
|
40
|
+
// a higher-volume duplicate of the response_item assistant text we already
|
|
41
|
+
// use as the source of truth - intentionally not read here.
|
|
42
|
+
const KNOWN_EVENT_MSG_SKIP = new Set([
|
|
43
|
+
'token_count',
|
|
44
|
+
'agent_message',
|
|
45
|
+
'task_started',
|
|
46
|
+
'task_complete',
|
|
47
|
+
'thread_settings_applied',
|
|
48
|
+
'patch_apply_end',
|
|
49
|
+
'mcp_tool_call_end',
|
|
50
|
+
'web_search_end',
|
|
51
|
+
'item_completed',
|
|
52
|
+
'context_compacted',
|
|
53
|
+
'turn_aborted',
|
|
54
|
+
'sub_agent_activity',
|
|
55
|
+
'thread_rolled_back',
|
|
56
|
+
// TUI's short thinking header, not chain-of-thought or assistant output.
|
|
57
|
+
// Observed only in a prerelease build; deliberately exclude it.
|
|
58
|
+
'agent_reasoning',
|
|
59
|
+
]);
|
|
60
|
+
// response_item.payload.type subtypes other than "message", "custom_tool_call", and "function_call".
|
|
61
|
+
const KNOWN_RESPONSE_ITEM_SKIP = new Set([
|
|
62
|
+
'reasoning',
|
|
63
|
+
'custom_tool_call_output',
|
|
64
|
+
'function_call_output',
|
|
65
|
+
'web_search_call',
|
|
66
|
+
'tool_search_call',
|
|
67
|
+
'tool_search_output',
|
|
68
|
+
'agent_message', // rare (sub-agent) duplicate of the event_msg subtype of the same name - same "already have this via response_item role:assistant" rationale
|
|
69
|
+
]);
|
|
70
|
+
// Codex's apply_patch envelope, used both standalone and embedded in shell
|
|
71
|
+
// heredocs. A "*** Move to: X" line marks a rename: the file was touched at
|
|
72
|
+
// BOTH the old and new path - recording only the source path (or only the
|
|
73
|
+
// destination) isn't incomplete data, it's wrong data, since neither alone
|
|
74
|
+
// tells a reader where the file actually lives now.
|
|
75
|
+
const PATCH_FILE_RE = /\*\*\* (?:Update|Add|Delete) File: ([^\\\n"]+)/g;
|
|
76
|
+
const PATCH_MOVE_RE = /\*\*\* Move to: ([^\\\n"]+)/g;
|
|
77
|
+
function hasToolCall(payloadType) {
|
|
78
|
+
return (payloadType === 'function_call' ||
|
|
79
|
+
payloadType === 'custom_tool_call' ||
|
|
80
|
+
payloadType === 'web_search_call' ||
|
|
81
|
+
payloadType === 'tool_search_call' ||
|
|
82
|
+
payloadType === 'custom_tool_call_output' ||
|
|
83
|
+
payloadType === 'function_call_output' ||
|
|
84
|
+
payloadType === 'mcp_tool_call_end' ||
|
|
85
|
+
payloadType === 'web_search_end' ||
|
|
86
|
+
payloadType === 'tool_search_output');
|
|
87
|
+
}
|
|
88
|
+
function emptySessionSignals(line) {
|
|
89
|
+
const payload = line.payload;
|
|
90
|
+
const role = payload?.role;
|
|
91
|
+
const payloadType = payload?.type;
|
|
92
|
+
const isUser = role === 'user' || payloadType === 'user_message';
|
|
93
|
+
const values = textValues(payload?.content ?? payload?.message);
|
|
94
|
+
return {
|
|
95
|
+
userContentSeen: isUser,
|
|
96
|
+
internalCommandRollout: line.type === 'session_meta' && payload?.source?.subagent?.thread_spawn !== undefined,
|
|
97
|
+
internalCommand: isUser && values.some((value) => INTERNAL_COMMAND_NAME.test(value) && INTERNAL_COMMAND_TAGS.test(value)),
|
|
98
|
+
nonInternalUserContent: isUser && values.some((value) => value.trim() !== '' && !INTERNAL_COMMAND_TAGS.test(value)),
|
|
99
|
+
assistantContribution: role === 'assistant' || (line.type === 'event_msg' && payloadType === 'agent_message'),
|
|
100
|
+
abortedPrompt: payloadType === 'turn_aborted',
|
|
101
|
+
toolCall: hasToolCall(payloadType),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function extractPatchFilePaths(input, cwd) {
|
|
105
|
+
if (!input) {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
const paths = new Set();
|
|
109
|
+
for (const match of input.matchAll(PATCH_FILE_RE)) {
|
|
110
|
+
const raw = match[1]?.trim();
|
|
111
|
+
if (raw) {
|
|
112
|
+
paths.add(resolveAbsolute(raw, cwd ?? process.cwd()));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const match of input.matchAll(PATCH_MOVE_RE)) {
|
|
116
|
+
const raw = match[1]?.trim();
|
|
117
|
+
if (raw) {
|
|
118
|
+
paths.add(resolveAbsolute(raw, cwd ?? process.cwd()));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return [...paths];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* The `exec` custom tool carries a JavaScript PROGRAM, not a command string -
|
|
125
|
+
* it can batch N shell commands through Promise.all, and it can carry an
|
|
126
|
+
* apply_patch heredoc inline as a JS string literal
|
|
127
|
+
* (`const patch = "*** Begin Patch\n*** Update File: ..."`).
|
|
128
|
+
*
|
|
129
|
+
* Those embedded patches are real file writes in the identical envelope
|
|
130
|
+
* extractPatchFilePaths already parses; they were simply never fed to it,
|
|
131
|
+
* because extraction was gated on the tool NAME being "apply_patch". Measured
|
|
132
|
+
* against the real corpus: 434 of 3,870 exec/exec_command calls carry patch
|
|
133
|
+
* paths, 349 of them under name "exec" - i.e. previously dropped on the floor.
|
|
134
|
+
*
|
|
135
|
+
* Deliberately NOT attempted here: recovering paths from arbitrary shell
|
|
136
|
+
* argument text (sed/rg/npm targets). That is a further ~20% of calls but it
|
|
137
|
+
* is heuristic and produced false positives (glob artifacts) in measurement.
|
|
138
|
+
* Extraction stays deterministic.
|
|
139
|
+
*/
|
|
140
|
+
/** function_call.arguments is a JSON-encoded string; an embedded patch is escaped inside it. Falls back to the raw text if it isn't valid JSON. */
|
|
141
|
+
function decodeArguments(argumentsRaw) {
|
|
142
|
+
if (!argumentsRaw) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const parsed = JSON.parse(argumentsRaw);
|
|
147
|
+
return Object.values(parsed)
|
|
148
|
+
.filter((v) => typeof v === 'string')
|
|
149
|
+
.join('\n');
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return argumentsRaw;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function extractExecFilePaths(input, cwd) {
|
|
156
|
+
if (!input?.includes('*** ')) {
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
return extractPatchFilePaths(input, cwd);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* read_file is an MCP tool call carrying an explicit file_path argument - the
|
|
163
|
+
* Codex-side parity for Claude Code's Read. Low volume but deterministic (65
|
|
164
|
+
* calls in the local corpus; a 30-day slice happens to contain none, which is
|
|
165
|
+
* NOT evidence the envelope is gone - a dedicated fixture guards it).
|
|
166
|
+
*/
|
|
167
|
+
function extractReadFileePaths(name, argumentsRaw, cwd) {
|
|
168
|
+
if (name !== 'read_file' || !argumentsRaw) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const args = JSON.parse(argumentsRaw);
|
|
173
|
+
if (typeof args.file_path !== 'string' || args.file_path.length === 0) {
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
return [resolveAbsolute(args.file_path, args.projectPath ?? cwd ?? process.cwd())];
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
export class CodexAdapter extends JsonlTurnAdapter {
|
|
183
|
+
tool = 'codex';
|
|
184
|
+
watchGlobs = ['*/*/*/rollout-*.jsonl'];
|
|
185
|
+
userBoundaryByFile = new Map();
|
|
186
|
+
matches(filePath) {
|
|
187
|
+
return (isWithin(codexSessionsRoot(), filePath) &&
|
|
188
|
+
path.basename(filePath).startsWith('rollout-') &&
|
|
189
|
+
(toPosix(filePath).endsWith('.jsonl') || toPosix(filePath).endsWith('.jsonl.zst')));
|
|
190
|
+
}
|
|
191
|
+
nativeSessionId(filePath) {
|
|
192
|
+
const m = ROLLOUT_ID_RE.exec(path.basename(filePath));
|
|
193
|
+
return m ? m[1] : path.basename(filePath, '.jsonl');
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Codex has emitted both user-turn envelopes. When an event_msg is present
|
|
197
|
+
* before the response, it is the historical boundary; otherwise the
|
|
198
|
+
* role:user response_item is the complete record. Resolve that once per
|
|
199
|
+
* parse so a rollout containing the duplicate pair does not emit twice.
|
|
200
|
+
*/
|
|
201
|
+
async userBoundaryFor(filePath, options = {}) {
|
|
202
|
+
let sawUserResponse = false;
|
|
203
|
+
try {
|
|
204
|
+
for await (const { text } of readBoundedLines(filePath, { handle: options.handle })) {
|
|
205
|
+
if (options.signal?.aborted) {
|
|
206
|
+
return 'response_item';
|
|
207
|
+
}
|
|
208
|
+
let line;
|
|
209
|
+
try {
|
|
210
|
+
line = JSON.parse(text);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const payload = line.payload;
|
|
216
|
+
if (line.type === 'event_msg' && payload?.type === 'user_message') {
|
|
217
|
+
return 'event_msg';
|
|
218
|
+
}
|
|
219
|
+
if (line.type === 'response_item' &&
|
|
220
|
+
payload?.type === 'message' &&
|
|
221
|
+
payload.role === 'user' &&
|
|
222
|
+
!this.isResumeMarkerLine(line)) {
|
|
223
|
+
sawUserResponse = true;
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// A user prompt followed by the assistant without an
|
|
227
|
+
// event_msg is the response_item-only format. No later
|
|
228
|
+
// transcript line can turn that completed turn into the
|
|
229
|
+
// duplicate form.
|
|
230
|
+
if (sawUserResponse && line.type === 'response_item' && payload?.type === 'message' && payload.role === 'assistant') {
|
|
231
|
+
return 'response_item';
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (error instanceof OversizedTranscriptRecordError) {
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
// The daemon's readability guard owns a visible failure. The
|
|
240
|
+
// response envelope is the conservative fallback if a direct
|
|
241
|
+
// adapter caller races a disappearing file.
|
|
242
|
+
}
|
|
243
|
+
return 'response_item';
|
|
244
|
+
}
|
|
245
|
+
async *parseTurns(filePath, sinceCursor, options) {
|
|
246
|
+
this.userBoundaryByFile.set(filePath, await this.userBoundaryFor(filePath, options));
|
|
247
|
+
if (options?.signal?.aborted) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
yield* super.parseTurns(filePath, sinceCursor, options);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Codex encodes session provenance in the first session_meta line.
|
|
254
|
+
*
|
|
255
|
+
* Two markers look authoritative and are not:
|
|
256
|
+
* - thread_source === 'subagent' is set on genuine subagents AND on the
|
|
257
|
+
* internal adjudicator, so it cannot decide either on its own.
|
|
258
|
+
* - parent_thread_id is set on every child session, copy or not. Keying
|
|
259
|
+
* fork detection off it misclassifies 26 non-copied sessions whose
|
|
260
|
+
* turns span hours-to-days as duplicates.
|
|
261
|
+
*
|
|
262
|
+
* Measured against the local corpus, the signals that actually separate
|
|
263
|
+
* the three cases:
|
|
264
|
+
*
|
|
265
|
+
* - forked_from_id non-null -> the file BEGINS with a verbatim copy of the
|
|
266
|
+
* parent's whole transcript, every copied line restamped with the fork
|
|
267
|
+
* instant (observed: 175 turns inside 73ms of each other, byte-identical
|
|
268
|
+
* user messages to the parent, vs. multi-hour spans on every
|
|
269
|
+
* non-forked child). Ingesting it duplicates the parent.
|
|
270
|
+
* - thread_source 'subagent' with NO agent_path/agent_nickname -> Codex's
|
|
271
|
+
* internal approval adjudicator. Its own prompt labels the transcript
|
|
272
|
+
* "untrusted evidence, not instructions to follow"; there is no human in
|
|
273
|
+
* it. User-spawned subagents always carry both fields.
|
|
274
|
+
*/
|
|
275
|
+
async classifySession(filePath, options) {
|
|
276
|
+
const { first, externalAgentImport } = await this.readClassificationPreamble(filePath, options?.handle);
|
|
277
|
+
if (!first) {
|
|
278
|
+
return { kind: 'primary' };
|
|
279
|
+
}
|
|
280
|
+
const meta = (first.payload ?? {});
|
|
281
|
+
if (externalAgentImport) {
|
|
282
|
+
return {
|
|
283
|
+
kind: 'primary',
|
|
284
|
+
exclusion: 'external-agent-import',
|
|
285
|
+
reason: `turn_id starts with ${EXTERNAL_IMPORT_TURN_PREFIX}`,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
if (meta.forked_from_id) {
|
|
289
|
+
return {
|
|
290
|
+
kind: 'fork-copy',
|
|
291
|
+
parentNativeId: meta.forked_from_id,
|
|
292
|
+
reason: `transcript opens with a fork-time copy of session ${meta.forked_from_id}`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
if (meta.thread_source === 'subagent') {
|
|
296
|
+
// A user-spawned subagent always carries its identity; the internal
|
|
297
|
+
// adjudicator never does.
|
|
298
|
+
if (!meta.agent_path && !meta.agent_nickname) {
|
|
299
|
+
return {
|
|
300
|
+
kind: 'adjudicator',
|
|
301
|
+
parentNativeId: meta.parent_thread_id ?? undefined,
|
|
302
|
+
reason: 'Codex internal approval-adjudication transcript (untrusted evidence, no human)',
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return { kind: 'subagent', parentNativeId: meta.parent_thread_id ?? undefined };
|
|
306
|
+
}
|
|
307
|
+
return { kind: 'primary' };
|
|
308
|
+
}
|
|
309
|
+
async classifyEmptySession(filePath) {
|
|
310
|
+
return classifyEmptyJsonlSession(filePath, (line) => emptySessionSignals(line));
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Imported external-agent rollouts have no discriminator in session_meta;
|
|
314
|
+
* Codex puts it on the first task event instead. Read parsed fields from the
|
|
315
|
+
* JSONL preamble and stop at the first turn_id: matching text elsewhere in a
|
|
316
|
+
* prompt, tool payload, or instruction block must never exclude a session.
|
|
317
|
+
*/
|
|
318
|
+
async readClassificationPreamble(filePath, handle) {
|
|
319
|
+
let first;
|
|
320
|
+
try {
|
|
321
|
+
for await (const { text } of readBoundedLines(filePath, { handle })) {
|
|
322
|
+
let line;
|
|
323
|
+
try {
|
|
324
|
+
line = JSON.parse(text);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
first ??= line;
|
|
330
|
+
const turnId = line.type === 'event_msg' ? line.payload?.turn_id : undefined;
|
|
331
|
+
if (typeof turnId === 'string') {
|
|
332
|
+
return { first, externalAgentImport: turnId.startsWith(EXTERNAL_IMPORT_TURN_PREFIX) };
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
if (error instanceof OversizedTranscriptRecordError) {
|
|
338
|
+
throw error;
|
|
339
|
+
}
|
|
340
|
+
// The daemon's file-level readability guard owns the visible alert.
|
|
341
|
+
}
|
|
342
|
+
return { first, externalAgentImport: false };
|
|
343
|
+
}
|
|
344
|
+
cwdOf(line) {
|
|
345
|
+
const l = line;
|
|
346
|
+
if (l.type === 'session_meta' || l.type === 'turn_context') {
|
|
347
|
+
return typeof l.payload?.cwd === 'string' ? l.payload.cwd : undefined;
|
|
348
|
+
}
|
|
349
|
+
return undefined;
|
|
350
|
+
}
|
|
351
|
+
timestampOf(line) {
|
|
352
|
+
const l = line;
|
|
353
|
+
return typeof l.timestamp === 'string' ? l.timestamp : undefined;
|
|
354
|
+
}
|
|
355
|
+
surfaceOf(line) {
|
|
356
|
+
const l = line;
|
|
357
|
+
if (l.type !== 'session_meta') {
|
|
358
|
+
return undefined;
|
|
359
|
+
}
|
|
360
|
+
const meta = l.payload;
|
|
361
|
+
return typeof meta.originator === 'string' ? meta.originator : undefined;
|
|
362
|
+
}
|
|
363
|
+
branchOf(line) {
|
|
364
|
+
const l = line;
|
|
365
|
+
if (l.type !== 'session_meta') {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
const meta = l.payload;
|
|
369
|
+
return typeof meta.git?.branch === 'string' ? meta.git.branch : undefined;
|
|
370
|
+
}
|
|
371
|
+
isExternalFetchLine(line) {
|
|
372
|
+
const l = line;
|
|
373
|
+
return l.type === 'response_item' && l.payload?.type === 'web_search_call';
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* `<environment_context>` resume marker. A marker either starts
|
|
377
|
+
* a content item directly or is appended after a reloaded instruction block
|
|
378
|
+
* in that same item. Matching the complete closing tag avoids treating
|
|
379
|
+
* ordinary prose that merely mentions "environment_context" as a marker.
|
|
380
|
+
*/
|
|
381
|
+
isResumeMarkerLine(line) {
|
|
382
|
+
const l = line;
|
|
383
|
+
if (l.type !== 'response_item' || l.payload?.type !== 'message' || l.payload.role !== 'user') {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
return (l.payload.content ?? []).some((block) => {
|
|
387
|
+
const text = block.text?.trim();
|
|
388
|
+
return (text?.startsWith('<environment_context>') ||
|
|
389
|
+
(text?.endsWith('</environment_context>') === true && text.includes('\n<environment_context>')));
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
classify(line, filePath) {
|
|
393
|
+
const l = line;
|
|
394
|
+
const p = l.payload;
|
|
395
|
+
if (!p) {
|
|
396
|
+
return 'skip';
|
|
397
|
+
}
|
|
398
|
+
if (l.type === 'event_msg') {
|
|
399
|
+
if (p.type === 'user_message') {
|
|
400
|
+
return this.userBoundaryByFile.get(filePath) === 'event_msg' ? 'boundary' : 'skip';
|
|
401
|
+
}
|
|
402
|
+
if (!KNOWN_EVENT_MSG_SKIP.has(p.type)) {
|
|
403
|
+
this.warnUnknownLine(`CodexAdapter: unrecognized event_msg.payload.type "${safeDiscriminator(p.type)}" in ${filePath}`);
|
|
404
|
+
}
|
|
405
|
+
return 'skip';
|
|
406
|
+
}
|
|
407
|
+
if (l.type === 'response_item') {
|
|
408
|
+
if (p.type === 'message') {
|
|
409
|
+
if (p.role === 'assistant') {
|
|
410
|
+
return 'content';
|
|
411
|
+
}
|
|
412
|
+
// This is the portable user-turn record. The only role:user
|
|
413
|
+
// variant that may never open a turn is the synthetic resume
|
|
414
|
+
// marker; it is boundary metadata, not human input.
|
|
415
|
+
return p.role === 'user' && !this.isResumeMarkerLine(l) && this.userBoundaryByFile.get(filePath) === 'response_item'
|
|
416
|
+
? 'boundary'
|
|
417
|
+
: 'skip';
|
|
418
|
+
}
|
|
419
|
+
if (p.type === 'custom_tool_call' || p.type === 'function_call') {
|
|
420
|
+
return 'content';
|
|
421
|
+
}
|
|
422
|
+
if (!KNOWN_RESPONSE_ITEM_SKIP.has(p.type)) {
|
|
423
|
+
this.warnUnknownLine(`CodexAdapter: unrecognized response_item.payload.type "${safeDiscriminator(p.type)}" in ${filePath}`);
|
|
424
|
+
}
|
|
425
|
+
return 'skip';
|
|
426
|
+
}
|
|
427
|
+
if (!KNOWN_TOP_LEVEL_SKIP.has(l.type)) {
|
|
428
|
+
this.warnUnknownLine(`CodexAdapter: unrecognized top-level type "${safeDiscriminator(l.type)}" in ${filePath}`);
|
|
429
|
+
}
|
|
430
|
+
return 'skip';
|
|
431
|
+
}
|
|
432
|
+
observeToolCallState(state, line) {
|
|
433
|
+
const l = line;
|
|
434
|
+
const payload = l.payload;
|
|
435
|
+
if (l.type !== 'response_item' || typeof payload?.call_id !== 'string') {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (payload.type === 'function_call' || payload.type === 'custom_tool_call') {
|
|
439
|
+
state.openToolCallIds.add(payload.call_id);
|
|
440
|
+
}
|
|
441
|
+
else if (payload.type === 'function_call_output' || payload.type === 'custom_tool_call_output') {
|
|
442
|
+
state.openToolCallIds.delete(payload.call_id);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
fold(state, line) {
|
|
446
|
+
const l = line;
|
|
447
|
+
const p = l.payload;
|
|
448
|
+
if (!p) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
if (l.type === 'response_item' && p.type === 'message' && p.role === 'user') {
|
|
452
|
+
for (const block of p.content ?? []) {
|
|
453
|
+
if ((block.type === 'input_text' || block.type === 'text') && typeof block.text === 'string') {
|
|
454
|
+
state.userMessageParts.push(block.text);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
if (l.type === 'event_msg' && p.type === 'user_message') {
|
|
460
|
+
if (typeof p.message === 'string') {
|
|
461
|
+
state.userMessageParts.push(p.message);
|
|
462
|
+
}
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
if (l.type === 'response_item' && p.type === 'message' && p.role === 'assistant') {
|
|
466
|
+
for (const block of p.content ?? []) {
|
|
467
|
+
if ((block.type === 'output_text' || block.type === 'text') && typeof block.text === 'string') {
|
|
468
|
+
state.assistantTextParts.push(block.text);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (l.type === 'response_item' && p.type === 'custom_tool_call') {
|
|
474
|
+
// apply_patch: the standalone envelope. exec: a JS program that may
|
|
475
|
+
// embed the same patch format - both are real file writes.
|
|
476
|
+
const filePaths = p.name === 'apply_patch'
|
|
477
|
+
? extractPatchFilePaths(p.input, state.projectPath)
|
|
478
|
+
: extractExecFilePaths(p.input, state.projectPath);
|
|
479
|
+
const call = { name: p.name ?? 'unknown', filePaths, text: p.input ?? '' };
|
|
480
|
+
state.toolCalls.push(call);
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
if (l.type === 'response_item' && p.type === 'function_call') {
|
|
484
|
+
// Two deterministic sources here: read_file's explicit file_path
|
|
485
|
+
// argument, and a patch envelope embedded in an exec_command cmd
|
|
486
|
+
// (arguments are JSON-encoded, so decode before scanning).
|
|
487
|
+
const call = {
|
|
488
|
+
name: p.name ?? 'unknown',
|
|
489
|
+
filePaths: [
|
|
490
|
+
...extractReadFileePaths(p.name, p.arguments, state.projectPath),
|
|
491
|
+
...extractExecFilePaths(decodeArguments(p.arguments), state.projectPath),
|
|
492
|
+
],
|
|
493
|
+
text: p.arguments ?? '',
|
|
494
|
+
};
|
|
495
|
+
state.toolCalls.push(call);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Table-driven mapping from each tool's raw surface/kind field to the
|
|
2
|
+
// normalized values sessions.surface/sessions.kind store. Values here are
|
|
3
|
+
// corpus-measured, not assumed. Update this table if future corpus evidence
|
|
4
|
+
// contradicts the values below.
|
|
5
|
+
/** Claude Code's `entrypoint` field. Confirmed values only. */
|
|
6
|
+
export function claudeCodeSurface(entrypoint) {
|
|
7
|
+
if (entrypoint === 'cli') {
|
|
8
|
+
return 'cli';
|
|
9
|
+
}
|
|
10
|
+
if (entrypoint === 'claude-desktop') {
|
|
11
|
+
return 'desktop';
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Codex's `originator` field. THREE distinct values, not two - "codex-tui" (59/66 sessions),
|
|
17
|
+
* "codex_exec" (6/66), "Codex Desktop" (1/66), full local corpus, no fourth
|
|
18
|
+
* value found. Both non-Desktop values are CLI-originated, so the predicate
|
|
19
|
+
* is "not Desktop", not "equals codex-tui". A value this table has never
|
|
20
|
+
* seen is treated as CLI too (same predicate), not as unknown - Desktop is
|
|
21
|
+
* the one value confirmed to mean something else.
|
|
22
|
+
*/
|
|
23
|
+
export function codexSurface(originator) {
|
|
24
|
+
if (originator === undefined) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return originator === 'Codex Desktop' ? 'desktop' : 'cli';
|
|
28
|
+
}
|
|
29
|
+
const SESSION_KIND_MAP = {
|
|
30
|
+
primary: 'main',
|
|
31
|
+
subagent: 'subagent',
|
|
32
|
+
'fork-copy': 'fork',
|
|
33
|
+
adjudicator: 'adjudicator',
|
|
34
|
+
};
|
|
35
|
+
/** SessionKind (adapter classification vocabulary) -> sessions.kind (this plan's storage vocabulary). See SessionRowKind's doc comment for why these differ. */
|
|
36
|
+
export function toSessionRowKind(kind) {
|
|
37
|
+
return SESSION_KIND_MAP[kind];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=discriminators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discriminators.js","sourceRoot":"","sources":["../../src/adapters/discriminators.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,0EAA0E;AAC1E,4EAA4E;AAC5E,gCAAgC;AAIhC,+DAA+D;AAC/D,MAAM,UAAU,iBAAiB,CAAC,UAA8B;IAC5D,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,UAAU,KAAK,gBAAgB,EAAE,CAAC;QAClC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,UAA8B;IACvD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,UAAU,KAAK,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D,CAAC;AAED,MAAM,gBAAgB,GAAwC;IAC1D,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,aAAa;CAC7B,CAAC;AAEF,gKAAgK;AAChK,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAC9C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,UAAU,eAAe;IAC3B,OAAO,EAAE,aAAa,EAAE,IAAI,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,YAAY,EAAE,EAAE,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-command.js","sourceRoot":"","sources":["../../src/adapters/internal-command.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,2FAA2F,CAAC;AACjI,MAAM,CAAC,MAAM,qBAAqB,GAAG,0CAA0C,CAAC"}
|