@nanonets/graft 0.23.0 → 0.24.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/README.md +4 -4
- package/dist/ai/crux.d.ts +31 -3
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +88 -10
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/openai.d.ts +101 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +396 -6
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +2 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -1
- package/dist/ai/llm/recover-tool.js +1 -1
- package/dist/ai/llm/recover-tool.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +100 -1
- package/dist/ai/synthesize.js.map +1 -1
- package/dist/claude/format.d.ts +21 -0
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +46 -1
- package/dist/claude/format.js.map +1 -1
- package/dist/claude/hooks.d.ts +5 -9
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +71 -58
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.js +3 -3
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +28 -0
- package/dist/claude/note-signals.d.ts.map +1 -0
- package/dist/claude/note-signals.js +325 -0
- package/dist/claude/note-signals.js.map +1 -0
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +17 -6
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +49 -18
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/state.d.ts +4 -3
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/sync-run.js +1 -1
- package/dist/claude/sync-run.js.map +1 -1
- package/dist/cli-picker.d.ts +12 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +24 -8
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +149 -43
- package/dist/cli.js.map +1 -1
- package/dist/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +7 -2
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +84 -50
- package/dist/context/build.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +41 -4
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +9 -4
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +8 -3
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +207 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/lsp/client.d.ts +18 -0
- package/dist/graph/lsp/client.d.ts.map +1 -1
- package/dist/graph/lsp/client.js +40 -2
- package/dist/graph/lsp/client.js.map +1 -1
- package/dist/graph/lsp/enrich.d.ts.map +1 -1
- package/dist/graph/lsp/enrich.js +9 -1
- package/dist/graph/lsp/enrich.js.map +1 -1
- package/dist/graph/lsp/registry.d.ts +7 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -1
- package/dist/graph/lsp/registry.js +27 -2
- package/dist/graph/lsp/registry.js.map +1 -1
- package/dist/graph/queries/gleam.scm +51 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +65 -3
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +1 -1
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/init-guard.d.ts +11 -0
- package/dist/init-guard.d.ts.map +1 -0
- package/dist/init-guard.js +21 -0
- package/dist/init-guard.js.map +1 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/branches.d.ts +7 -1
- package/dist/notes/branches.d.ts.map +1 -1
- package/dist/notes/branches.js +31 -3
- package/dist/notes/branches.js.map +1 -1
- package/dist/notes/cold-start.d.ts +12 -2
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +46 -5
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/credit.d.ts +37 -0
- package/dist/notes/credit.d.ts.map +1 -0
- package/dist/notes/credit.js +78 -0
- package/dist/notes/credit.js.map +1 -0
- package/dist/notes/find-notes.d.ts +17 -0
- package/dist/notes/find-notes.d.ts.map +1 -0
- package/dist/notes/find-notes.js +48 -0
- package/dist/notes/find-notes.js.map +1 -0
- package/dist/notes/flatten.d.ts +31 -0
- package/dist/notes/flatten.d.ts.map +1 -0
- package/dist/notes/flatten.js +73 -0
- package/dist/notes/flatten.js.map +1 -0
- package/dist/notes/git-facts.d.ts +7 -1
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +12 -2
- package/dist/notes/git-facts.js.map +1 -1
- package/dist/notes/home.d.ts +24 -6
- package/dist/notes/home.d.ts.map +1 -1
- package/dist/notes/home.js +82 -15
- package/dist/notes/home.js.map +1 -1
- package/dist/notes/learning-fields.d.ts +102 -0
- package/dist/notes/learning-fields.d.ts.map +1 -0
- package/dist/notes/learning-fields.js +214 -0
- package/dist/notes/learning-fields.js.map +1 -0
- package/dist/notes/memory-notes.d.ts +71 -0
- package/dist/notes/memory-notes.d.ts.map +1 -0
- package/dist/notes/memory-notes.js +239 -0
- package/dist/notes/memory-notes.js.map +1 -0
- package/dist/notes/note-gate.d.ts +42 -0
- package/dist/notes/note-gate.d.ts.map +1 -0
- package/dist/notes/note-gate.js +181 -0
- package/dist/notes/note-gate.js.map +1 -0
- package/dist/notes/notes.d.ts +29 -77
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -228
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +35 -7
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +156 -46
- package/dist/notes/pr-reviews.js.map +1 -1
- package/dist/notes/secrets.d.ts +28 -0
- package/dist/notes/secrets.d.ts.map +1 -0
- package/dist/notes/secrets.js +362 -0
- package/dist/notes/secrets.js.map +1 -0
- package/dist/notes/session-cost.d.ts +2 -0
- package/dist/notes/session-cost.d.ts.map +1 -1
- package/dist/notes/session-cost.js +8 -3
- package/dist/notes/session-cost.js.map +1 -1
- package/dist/notes/targets.d.ts +37 -0
- package/dist/notes/targets.d.ts.map +1 -0
- package/dist/notes/targets.js +108 -0
- package/dist/notes/targets.js.map +1 -0
- package/dist/notes/team-check.d.ts +22 -0
- package/dist/notes/team-check.d.ts.map +1 -0
- package/dist/notes/team-check.js +130 -0
- package/dist/notes/team-check.js.map +1 -0
- package/dist/notes/trail-home.d.ts +3 -0
- package/dist/notes/trail-home.d.ts.map +1 -0
- package/dist/notes/trail-home.js +12 -0
- package/dist/notes/trail-home.js.map +1 -0
- package/dist/search/grep-cli.d.ts +5 -2
- package/dist/search/grep-cli.d.ts.map +1 -1
- package/dist/search/grep-cli.js +11 -4
- package/dist/search/grep-cli.js.map +1 -1
- package/dist/search/ignored-code.d.ts +9 -0
- package/dist/search/ignored-code.d.ts.map +1 -0
- package/dist/search/ignored-code.js +73 -0
- package/dist/search/ignored-code.js.map +1 -0
- package/dist/skills/answers-prompt.d.ts +13 -0
- package/dist/skills/answers-prompt.d.ts.map +1 -0
- package/dist/skills/answers-prompt.js +83 -0
- package/dist/skills/answers-prompt.js.map +1 -0
- package/dist/skills/never-save.d.ts +5 -0
- package/dist/skills/never-save.d.ts.map +1 -0
- package/dist/skills/never-save.js +158 -0
- package/dist/skills/never-save.js.map +1 -0
- package/dist/skills/params.d.ts +39 -0
- package/dist/skills/params.d.ts.map +1 -0
- package/dist/skills/params.js +275 -0
- package/dist/skills/params.js.map +1 -0
- package/dist/skills/ran-less.d.ts +5 -0
- package/dist/skills/ran-less.d.ts.map +1 -0
- package/dist/skills/ran-less.js +51 -0
- package/dist/skills/ran-less.js.map +1 -0
- package/dist/skills/risk-delta.d.ts +32 -0
- package/dist/skills/risk-delta.d.ts.map +1 -0
- package/dist/skills/risk-delta.js +56 -0
- package/dist/skills/risk-delta.js.map +1 -0
- package/dist/skills/risk.d.ts +73 -0
- package/dist/skills/risk.d.ts.map +1 -0
- package/dist/skills/risk.js +396 -0
- package/dist/skills/risk.js.map +1 -0
- package/dist/skills/types.d.ts +422 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +8 -6
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +3 -1
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/trace/check-reads.d.ts +36 -0
- package/dist/trace/check-reads.d.ts.map +1 -0
- package/dist/trace/check-reads.js +57 -0
- package/dist/trace/check-reads.js.map +1 -0
- package/dist/trace/host.d.ts +40 -0
- package/dist/trace/host.d.ts.map +1 -0
- package/dist/trace/host.js +84 -0
- package/dist/trace/host.js.map +1 -0
- package/dist/trace/redact.d.ts +8 -0
- package/dist/trace/redact.d.ts.map +1 -0
- package/dist/trace/redact.js +63 -0
- package/dist/trace/redact.js.map +1 -0
- package/dist/trace/seen-cache.d.ts +9 -0
- package/dist/trace/seen-cache.d.ts.map +1 -0
- package/dist/trace/seen-cache.js +46 -0
- package/dist/trace/seen-cache.js.map +1 -0
- package/dist/trace/shell-scan.d.ts +52 -0
- package/dist/trace/shell-scan.d.ts.map +1 -0
- package/dist/trace/shell-scan.js +318 -0
- package/dist/trace/shell-scan.js.map +1 -0
- package/dist/trace/shell-words.d.ts +91 -0
- package/dist/trace/shell-words.d.ts.map +1 -0
- package/dist/trace/shell-words.js +558 -0
- package/dist/trace/shell-words.js.map +1 -0
- package/dist/trace/shell.d.ts +91 -0
- package/dist/trace/shell.d.ts.map +1 -0
- package/dist/trace/shell.js +435 -0
- package/dist/trace/shell.js.map +1 -0
- package/dist/trace/state.d.ts +27 -0
- package/dist/trace/state.d.ts.map +1 -0
- package/dist/trace/state.js +98 -0
- package/dist/trace/state.js.map +1 -0
- package/dist/trace/tamper-code.d.ts +9 -0
- package/dist/trace/tamper-code.d.ts.map +1 -0
- package/dist/trace/tamper-code.js +174 -0
- package/dist/trace/tamper-code.js.map +1 -0
- package/dist/trace/tamper-git.d.ts +12 -0
- package/dist/trace/tamper-git.d.ts.map +1 -0
- package/dist/trace/tamper-git.js +77 -0
- package/dist/trace/tamper-git.js.map +1 -0
- package/dist/trace/types.d.ts +477 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +12 -0
- package/dist/trace/types.js.map +1 -0
- package/dist/trace/walls-glob.d.ts +11 -0
- package/dist/trace/walls-glob.d.ts.map +1 -0
- package/dist/trace/walls-glob.js +264 -0
- package/dist/trace/walls-glob.js.map +1 -0
- package/dist/trace/walls-quoted.d.ts +25 -0
- package/dist/trace/walls-quoted.d.ts.map +1 -0
- package/dist/trace/walls-quoted.js +81 -0
- package/dist/trace/walls-quoted.js.map +1 -0
- package/dist/upkeep.d.ts +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +4 -1
- package/dist/upkeep.js.map +1 -1
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/front-matter.d.ts +31 -4
- package/dist/util/front-matter.d.ts.map +1 -1
- package/dist/util/front-matter.js +95 -3
- package/dist/util/front-matter.js.map +1 -1
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/private-fs.d.ts +25 -0
- package/dist/util/private-fs.d.ts.map +1 -0
- package/dist/util/private-fs.js +253 -0
- package/dist/util/private-fs.js.map +1 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +3 -0
- package/dist/util/state.js.map +1 -1
- package/dist/viewer/app.js +2 -2
- package/package.json +5 -5
- package/scripts/run-tests.mjs +14 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-reads.js","sourceRoot":"","sources":["../../src/trace/check-reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which agent sent a hook payload, and how much of what it did its transcript
|
|
3
|
+
* keeps. Worked out from the payload itself, before any transcript is parsed,
|
|
4
|
+
* never from the settings file that fired the hook: Cursor and Copilot CLI run
|
|
5
|
+
* the Claude Code hooks in `.claude/settings.json` too, so a payload on a
|
|
6
|
+
* Claude hook can carry a Cursor or Copilot transcript path. Parsed as Claude,
|
|
7
|
+
* such a file shows no typed words and no tool results, and every save would
|
|
8
|
+
* look like the agent's own.
|
|
9
|
+
*
|
|
10
|
+
* Tiers (how far Trail can trust the record):
|
|
11
|
+
* - A: typed words told apart, tool calls, results with a failure signal,
|
|
12
|
+
* compactions. Claude Code.
|
|
13
|
+
* - B: a full record whose host checks aren't written up yet. Codex, until HC1 to HC12 are (P31): its rollouts
|
|
14
|
+
* are read and folded (phase 2), but learning stays off.
|
|
15
|
+
* - C: typed words, calls at best, no results Trail can read. Copilot CLI,
|
|
16
|
+
* Gemini CLI (no hooks wired, no parser yet).
|
|
17
|
+
* - D: nothing Trail can read, or a shape it doesn't know. Cursor (its
|
|
18
|
+
* transcripts keep no results), anything unknown.
|
|
19
|
+
* Only tier A can make a live item; everything else is held for a yes.
|
|
20
|
+
*
|
|
21
|
+
* `subagent` is set when the payload comes from a subagent's tool call or
|
|
22
|
+
* stop (Claude Code adds `agent_id` there, never on the main thread). Its
|
|
23
|
+
* transcript path still names the parent session, so the caller stays out.
|
|
24
|
+
*/
|
|
25
|
+
export type Host = "claude" | "codex" | "cursor" | "copilot" | "gemini" | "unknown";
|
|
26
|
+
export type Tier = "A" | "B" | "C" | "D";
|
|
27
|
+
export interface HostInfo {
|
|
28
|
+
host: Host;
|
|
29
|
+
tier: Tier;
|
|
30
|
+
subagent?: true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Codex's tier (design 4.18, P31): the one constant that flips to "A", in the commit that writes up HC1 to HC12 in
|
|
34
|
+
* host-checks.md and passes the Codex legs of J04, J10 and J13 in a real session. Until then a test home may set
|
|
35
|
+
* TRAIL_TIER_CODEX=A (host-facts.ts `hostTier`).
|
|
36
|
+
*/
|
|
37
|
+
export declare const CODEX_TIER: Tier;
|
|
38
|
+
/** The host that sent `payload` and its tier. Never throws; anything unreadable is unknown. */
|
|
39
|
+
export declare function detectHost(payload: unknown): HostInfo;
|
|
40
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/trace/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpF,MAAM,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,IAAU,CAAC;AAsBpC,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA6BrD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which agent sent a hook payload, and how much of what it did its transcript
|
|
3
|
+
* keeps. Worked out from the payload itself, before any transcript is parsed,
|
|
4
|
+
* never from the settings file that fired the hook: Cursor and Copilot CLI run
|
|
5
|
+
* the Claude Code hooks in `.claude/settings.json` too, so a payload on a
|
|
6
|
+
* Claude hook can carry a Cursor or Copilot transcript path. Parsed as Claude,
|
|
7
|
+
* such a file shows no typed words and no tool results, and every save would
|
|
8
|
+
* look like the agent's own.
|
|
9
|
+
*
|
|
10
|
+
* Tiers (how far Trail can trust the record):
|
|
11
|
+
* - A: typed words told apart, tool calls, results with a failure signal,
|
|
12
|
+
* compactions. Claude Code.
|
|
13
|
+
* - B: a full record whose host checks aren't written up yet. Codex, until HC1 to HC12 are (P31): its rollouts
|
|
14
|
+
* are read and folded (phase 2), but learning stays off.
|
|
15
|
+
* - C: typed words, calls at best, no results Trail can read. Copilot CLI,
|
|
16
|
+
* Gemini CLI (no hooks wired, no parser yet).
|
|
17
|
+
* - D: nothing Trail can read, or a shape it doesn't know. Cursor (its
|
|
18
|
+
* transcripts keep no results), anything unknown.
|
|
19
|
+
* Only tier A can make a live item; everything else is held for a yes.
|
|
20
|
+
*
|
|
21
|
+
* `subagent` is set when the payload comes from a subagent's tool call or
|
|
22
|
+
* stop (Claude Code adds `agent_id` there, never on the main thread). Its
|
|
23
|
+
* transcript path still names the parent session, so the caller stays out.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Codex's tier (design 4.18, P31): the one constant that flips to "A", in the commit that writes up HC1 to HC12 in
|
|
27
|
+
* host-checks.md and passes the Codex legs of J04, J10 and J13 in a real session. Until then a test home may set
|
|
28
|
+
* TRAIL_TIER_CODEX=A (host-facts.ts `hostTier`).
|
|
29
|
+
*/
|
|
30
|
+
export const CODEX_TIER = "B";
|
|
31
|
+
const TIER = { claude: "A", codex: CODEX_TIER, cursor: "D", copilot: "C", gemini: "C", unknown: "D" };
|
|
32
|
+
/** Keys only Cursor's hooks send, on its own events and on Claude's. */
|
|
33
|
+
const CURSOR_KEYS = ["conversation_id", "generation_id", "cursor_version", "workspace_roots"];
|
|
34
|
+
/** Antigravity: camelCase like Copilot, but its own. Not a host Trail reads yet. */
|
|
35
|
+
const ANTIGRAVITY_KEYS = ["conversationId", "artifactDirectoryPath", "workspacePaths"];
|
|
36
|
+
/** Copilot CLI's own hooks speak camelCase; on a .claude/settings.json it switches to snake_case with an ISO timestamp. */
|
|
37
|
+
const COPILOT_KEYS = ["sessionId", "toolName", "toolArgs", "transcriptPath", "toolResult"];
|
|
38
|
+
/** Events only Gemini CLI has; SessionStart, SessionEnd and Notification it shares with Claude Code. */
|
|
39
|
+
const GEMINI_EVENTS = new Set(["BeforeTool", "AfterTool", "BeforeAgent", "AfterAgent", "BeforeModel", "AfterModel", "BeforeToolSelection", "PreCompress"]);
|
|
40
|
+
function result(host, subagent = false) {
|
|
41
|
+
return subagent ? { host, tier: TIER[host], subagent: true } : { host, tier: TIER[host] };
|
|
42
|
+
}
|
|
43
|
+
/** Forward slashes, so one set of checks reads Windows paths too. */
|
|
44
|
+
function slashed(p) {
|
|
45
|
+
return p.replace(/\\/g, "/");
|
|
46
|
+
}
|
|
47
|
+
/** The host that sent `payload` and its tier. Never throws; anything unreadable is unknown. */
|
|
48
|
+
export function detectHost(payload) {
|
|
49
|
+
try {
|
|
50
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload))
|
|
51
|
+
return result("unknown");
|
|
52
|
+
const p = payload;
|
|
53
|
+
const has = (k) => Object.prototype.hasOwnProperty.call(p, k) && p[k] !== undefined && p[k] !== null;
|
|
54
|
+
const rawPath = has("transcript_path") ? p.transcript_path : p.transcriptPath;
|
|
55
|
+
const path = typeof rawPath === "string" ? slashed(rawPath) : "";
|
|
56
|
+
const file = path.slice(path.lastIndexOf("/") + 1);
|
|
57
|
+
const event = typeof p.hook_event_name === "string" ? p.hook_event_name : "";
|
|
58
|
+
if (CURSOR_KEYS.some(has) || path.includes("/.cursor/") || path.includes("/agent-transcripts/"))
|
|
59
|
+
return result("cursor");
|
|
60
|
+
if (ANTIGRAVITY_KEYS.some(has) || path.includes("/.gemini/antigravity"))
|
|
61
|
+
return result("unknown");
|
|
62
|
+
if (has("turn_id") || /^rollout-.*\.jsonl(\.zst)?$/.test(file) || path.includes("/.codex/sessions/"))
|
|
63
|
+
return result("codex");
|
|
64
|
+
if (COPILOT_KEYS.some(has) || path.includes("/.copilot/"))
|
|
65
|
+
return result("copilot");
|
|
66
|
+
if (GEMINI_EVENTS.has(event) || path.includes("/.gemini/tmp/"))
|
|
67
|
+
return result("gemini");
|
|
68
|
+
// Copilot CLI running a .claude/settings.json speaks snake_case like Claude
|
|
69
|
+
// Code, but stamps an ISO `timestamp`, which Claude Code never sends.
|
|
70
|
+
if (typeof p.timestamp === "string")
|
|
71
|
+
return result("copilot");
|
|
72
|
+
// Claude Code sends a session id and its transcript's path on every event,
|
|
73
|
+
// and names events in PascalCase. Without a transcript nothing proves it.
|
|
74
|
+
const claudeEvent = !has("hook_event_name") || /^[A-Z][A-Za-z]+$/.test(event);
|
|
75
|
+
if (typeof p.session_id === "string" && p.session_id && typeof rawPath === "string" && file.endsWith(".jsonl") && claudeEvent) {
|
|
76
|
+
return result("claude", typeof p.agent_id === "string" && p.agent_id !== "");
|
|
77
|
+
}
|
|
78
|
+
return result("unknown");
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return result("unknown");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/trace/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The fold-time secret rule (4.10). */
|
|
2
|
+
export declare function redactSecrets(cmd: string): {
|
|
3
|
+
cmd: string | null;
|
|
4
|
+
secret?: 'named' | 'refused';
|
|
5
|
+
};
|
|
6
|
+
/** flatLine(text, max), or undefined when secretReason finds anything in it. */
|
|
7
|
+
export declare function cleanLine(text: string, max: number): string | undefined;
|
|
8
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/trace/redact.ts"],"names":[],"mappings":"AAyBA,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,CAwB/F;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fold-time secret rule (design 4.10). A command that ran is kept only in
|
|
3
|
+
* a form with no secret in it: a secret assigned to a name (`NPM_TOKEN=…`,
|
|
4
|
+
* `--token …`) becomes `${NAME:?set NAME}`, which still runs and says what to
|
|
5
|
+
* set; anything else secret-shaped makes the whole command unusable, stored
|
|
6
|
+
* as null. Nothing secret-shaped reaches `sessions/`, `runs/`, marks or a
|
|
7
|
+
* skill.
|
|
8
|
+
*
|
|
9
|
+
* A named value ends where the shell word ends (`;`, `&&`, `|` stay put), and
|
|
10
|
+
* its placeholder is always double-quoted so it expands. A command over 2,000
|
|
11
|
+
* characters is never compiled (the fold marks it truncated), so it is stored
|
|
12
|
+
* as null without a look.
|
|
13
|
+
*/
|
|
14
|
+
import { flatLine } from '../notes/flatten.js';
|
|
15
|
+
import { secretReason } from '../notes/secrets.js';
|
|
16
|
+
const placeholder = (name) => `\${${name}:?set ${name}}`;
|
|
17
|
+
/** A value: quoted (anything but its quote), or a bare word (up to a space, a quote or a shell operator). */
|
|
18
|
+
const VALUE = String.raw `(?:'([^']*)'|"([^"]*)"|([^\s'"\x60;&|<>()]+))`;
|
|
19
|
+
const ASSIGNED = new RegExp(String.raw `\b([A-Z][A-Z0-9_]{2,})=${VALUE}`, 'g');
|
|
20
|
+
const FLAG = new RegExp(String.raw `--(token|password|api-key|apikey|secret|key)([= ])${VALUE}`, 'g');
|
|
21
|
+
const BEARER = /(\bBearer\s+)([^\s'"]+)/gi;
|
|
22
|
+
/** Commands longer than this are never compiled (4.1 `truncated`) and are not scanned. */
|
|
23
|
+
const MAX_SCANNED = 2000;
|
|
24
|
+
/** The fold-time secret rule (4.10). */
|
|
25
|
+
export function redactSecrets(cmd) {
|
|
26
|
+
const raw = String(cmd ?? '');
|
|
27
|
+
if (raw.length > MAX_SCANNED)
|
|
28
|
+
return { cmd: null, secret: 'refused' };
|
|
29
|
+
if (secretReason(raw) === null)
|
|
30
|
+
return { cmd: raw };
|
|
31
|
+
// Values assigned to a name, so a later `Bearer <value>` can take that name.
|
|
32
|
+
const named = new Map();
|
|
33
|
+
let out = raw.replace(ASSIGNED, (whole, name, sq, dq, bare) => {
|
|
34
|
+
const value = sq ?? dq ?? bare ?? '';
|
|
35
|
+
if (secretReason(`${name}=${value}`) === null && secretReason(value) === null)
|
|
36
|
+
return whole;
|
|
37
|
+
named.set(value, name);
|
|
38
|
+
// Double quotes, or none: a placeholder in single quotes would never expand.
|
|
39
|
+
return `${name}=${bare === undefined ? '"' : ''}${placeholder(name)}${bare === undefined ? '"' : ''}`;
|
|
40
|
+
});
|
|
41
|
+
out = out.replace(FLAG, (whole, flag, sep, sq, dq, bare) => {
|
|
42
|
+
const value = sq ?? dq ?? bare ?? '';
|
|
43
|
+
if (secretReason(`--${flag} ${value}`) === null && secretReason(value) === null)
|
|
44
|
+
return whole;
|
|
45
|
+
return `--${flag}${sep}"${placeholder(flag.toUpperCase().replace(/-/g, '_'))}"`;
|
|
46
|
+
});
|
|
47
|
+
out = out.replace(BEARER, (whole, lead, value) => {
|
|
48
|
+
const name = named.get(value);
|
|
49
|
+
return name ? `${lead}${placeholder(name)}` : whole;
|
|
50
|
+
});
|
|
51
|
+
if (out === raw || secretReason(out) !== null)
|
|
52
|
+
return { cmd: null, secret: 'refused' };
|
|
53
|
+
return { cmd: out, secret: 'named' };
|
|
54
|
+
}
|
|
55
|
+
/** flatLine(text, max), or undefined when secretReason finds anything in it. */
|
|
56
|
+
export function cleanLine(text, max) {
|
|
57
|
+
const raw = typeof text === 'string' ? text : '';
|
|
58
|
+
if (secretReason(raw) !== null)
|
|
59
|
+
return undefined;
|
|
60
|
+
const line = flatLine(raw, max);
|
|
61
|
+
return secretReason(line) === null ? line : undefined;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/trace/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The set of `st.seen`, for one fold to check and add to; give it back with keepSeen. */
|
|
2
|
+
export declare function takeSeenSet(st: {
|
|
3
|
+
seen?: string;
|
|
4
|
+
}, hex: number): Set<string>;
|
|
5
|
+
/** Appends `fresh` to `st.seen` (the newest `max` kept) and keeps `set` for the next fold of this state. */
|
|
6
|
+
export declare function keepSeen(st: {
|
|
7
|
+
seen?: string;
|
|
8
|
+
}, set: Set<string> | null, fresh: string[], hex: number, max: number): void;
|
|
9
|
+
//# sourceMappingURL=seen-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seen-cache.d.ts","sourceRoot":"","sources":["../../src/trace/seen-cache.ts"],"names":[],"mappings":"AAgBA,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAK3E;AAQD,4GAA4G;AAC5G,wBAAgB,QAAQ,CAAC,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAYxH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D56d's `st.seen` (10 hex a key, the newest 6,000) as a Set, kept across
|
|
3
|
+
* folds of the same state object. Init's replay folds one in-memory state
|
|
4
|
+
* turn by turn, and parsing 6,000 hashes on every fold made a 10,000-turn
|
|
5
|
+
* session take about 8 s (b5 review). A hook reads its state from disk each
|
|
6
|
+
* time, so it parses once, as before.
|
|
7
|
+
*
|
|
8
|
+
* The kept set is always exactly the parse of `st.seen`: it is taken out of
|
|
9
|
+
* the cache while a fold changes it (a fold that throws leaves none behind),
|
|
10
|
+
* put back with the string it matches, and a `st.seen` changed any other way
|
|
11
|
+
* is parsed again.
|
|
12
|
+
*/
|
|
13
|
+
const CACHE = new WeakMap();
|
|
14
|
+
const parse = (s, hex) => new Set(s.match(new RegExp(`.{${hex}}`, 'g')) ?? []);
|
|
15
|
+
/** The set of `st.seen`, for one fold to check and add to; give it back with keepSeen. */
|
|
16
|
+
export function takeSeenSet(st, hex) {
|
|
17
|
+
const s = st.seen ?? '';
|
|
18
|
+
const c = CACHE.get(st);
|
|
19
|
+
CACHE.delete(st);
|
|
20
|
+
return c && c.seen === s ? c.set : parse(s, hex);
|
|
21
|
+
}
|
|
22
|
+
/** Whether `h` sits in `s` at a key's boundary. */
|
|
23
|
+
function holds(s, h, hex) {
|
|
24
|
+
for (let i = s.indexOf(h); i >= 0; i = s.indexOf(h, i + 1))
|
|
25
|
+
if (i % hex === 0)
|
|
26
|
+
return true;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
/** Appends `fresh` to `st.seen` (the newest `max` kept) and keeps `set` for the next fold of this state. */
|
|
30
|
+
export function keepSeen(st, set, fresh, hex, max) {
|
|
31
|
+
if (fresh.length) {
|
|
32
|
+
const all = (st.seen ?? '') + fresh.join('');
|
|
33
|
+
const cut = all.length > max * hex ? all.length - max * hex : 0;
|
|
34
|
+
st.seen = cut ? all.slice(cut) : all;
|
|
35
|
+
if (set && cut)
|
|
36
|
+
for (let i = 0; i < cut; i += hex) {
|
|
37
|
+
const h = all.slice(i, i + hex);
|
|
38
|
+
if (!holds(st.seen, h, hex))
|
|
39
|
+
set.delete(h);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const s = st.seen ?? '';
|
|
43
|
+
if (set && s.length % hex === 0)
|
|
44
|
+
CACHE.set(st, { seen: s, set });
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=seen-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seen-cache.js","sourceRoot":"","sources":["../../src/trace/seen-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,KAAK,GAAG,IAAI,OAAO,EAA8C,CAAC;AAExE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAE/F,0FAA0F;AAC1F,MAAM,UAAU,WAAW,CAAC,EAAqB,EAAE,GAAW;IAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,mDAAmD;AACnD,SAAS,KAAK,CAAC,CAAS,EAAE,CAAS,EAAE,GAAW;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAAE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAC3F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,QAAQ,CAAC,EAAqB,EAAE,GAAuB,EAAE,KAAe,EAAE,GAAW,EAAE,GAAW;IAChH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrC,IAAI,GAAG,IAAI,GAAG;YAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;gBAChC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC;oBAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;IACH,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IACxB,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The lexer under `shell.ts`: one pass over a command that finds its
|
|
3
|
+
* top-level segments the way the shell would. Quotes, `$'…'`, `$(…)`,
|
|
4
|
+
* `$((…))`, backticks, `${…}`, `(…)` subshells, `{ …; }` groups, `[[ … ]]`,
|
|
5
|
+
* comments, and loops and ifs (when asked) are opaque; a heredoc body is
|
|
6
|
+
* skipped as text and, at the top level, belongs to the segment whose line
|
|
7
|
+
* opened it. Ranges into the original text are returned, so callers can cut
|
|
8
|
+
* a command without retyping any of it.
|
|
9
|
+
*
|
|
10
|
+
* The PreToolUse fast path loads this file through `shell.ts`: it imports
|
|
11
|
+
* nothing.
|
|
12
|
+
*/
|
|
13
|
+
export type Sep = '&&' | '||' | ';' | '|' | '&' | '';
|
|
14
|
+
/** One top-level segment, as ranges of the original text. */
|
|
15
|
+
export interface Piece {
|
|
16
|
+
start: number;
|
|
17
|
+
end: number;
|
|
18
|
+
sep: Sep;
|
|
19
|
+
nl: boolean;
|
|
20
|
+
/** Heredoc bodies that sit after the line this segment ended on. */
|
|
21
|
+
bodies: Array<[number, number]>;
|
|
22
|
+
/** The segment starts with a subshell or group: where it opens and closes. */
|
|
23
|
+
group: {
|
|
24
|
+
open: number;
|
|
25
|
+
close: number;
|
|
26
|
+
} | null;
|
|
27
|
+
}
|
|
28
|
+
export interface Scan {
|
|
29
|
+
segs: Piece[];
|
|
30
|
+
heredoc: boolean;
|
|
31
|
+
newline: boolean;
|
|
32
|
+
keep: Array<[number, number]>;
|
|
33
|
+
}
|
|
34
|
+
export declare const OPEN_KW: Set<string>;
|
|
35
|
+
/**
|
|
36
|
+
* The one scanner. `compounds`: a loop or an if is one segment (false splits
|
|
37
|
+
* inside them, to look at what they run).
|
|
38
|
+
*/
|
|
39
|
+
export declare function scan(s: string, compounds?: boolean): Scan;
|
|
40
|
+
/** A piece's head text plus its detached heredoc bodies. */
|
|
41
|
+
export declare function pieceText(s: string, p: Piece): string;
|
|
42
|
+
/**
|
|
43
|
+
* `s` with `ranges` removed, except what `keep` protects (heredoc bodies and
|
|
44
|
+
* the newline before them), trimmed.
|
|
45
|
+
*/
|
|
46
|
+
export declare function cut(s: string, ranges: Array<[number, number]>, keep: Array<[number, number]>): string;
|
|
47
|
+
/** Words of one segment's head, split on unquoted spaces; quotes kept; a `#` comment is not a word. */
|
|
48
|
+
export declare function words(text: string): string[];
|
|
49
|
+
export declare const unquote: (w: string) => string;
|
|
50
|
+
export declare const base: (w: string) => string;
|
|
51
|
+
export declare const ASSIGN: RegExp;
|
|
52
|
+
//# sourceMappingURL=shell-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-scan.d.ts","sourceRoot":"","sources":["../../src/trace/shell-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AACrD,6DAA6D;AAC7D,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAClD,oEAAoE;IACpE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAChC,8EAA8E;IAC9E,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/C;AACD,MAAM,WAAW,IAAI;IAAG,IAAI,EAAE,KAAK,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE;AAE1G,eAAO,MAAM,OAAO,aAA6D,CAAC;AAKlF;;;GAGG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,UAAO,GAAG,IAAI,CAqJtD;AAED,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAOrG;AAED,uGAAuG;AACvG,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA4B5C;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,MAAM,WAA2C,CAAC;AAC7E,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,WAA0D,CAAC;AACzF,eAAO,MAAM,MAAM,QAA6B,CAAC"}
|