patchwork-os 0.2.0-alpha.34 → 0.2.0-alpha.36
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 +202 -93
- package/deploy/bootstrap-new-vps.sh +12 -12
- package/deploy/bootstrap-vps.sh +6 -3
- package/deploy/deploy-landing.sh +59 -2
- package/dist/activityLog.d.ts +49 -0
- package/dist/activityLog.js +78 -0
- package/dist/activityLog.js.map +1 -1
- package/dist/approvalHttp.d.ts +25 -0
- package/dist/approvalHttp.js +74 -18
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalInsights.d.ts +49 -0
- package/dist/approvalInsights.js +97 -0
- package/dist/approvalInsights.js.map +1 -0
- package/dist/approvalQueue.d.ts +11 -0
- package/dist/approvalQueue.js +80 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/approvalSignals.d.ts +124 -0
- package/dist/approvalSignals.js +512 -0
- package/dist/approvalSignals.js.map +1 -0
- package/dist/automation.d.ts +37 -0
- package/dist/automation.js +105 -61
- package/dist/automation.js.map +1 -1
- package/dist/automationSuggestions.d.ts +79 -0
- package/dist/automationSuggestions.js +150 -0
- package/dist/automationSuggestions.js.map +1 -0
- package/dist/bridge.js +78 -1
- package/dist/bridge.js.map +1 -1
- package/dist/ccPermissions.d.ts +15 -0
- package/dist/ccPermissions.js +15 -0
- package/dist/ccPermissions.js.map +1 -1
- package/dist/claudeDriver.js +74 -16
- package/dist/claudeDriver.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +8 -0
- package/dist/commands/patchworkInit.js +41 -5
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +20 -0
- package/dist/commands/recipe.js +212 -6
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +79 -1
- package/dist/commands/recipeInstall.js +333 -16
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +83 -0
- package/dist/commands/tracesExport.js +269 -0
- package/dist/commands/tracesExport.js.map +1 -0
- package/dist/commands/tracesImport.d.ts +56 -0
- package/dist/commands/tracesImport.js +161 -0
- package/dist/commands/tracesImport.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.d.ts +43 -0
- package/dist/connectorRoutes.js +1023 -0
- package/dist/connectorRoutes.js.map +1 -0
- package/dist/connectors/asana.d.ts +198 -0
- package/dist/connectors/asana.js +679 -0
- package/dist/connectors/asana.js.map +1 -0
- package/dist/connectors/baseConnector.d.ts +36 -0
- package/dist/connectors/baseConnector.js +151 -28
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/discord.d.ts +150 -0
- package/dist/connectors/discord.js +543 -0
- package/dist/connectors/discord.js.map +1 -0
- package/dist/connectors/github.js +11 -4
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.d.ts +180 -0
- package/dist/connectors/gitlab.js +582 -0
- package/dist/connectors/gitlab.js.map +1 -0
- package/dist/connectors/gmail.js +50 -10
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +36 -10
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDrive.d.ts +34 -0
- package/dist/connectors/googleDrive.js +321 -0
- package/dist/connectors/googleDrive.js.map +1 -0
- package/dist/connectors/linear.js +23 -4
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpOAuth.js +26 -2
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/oauthStateStore.d.ts +31 -0
- package/dist/connectors/oauthStateStore.js +52 -0
- package/dist/connectors/oauthStateStore.js.map +1 -0
- package/dist/connectors/pagerduty.d.ts +160 -0
- package/dist/connectors/pagerduty.js +464 -0
- package/dist/connectors/pagerduty.js.map +1 -0
- package/dist/connectors/slack.d.ts +16 -1
- package/dist/connectors/slack.js +57 -5
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/tokenStorage.js +27 -2
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/zendesk.js +19 -1
- package/dist/connectors/zendesk.js.map +1 -1
- package/dist/cors.d.ts +10 -0
- package/dist/cors.js +29 -0
- package/dist/cors.js.map +1 -0
- package/dist/decisionReplay.d.ts +72 -0
- package/dist/decisionReplay.js +92 -0
- package/dist/decisionReplay.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +6 -0
- package/dist/decisionTraceLog.js +54 -2
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/featureFlags.d.ts +17 -11
- package/dist/featureFlags.js +52 -47
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +25 -21
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationState.js +4 -1
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/policyParser.js +4 -1
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/inboxRoutes.d.ts +22 -0
- package/dist/inboxRoutes.js +114 -0
- package/dist/inboxRoutes.js.map +1 -0
- package/dist/index.js +734 -144
- package/dist/index.js.map +1 -1
- package/dist/mcpRoutes.d.ts +37 -0
- package/dist/mcpRoutes.js +76 -0
- package/dist/mcpRoutes.js.map +1 -0
- package/dist/oauth.d.ts +3 -0
- package/dist/oauth.js +151 -26
- package/dist/oauth.js.map +1 -1
- package/dist/oauthRoutes.d.ts +32 -0
- package/dist/oauthRoutes.js +124 -0
- package/dist/oauthRoutes.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.js +2 -2
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +7 -0
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/pluginLoader.d.ts +12 -0
- package/dist/pluginLoader.js +43 -4
- package/dist/pluginLoader.js.map +1 -1
- package/dist/pluginWatcher.js +8 -3
- package/dist/pluginWatcher.js.map +1 -1
- package/dist/preToolUseHook.d.ts +12 -0
- package/dist/preToolUseHook.js +23 -0
- package/dist/preToolUseHook.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +8 -0
- package/dist/recipeOrchestration.js +320 -39
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +154 -0
- package/dist/recipeRoutes.js +1098 -0
- package/dist/recipeRoutes.js.map +1 -0
- package/dist/recipes/captureForRunlog.d.ts +27 -0
- package/dist/recipes/captureForRunlog.js +128 -0
- package/dist/recipes/captureForRunlog.js.map +1 -0
- package/dist/recipes/chainedRunner.d.ts +54 -3
- package/dist/recipes/chainedRunner.js +256 -36
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +3 -3
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/detectSilentFail.d.ts +34 -0
- package/dist/recipes/detectSilentFail.js +105 -0
- package/dist/recipes/detectSilentFail.js.map +1 -0
- package/dist/recipes/installer.js +3 -3
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/manifest.js +21 -6
- package/dist/recipes/manifest.js.map +1 -1
- package/dist/recipes/migrationWarnings.d.ts +12 -0
- package/dist/recipes/migrationWarnings.js +44 -0
- package/dist/recipes/migrationWarnings.js.map +1 -0
- package/dist/recipes/replayRun.d.ts +62 -0
- package/dist/recipes/replayRun.js +97 -0
- package/dist/recipes/replayRun.js.map +1 -0
- package/dist/recipes/resolveRecipePath.d.ts +69 -0
- package/dist/recipes/resolveRecipePath.js +202 -0
- package/dist/recipes/resolveRecipePath.js.map +1 -0
- package/dist/recipes/scheduler.js +102 -11
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schemaGenerator.js +3 -3
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/toolRegistry.d.ts +5 -0
- package/dist/recipes/toolRegistry.js +9 -0
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/asana.d.ts +16 -0
- package/dist/recipes/tools/asana.js +524 -0
- package/dist/recipes/tools/asana.js.map +1 -0
- package/dist/recipes/tools/discord.d.ts +18 -0
- package/dist/recipes/tools/discord.js +254 -0
- package/dist/recipes/tools/discord.js.map +1 -0
- package/dist/recipes/tools/file.d.ts +6 -0
- package/dist/recipes/tools/file.js +12 -8
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +29 -4
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gitlab.d.ts +11 -0
- package/dist/recipes/tools/gitlab.js +285 -0
- package/dist/recipes/tools/gitlab.js.map +1 -0
- package/dist/recipes/tools/gmail.d.ts +1 -1
- package/dist/recipes/tools/gmail.js +230 -6
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/googleDrive.d.ts +1 -0
- package/dist/recipes/tools/googleDrive.js +55 -0
- package/dist/recipes/tools/googleDrive.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +8 -0
- package/dist/recipes/tools/index.js +8 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/jira.d.ts +14 -0
- package/dist/recipes/tools/jira.js +369 -0
- package/dist/recipes/tools/jira.js.map +1 -0
- package/dist/recipes/tools/linear.d.ts +2 -1
- package/dist/recipes/tools/linear.js +227 -3
- package/dist/recipes/tools/linear.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.d.ts +21 -0
- package/dist/recipes/tools/meetingNotes.js +701 -0
- package/dist/recipes/tools/meetingNotes.js.map +1 -0
- package/dist/recipes/tools/pagerduty.d.ts +15 -0
- package/dist/recipes/tools/pagerduty.js +451 -0
- package/dist/recipes/tools/pagerduty.js.map +1 -0
- package/dist/recipes/tools/sentry.d.ts +12 -0
- package/dist/recipes/tools/sentry.js +73 -0
- package/dist/recipes/tools/sentry.js.map +1 -0
- package/dist/recipes/tools/slack.js +15 -5
- package/dist/recipes/tools/slack.js.map +1 -1
- package/dist/recipes/validation.js +83 -14
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +30 -2
- package/dist/recipes/yamlRunner.js +369 -70
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +76 -1
- package/dist/recipesHttp.js +474 -12
- package/dist/recipesHttp.js.map +1 -1
- package/dist/runLog.d.ts +78 -2
- package/dist/runLog.js +204 -6
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/dry-run-plan.v1.json +139 -0
- package/dist/schemas/recipe.v1.json +684 -0
- package/dist/server.d.ts +79 -10
- package/dist/server.js +366 -1384
- package/dist/server.js.map +1 -1
- package/dist/ssrfGuard.d.ts +54 -0
- package/dist/ssrfGuard.js +122 -0
- package/dist/ssrfGuard.js.map +1 -0
- package/dist/streamableHttp.d.ts +39 -1
- package/dist/streamableHttp.js +126 -17
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/getDocumentSymbols.d.ts +24 -0
- package/dist/tools/getDocumentSymbols.js +74 -8
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getSecurityAdvisories.js +10 -1
- package/dist/tools/getSecurityAdvisories.js.map +1 -1
- package/dist/tools/getSessionUsage.d.ts +3 -0
- package/dist/tools/getSessionUsage.js +3 -0
- package/dist/tools/getSessionUsage.js.map +1 -1
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +32 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/slackPostMessage.js +1 -1
- package/dist/tools/slackPostMessage.js.map +1 -1
- package/dist/tools/transaction.d.ts +19 -0
- package/dist/tools/transaction.js +29 -0
- package/dist/tools/transaction.js.map +1 -1
- package/dist/traceEncryption.d.ts +46 -0
- package/dist/traceEncryption.js +124 -0
- package/dist/traceEncryption.js.map +1 -0
- package/dist/transport.d.ts +39 -0
- package/dist/transport.js +88 -8
- package/dist/transport.js.map +1 -1
- package/package.json +22 -5
- package/templates/policies/README.md +72 -0
- package/templates/policies/conservative.json +14 -0
- package/templates/policies/developer.json +14 -0
- package/templates/policies/headless-ci.json +24 -0
- package/templates/policies/personal-assistant.json +15 -0
- package/templates/policies/regulated-industry.json +18 -0
- package/templates/recipes/project-health-check.yaml +1 -1
- package/templates/recipes/webhook/README.md +70 -0
- package/templates/recipes/webhook/capture-thought.yaml +26 -0
- package/templates/recipes/webhook/customer-escalation.yaml +49 -0
- package/templates/recipes/webhook/incident-intake.yaml +46 -0
- package/templates/recipes/webhook/meeting-prep.yaml +48 -0
- package/templates/recipes/webhook/morning-brief.yaml +57 -0
|
@@ -8,22 +8,55 @@
|
|
|
8
8
|
* https://github.com/owner/repo
|
|
9
9
|
* ./local/path
|
|
10
10
|
*/
|
|
11
|
-
import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
11
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
12
12
|
import https from "node:https";
|
|
13
13
|
import os from "node:os";
|
|
14
14
|
import path from "node:path";
|
|
15
15
|
import { getManifestRecipeFiles, loadManifestFromDir, parseManifest, } from "../recipes/manifest.js";
|
|
16
16
|
export const INSTALL_RECIPES_DIR = path.join(os.homedir(), ".patchwork", "recipes");
|
|
17
|
+
/**
|
|
18
|
+
* Marker file written into a recipe install dir to mark it as disabled.
|
|
19
|
+
* Absence = enabled (the default for legacy installs predating this marker).
|
|
20
|
+
* `runRecipeInstall` writes one on every fresh install so new recipes start
|
|
21
|
+
* disabled per the wave2 plan's safety story; user runs `patchwork recipe
|
|
22
|
+
* enable <name>` to remove it.
|
|
23
|
+
*/
|
|
24
|
+
const DISABLED_MARKER = ".disabled";
|
|
25
|
+
/**
|
|
26
|
+
* Reject path components that aren't a single safe basename — used at every
|
|
27
|
+
* boundary where externally-sourced filenames are joined onto a trusted
|
|
28
|
+
* directory (manifest fields, GitHub API responses, CLI args).
|
|
29
|
+
*
|
|
30
|
+
* Rejects empty/".."/".", any path separator, and control chars (NUL/newline/tab).
|
|
31
|
+
* Exported for testing and reuse.
|
|
32
|
+
*/
|
|
33
|
+
export function isSafeBasename(name) {
|
|
34
|
+
if (typeof name !== "string" || name.length === 0)
|
|
35
|
+
return false;
|
|
36
|
+
if (name === "." || name === "..")
|
|
37
|
+
return false;
|
|
38
|
+
if (name.includes("/") || name.includes("\\"))
|
|
39
|
+
return false;
|
|
40
|
+
if (/[\x00-\x1F\x7F]/.test(name))
|
|
41
|
+
return false;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
17
44
|
/**
|
|
18
45
|
* Parse a user-supplied source string into a typed InstallSource.
|
|
19
46
|
*
|
|
20
47
|
* Supported forms:
|
|
21
48
|
* github:owner/repo
|
|
49
|
+
* github:owner/repo@<ref> — pin to branch, tag, or commit SHA
|
|
22
50
|
* github:owner/repo/subdir
|
|
51
|
+
* github:owner/repo/subdir@<ref>
|
|
52
|
+
* gh:owner/repo[@<ref>] — short alias for github:
|
|
23
53
|
* https://github.com/owner/repo
|
|
24
|
-
* https://github.com/owner/repo/tree
|
|
54
|
+
* https://github.com/owner/repo/tree/<ref>/subdir — ref captured from URL
|
|
25
55
|
* ./relative/path
|
|
26
56
|
* /absolute/path
|
|
57
|
+
*
|
|
58
|
+
* `@<ref>` accepts any value that's valid as a git ref (branch, tag, SHA).
|
|
59
|
+
* Empty ref (`...@`) is rejected.
|
|
27
60
|
*/
|
|
28
61
|
export function parseInstallSource(source) {
|
|
29
62
|
// Local path: starts with . or /
|
|
@@ -32,28 +65,59 @@ export function parseInstallSource(source) {
|
|
|
32
65
|
source.startsWith("../")) {
|
|
33
66
|
return { type: "local", path: source };
|
|
34
67
|
}
|
|
35
|
-
// github: prefix
|
|
68
|
+
// github:/gh: prefix
|
|
36
69
|
if (source.startsWith("github:")) {
|
|
37
70
|
return parseGithubShorthand(source.slice("github:".length));
|
|
38
71
|
}
|
|
39
|
-
|
|
40
|
-
|
|
72
|
+
if (source.startsWith("gh:")) {
|
|
73
|
+
return parseGithubShorthand(source.slice("gh:".length));
|
|
74
|
+
}
|
|
75
|
+
// Full GitHub URL — captures owner, repo, optional ref (tree/<ref>), optional subdir
|
|
76
|
+
const githubUrlMatch = source.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?(?:\/tree\/([^/]+)(?:\/(.+))?)?\/?$/);
|
|
41
77
|
if (githubUrlMatch) {
|
|
42
|
-
const [, owner, repo, subdir] = githubUrlMatch;
|
|
78
|
+
const [, owner, repo, ref, subdir] = githubUrlMatch;
|
|
43
79
|
if (!owner || !repo) {
|
|
44
80
|
throw new Error(`Invalid GitHub URL: ${source}`);
|
|
45
81
|
}
|
|
46
82
|
return {
|
|
47
83
|
type: "github",
|
|
48
84
|
owner,
|
|
49
|
-
repo
|
|
85
|
+
repo,
|
|
50
86
|
...(subdir ? { subdir } : {}),
|
|
87
|
+
...(ref ? { ref } : {}),
|
|
51
88
|
};
|
|
52
89
|
}
|
|
53
90
|
throw new Error(`Unrecognized install source: "${source}"\n` +
|
|
54
|
-
`Supported: github:owner/repo, github:owner/repo/subdir, https://github.com/owner/repo, ./local/path`);
|
|
91
|
+
`Supported: github:owner/repo[@ref], github:owner/repo/subdir[@ref], gh:owner/repo[@ref], https://github.com/owner/repo, ./local/path`);
|
|
55
92
|
}
|
|
93
|
+
// ---------------------------------------------------------------------
|
|
94
|
+
// BEGIN A-PR2 EDIT BLOCK — `parseGithubShorthand` strict validation
|
|
95
|
+
// (dogfood R2 M-2). Owner/repo segments are validated against GitHub's own
|
|
96
|
+
// rules (alphanumeric or hyphen/dot/underscore, max 39 chars, must start
|
|
97
|
+
// alphanumeric) so injection attempts via shorthand (`gh:foo@bar:baz/repo`,
|
|
98
|
+
// `gh:owner/<repo>?evil=1`) are rejected before reaching the URL builder.
|
|
99
|
+
// Refs reject userinfo (`@`) and port markers (`:`) — these would otherwise
|
|
100
|
+
// land inside the constructed `https://github.com/.../tree/<ref>/...` URL.
|
|
101
|
+
// ---------------------------------------------------------------------
|
|
102
|
+
const GITHUB_OWNER_REPO_RE = /^[a-zA-Z0-9](?:[a-zA-Z0-9-._]{0,38})$/;
|
|
56
103
|
function parseGithubShorthand(shorthand) {
|
|
104
|
+
// Extract trailing @<ref> if present. The ref is opaque to us — git accepts
|
|
105
|
+
// branches, tags, and commit SHAs in the same slot, and the GitHub API
|
|
106
|
+
// (which is what we ultimately call with this value) does too.
|
|
107
|
+
let ref;
|
|
108
|
+
const atIdx = shorthand.lastIndexOf("@");
|
|
109
|
+
if (atIdx !== -1) {
|
|
110
|
+
ref = shorthand.slice(atIdx + 1);
|
|
111
|
+
shorthand = shorthand.slice(0, atIdx);
|
|
112
|
+
if (!ref) {
|
|
113
|
+
throw new Error(`Invalid github shorthand: empty ref after "@" in "${shorthand}@"`);
|
|
114
|
+
}
|
|
115
|
+
// Reject embedded URL syntax that would corrupt the constructed
|
|
116
|
+
// https://github.com/<owner>/<repo>/tree/<ref> URL (R2 M-2).
|
|
117
|
+
if (/[@:?#\s]/.test(ref) || ref.includes("..")) {
|
|
118
|
+
throw new Error(`Invalid github shorthand: ref "${ref}" contains disallowed characters`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
57
121
|
// owner/repo or owner/repo/subdir (may have multiple path segments)
|
|
58
122
|
const parts = shorthand.split("/");
|
|
59
123
|
if (parts.length < 2) {
|
|
@@ -63,13 +127,29 @@ function parseGithubShorthand(shorthand) {
|
|
|
63
127
|
if (!owner || !repo) {
|
|
64
128
|
throw new Error(`Invalid github shorthand: "${shorthand}"`);
|
|
65
129
|
}
|
|
130
|
+
if (!GITHUB_OWNER_REPO_RE.test(owner)) {
|
|
131
|
+
throw new Error(`Invalid github shorthand: owner "${owner}" is not a valid GitHub username`);
|
|
132
|
+
}
|
|
133
|
+
if (!GITHUB_OWNER_REPO_RE.test(repo)) {
|
|
134
|
+
throw new Error(`Invalid github shorthand: repo "${repo}" is not a valid GitHub repository name`);
|
|
135
|
+
}
|
|
136
|
+
// Subdir segments: each must be a safe path component (no traversal, no
|
|
137
|
+
// control chars). Reuses `isSafeBasename` for consistency with the post-fetch
|
|
138
|
+
// file boundary check.
|
|
139
|
+
for (const seg of subdirParts) {
|
|
140
|
+
if (!isSafeBasename(seg)) {
|
|
141
|
+
throw new Error(`Invalid github shorthand: subdir segment "${seg}" is unsafe`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
66
144
|
return {
|
|
67
145
|
type: "github",
|
|
68
146
|
owner,
|
|
69
147
|
repo,
|
|
70
148
|
...(subdirParts.length > 0 ? { subdir: subdirParts.join("/") } : {}),
|
|
149
|
+
...(ref ? { ref } : {}),
|
|
71
150
|
};
|
|
72
151
|
}
|
|
152
|
+
// END A-PR2 EDIT BLOCK
|
|
73
153
|
// ============================================================================
|
|
74
154
|
// Install name determination
|
|
75
155
|
// ============================================================================
|
|
@@ -93,7 +173,47 @@ export function determineInstallName(manifest, source) {
|
|
|
93
173
|
// ============================================================================
|
|
94
174
|
// GitHub file fetching via API
|
|
95
175
|
// ============================================================================
|
|
96
|
-
|
|
176
|
+
// ---------------------------------------------------------------------
|
|
177
|
+
// BEGIN A-PR2 EDIT BLOCK — `httpsGet` redirect chain hardening
|
|
178
|
+
// (dogfood R2 I-2). Redirect targets must (1) be one of GitHub's known hosts
|
|
179
|
+
// and (2) clear the SSRF guard. Hop count capped at 5 to bound the chain.
|
|
180
|
+
// Origin is also validated up-front: this helper is reached only after
|
|
181
|
+
// `parseGithubShorthand` / GitHub URL parsing, so all callers should already
|
|
182
|
+
// be pointed at github.com / api.github.com / raw.githubusercontent.com.
|
|
183
|
+
// ---------------------------------------------------------------------
|
|
184
|
+
const GITHUB_REDIRECT_HOSTS = new Set([
|
|
185
|
+
"github.com",
|
|
186
|
+
"www.github.com",
|
|
187
|
+
"api.github.com",
|
|
188
|
+
"raw.githubusercontent.com",
|
|
189
|
+
"codeload.github.com",
|
|
190
|
+
"objects.githubusercontent.com",
|
|
191
|
+
"media.githubusercontent.com",
|
|
192
|
+
]);
|
|
193
|
+
const HTTPS_GET_MAX_REDIRECTS = 5;
|
|
194
|
+
function isAllowedGithubHost(hostname) {
|
|
195
|
+
return GITHUB_REDIRECT_HOSTS.has(hostname.toLowerCase());
|
|
196
|
+
}
|
|
197
|
+
async function httpsGet(url, hops = 0) {
|
|
198
|
+
// Lazy-load the SSRF guard so test harnesses that mock https.get don't have
|
|
199
|
+
// to also stub DNS — the guard fast-paths public hostnames anyway.
|
|
200
|
+
const { isPrivateHost } = await import("../ssrfGuard.js");
|
|
201
|
+
let parsed;
|
|
202
|
+
try {
|
|
203
|
+
parsed = new URL(url);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
throw new Error(`Invalid URL: ${url}`);
|
|
207
|
+
}
|
|
208
|
+
if (parsed.protocol !== "https:") {
|
|
209
|
+
throw new Error(`Refusing non-https URL: ${url}`);
|
|
210
|
+
}
|
|
211
|
+
if (!isAllowedGithubHost(parsed.hostname)) {
|
|
212
|
+
throw new Error(`Refusing redirect to non-GitHub host "${parsed.hostname}"`);
|
|
213
|
+
}
|
|
214
|
+
if (isPrivateHost(parsed.hostname)) {
|
|
215
|
+
throw new Error(`Refusing redirect to private host "${parsed.hostname}"`);
|
|
216
|
+
}
|
|
97
217
|
return new Promise((resolve, reject) => {
|
|
98
218
|
const req = https.get(url, {
|
|
99
219
|
headers: {
|
|
@@ -101,12 +221,32 @@ async function httpsGet(url) {
|
|
|
101
221
|
Accept: "application/vnd.github.v3+json",
|
|
102
222
|
},
|
|
103
223
|
}, (res) => {
|
|
104
|
-
// Follow redirects
|
|
224
|
+
// Follow redirects — bounded chain, allowlisted host, SSRF-guarded.
|
|
105
225
|
if (res.statusCode &&
|
|
106
226
|
res.statusCode >= 300 &&
|
|
107
227
|
res.statusCode < 400 &&
|
|
108
228
|
res.headers.location) {
|
|
109
|
-
|
|
229
|
+
if (hops >= HTTPS_GET_MAX_REDIRECTS) {
|
|
230
|
+
reject(new Error(`Too many redirects (>${HTTPS_GET_MAX_REDIRECTS})`));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
// Resolve relative redirects against the current URL so a relative
|
|
234
|
+
// `Location: /foo` doesn't get treated as an empty hostname.
|
|
235
|
+
let nextUrl;
|
|
236
|
+
try {
|
|
237
|
+
nextUrl = new URL(res.headers.location, url);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
reject(new Error(`Invalid redirect location: "${res.headers.location}"`));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (nextUrl.protocol !== "https:") {
|
|
244
|
+
reject(new Error(`Refusing redirect to non-https protocol: "${nextUrl.protocol}"`));
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
httpsGet(nextUrl.toString(), hops + 1)
|
|
248
|
+
.then(resolve)
|
|
249
|
+
.catch(reject);
|
|
110
250
|
return;
|
|
111
251
|
}
|
|
112
252
|
if (res.statusCode && res.statusCode >= 400) {
|
|
@@ -149,8 +289,20 @@ async function downloadGitHubDir(owner, repo, dirPath, ref, destDir) {
|
|
|
149
289
|
}
|
|
150
290
|
if (!item.download_url)
|
|
151
291
|
continue;
|
|
292
|
+
// GitHub Contents API responses are not implicitly trusted: a hostile
|
|
293
|
+
// repo (or a redirect-to-attacker) could supply names like `../etc/x`.
|
|
294
|
+
// The existing extension filter above already blocks the most obvious
|
|
295
|
+
// payloads, but we explicitly reject anything that isn't a single
|
|
296
|
+
// basename so a future change to the filter doesn't reopen the gap.
|
|
297
|
+
if (!isSafeBasename(item.name)) {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
152
300
|
const content = await fetchGitHubFile(item.download_url);
|
|
153
301
|
const destPath = path.join(destDir, item.name);
|
|
302
|
+
// Belt-and-suspenders: confirm the resolved write path lives inside destDir.
|
|
303
|
+
if (!path.resolve(destPath).startsWith(`${path.resolve(destDir)}${path.sep}`)) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
154
306
|
writeFileSync(destPath, content);
|
|
155
307
|
written.push(item.name);
|
|
156
308
|
}
|
|
@@ -195,9 +347,25 @@ export async function runRecipeInstall(rawSource, options = {}) {
|
|
|
195
347
|
}
|
|
196
348
|
const installName = determineInstallName(manifest, source);
|
|
197
349
|
const installDir = path.join(recipesDir, installName);
|
|
198
|
-
|
|
199
|
-
|
|
350
|
+
// Reinstall correctness: detect whether this is an upgrade in place,
|
|
351
|
+
// and snapshot the existing enabled state so the upgrade doesn't
|
|
352
|
+
// silently re-disable a recipe the user explicitly opted into.
|
|
353
|
+
const isReinstall = existsSync(installDir);
|
|
354
|
+
const wasEnabled = isReinstall
|
|
355
|
+
? !existsSync(path.join(installDir, DISABLED_MARKER))
|
|
356
|
+
: false;
|
|
357
|
+
if (isReinstall) {
|
|
358
|
+
// Clear stale files from the previous version so files dropped from
|
|
359
|
+
// the new manifest don't linger. We rebuild the install dir wholesale
|
|
360
|
+
// rather than overlay the new files on top of the old.
|
|
361
|
+
try {
|
|
362
|
+
rmSync(installDir, { recursive: true, force: true });
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
// best-effort; mkdirSync below will throw with a clearer error
|
|
366
|
+
}
|
|
200
367
|
}
|
|
368
|
+
mkdirSync(installDir, { recursive: true });
|
|
201
369
|
// Copy files
|
|
202
370
|
for (const file of filesToCopy) {
|
|
203
371
|
const src = path.join(tmpDir, file);
|
|
@@ -209,6 +377,14 @@ export async function runRecipeInstall(rawSource, options = {}) {
|
|
|
209
377
|
}
|
|
210
378
|
cpSync(src, dest);
|
|
211
379
|
}
|
|
380
|
+
// Write the disabled-marker policy:
|
|
381
|
+
// - Fresh install: start disabled (per the wave2 plan's safety story).
|
|
382
|
+
// - Reinstall (upgrade in place): preserve whatever the user had set.
|
|
383
|
+
// If the recipe was enabled before, leave it enabled; if disabled,
|
|
384
|
+
// leave it disabled. Don't silently revoke an explicit user opt-in.
|
|
385
|
+
if (!isReinstall || !wasEnabled) {
|
|
386
|
+
writeFileSync(path.join(installDir, DISABLED_MARKER), "");
|
|
387
|
+
}
|
|
212
388
|
return {
|
|
213
389
|
name: installName,
|
|
214
390
|
version: manifest?.version,
|
|
@@ -256,6 +432,143 @@ async function stageGitHubSource(source, tmpDir) {
|
|
|
256
432
|
throw err;
|
|
257
433
|
}
|
|
258
434
|
}
|
|
435
|
+
/**
|
|
436
|
+
* Returns true if the install dir does not contain the disabled marker.
|
|
437
|
+
* Recipes installed before this marker existed have no marker and are
|
|
438
|
+
* therefore considered enabled — preserves backwards compatibility.
|
|
439
|
+
*/
|
|
440
|
+
export function isRecipeEnabled(installDir) {
|
|
441
|
+
return !existsSync(path.join(installDir, DISABLED_MARKER));
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Locate an installed recipe directory by name. Returns null if not found.
|
|
445
|
+
*
|
|
446
|
+
* Validates `name` is a safe basename to defend against `recipe enable
|
|
447
|
+
* ../../../etc/foo` and similar — even though the on-disk effect would be
|
|
448
|
+
* limited to the `.disabled` filename, an arbitrary-path file write under
|
|
449
|
+
* the user's privilege is still a real attack surface.
|
|
450
|
+
*/
|
|
451
|
+
function findInstalledRecipeDir(name, recipesDir) {
|
|
452
|
+
if (!isSafeBasename(name)) {
|
|
453
|
+
throw new Error(`Invalid recipe name "${name}" — must be a single directory name without path separators or control characters.`);
|
|
454
|
+
}
|
|
455
|
+
const direct = path.join(recipesDir, name);
|
|
456
|
+
// Defense-in-depth: even with the basename check above, confirm the resolved
|
|
457
|
+
// path lives under recipesDir. Symlinks inside recipesDir could in principle
|
|
458
|
+
// escape, so this catches that too.
|
|
459
|
+
const resolvedRoot = path.resolve(recipesDir);
|
|
460
|
+
const resolvedDir = path.resolve(direct);
|
|
461
|
+
if (!resolvedDir.startsWith(`${resolvedRoot}${path.sep}`)) {
|
|
462
|
+
throw new Error(`Resolved recipe path escapes recipes directory: "${name}"`);
|
|
463
|
+
}
|
|
464
|
+
if (existsSync(direct) && statSync(direct).isDirectory()) {
|
|
465
|
+
return direct;
|
|
466
|
+
}
|
|
467
|
+
return null;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Resolve an install-dir-name (the directory `runRecipeInstall` created) to
|
|
471
|
+
* the YAML entrypoint inside it. Used by `recipe run <name>` so the user can
|
|
472
|
+
* pass the name they see in `recipe list` rather than having to dig into the
|
|
473
|
+
* install directory layout.
|
|
474
|
+
*
|
|
475
|
+
* Resolution order:
|
|
476
|
+
* 1. `recipe.json` manifest's `recipes.main`, if the manifest exists and
|
|
477
|
+
* the file it points at exists on disk.
|
|
478
|
+
* 2. First `*.yaml` / `*.yml` in the install dir.
|
|
479
|
+
*
|
|
480
|
+
* Returns null if `name` doesn't correspond to an install dir, or the dir
|
|
481
|
+
* exists but contains no resolvable entrypoint. Path-traversal `name` values
|
|
482
|
+
* (e.g. `../../etc`) throw via the underlying `findInstalledRecipeDir` —
|
|
483
|
+
* same defence as enable/disable/uninstall.
|
|
484
|
+
*/
|
|
485
|
+
export function findInstalledRecipeEntrypoint(name, options = {}) {
|
|
486
|
+
const recipesDir = options.recipesDir ?? INSTALL_RECIPES_DIR;
|
|
487
|
+
const installDir = findInstalledRecipeDir(name, recipesDir);
|
|
488
|
+
if (!installDir)
|
|
489
|
+
return null;
|
|
490
|
+
const manifestPath = path.join(installDir, "recipe.json");
|
|
491
|
+
if (existsSync(manifestPath)) {
|
|
492
|
+
try {
|
|
493
|
+
const m = JSON.parse(readFileSync(manifestPath, "utf-8"));
|
|
494
|
+
if (m.recipes?.main && isSafeBasename(m.recipes.main)) {
|
|
495
|
+
const candidate = path.join(installDir, m.recipes.main);
|
|
496
|
+
if (existsSync(candidate))
|
|
497
|
+
return candidate;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// Malformed manifest → fall through to first-yaml lookup. The
|
|
502
|
+
// scheduler does the same; surfacing the parse error here would
|
|
503
|
+
// shadow the top-level "recipe not found" error from the CLI.
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
try {
|
|
507
|
+
for (const entry of readdirSync(installDir)) {
|
|
508
|
+
if (/\.ya?ml$/i.test(entry)) {
|
|
509
|
+
return path.join(installDir, entry);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
// unreadable
|
|
515
|
+
}
|
|
516
|
+
return null;
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Enable a recipe — removes the .disabled marker so triggers can fire.
|
|
520
|
+
* Idempotent: enabling an already-enabled recipe is a no-op.
|
|
521
|
+
*/
|
|
522
|
+
export function runRecipeEnable(name, options = {}) {
|
|
523
|
+
const recipesDir = options.recipesDir ?? INSTALL_RECIPES_DIR;
|
|
524
|
+
const installDir = findInstalledRecipeDir(name, recipesDir);
|
|
525
|
+
if (!installDir) {
|
|
526
|
+
throw new Error(`No installed recipe named "${name}". Run \`patchwork recipe list\` to see installed recipes.`);
|
|
527
|
+
}
|
|
528
|
+
const markerPath = path.join(installDir, DISABLED_MARKER);
|
|
529
|
+
if (!existsSync(markerPath)) {
|
|
530
|
+
return { name, installDir, alreadyEnabled: true };
|
|
531
|
+
}
|
|
532
|
+
unlinkSync(markerPath);
|
|
533
|
+
return { name, installDir, alreadyEnabled: false };
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Disable a recipe — writes the .disabled marker so triggers stop firing.
|
|
537
|
+
* Idempotent: disabling an already-disabled recipe is a no-op.
|
|
538
|
+
*/
|
|
539
|
+
export function runRecipeDisable(name, options = {}) {
|
|
540
|
+
const recipesDir = options.recipesDir ?? INSTALL_RECIPES_DIR;
|
|
541
|
+
const installDir = findInstalledRecipeDir(name, recipesDir);
|
|
542
|
+
if (!installDir) {
|
|
543
|
+
throw new Error(`No installed recipe named "${name}". Run \`patchwork recipe list\` to see installed recipes.`);
|
|
544
|
+
}
|
|
545
|
+
const markerPath = path.join(installDir, DISABLED_MARKER);
|
|
546
|
+
if (existsSync(markerPath)) {
|
|
547
|
+
return { name, installDir, alreadyDisabled: true };
|
|
548
|
+
}
|
|
549
|
+
writeFileSync(markerPath, "");
|
|
550
|
+
return { name, installDir, alreadyDisabled: false };
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Uninstall a recipe — removes its install directory entirely.
|
|
554
|
+
*
|
|
555
|
+
* Returns `{ ok: false, error }` when the recipe isn't found rather than
|
|
556
|
+
* throwing, so the CLI can surface a clean error message instead of a
|
|
557
|
+
* stack trace. Path-traversal attempts in `name` still throw via
|
|
558
|
+
* `findInstalledRecipeDir`'s validator (HIGH-2 hardening from #46).
|
|
559
|
+
*/
|
|
560
|
+
export function runRecipeUninstall(name, options = {}) {
|
|
561
|
+
const recipesDir = options.recipesDir ?? INSTALL_RECIPES_DIR;
|
|
562
|
+
const installDir = findInstalledRecipeDir(name, recipesDir);
|
|
563
|
+
if (!installDir) {
|
|
564
|
+
return {
|
|
565
|
+
ok: false,
|
|
566
|
+
error: `No installed recipe named "${name}". Run \`patchwork recipe list\` to see installed recipes.`,
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
rmSync(installDir, { recursive: true, force: true });
|
|
570
|
+
return { ok: true, installDir };
|
|
571
|
+
}
|
|
259
572
|
export function listInstalledRecipes(options = {}) {
|
|
260
573
|
const recipesDir = options.recipesDir ?? INSTALL_RECIPES_DIR;
|
|
261
574
|
if (!existsSync(recipesDir)) {
|
|
@@ -278,6 +591,7 @@ export function listInstalledRecipes(options = {}) {
|
|
|
278
591
|
connectors: manifest.connectors,
|
|
279
592
|
mainRecipe: manifest.recipes.main,
|
|
280
593
|
hasManifest: true,
|
|
594
|
+
enabled: isRecipeEnabled(itemPath),
|
|
281
595
|
});
|
|
282
596
|
}
|
|
283
597
|
else {
|
|
@@ -287,6 +601,7 @@ export function listInstalledRecipes(options = {}) {
|
|
|
287
601
|
name: entryName,
|
|
288
602
|
yamlFiles,
|
|
289
603
|
hasManifest: false,
|
|
604
|
+
enabled: isRecipeEnabled(itemPath),
|
|
290
605
|
});
|
|
291
606
|
}
|
|
292
607
|
else {
|
|
@@ -310,6 +625,7 @@ export function printInstallResult(result) {
|
|
|
310
625
|
if (result.manifest?.connectors && result.manifest.connectors.length > 0) {
|
|
311
626
|
console.log(` Requires connectors: ${result.manifest.connectors.join(", ")}`);
|
|
312
627
|
}
|
|
628
|
+
console.log(` Status: disabled (run \`patchwork recipe enable ${result.name}\` to activate scheduled triggers)`);
|
|
313
629
|
const mainRecipe = result.manifest?.recipes.main ?? result.filesInstalled[0];
|
|
314
630
|
if (mainRecipe) {
|
|
315
631
|
console.log(` Run with: patchwork recipe run ${path.join(result.installDir, mainRecipe)}`);
|
|
@@ -322,17 +638,18 @@ export function printInstalledList(entries) {
|
|
|
322
638
|
}
|
|
323
639
|
const maxName = Math.max(...entries.map((e) => e.name.length), 4);
|
|
324
640
|
const maxVersion = Math.max(...entries.map((e) => (e.version ?? "—").length), 7);
|
|
325
|
-
const header = `${"Name".padEnd(maxName)} ${"Version".padEnd(maxVersion)} Description / Files`;
|
|
641
|
+
const header = `${"Name".padEnd(maxName)} ${"Version".padEnd(maxVersion)} Status Description / Files`;
|
|
326
642
|
console.log(header);
|
|
327
643
|
console.log("-".repeat(Math.min(header.length, 100)));
|
|
328
644
|
for (const entry of entries) {
|
|
329
645
|
const version = (entry.version ?? "—").padEnd(maxVersion);
|
|
646
|
+
const status = (entry.enabled ? "enabled" : "disabled").padEnd(8);
|
|
330
647
|
const detail = entry.hasManifest
|
|
331
648
|
? (entry.description ?? "")
|
|
332
649
|
: `[${(entry.yamlFiles ?? []).join(", ")}]`;
|
|
333
|
-
console.log(`${entry.name.padEnd(maxName)} ${version} ${detail}`);
|
|
650
|
+
console.log(`${entry.name.padEnd(maxName)} ${version} ${status} ${detail}`);
|
|
334
651
|
if (entry.connectors && entry.connectors.length > 0) {
|
|
335
|
-
console.log(`${"".padEnd(maxName)} ${"".padEnd(maxVersion)} connectors: ${entry.connectors.join(", ")}`);
|
|
652
|
+
console.log(`${"".padEnd(maxName)} ${"".padEnd(maxVersion)} ${"".padEnd(8)} connectors: ${entry.connectors.join(", ")}`);
|
|
336
653
|
}
|
|
337
654
|
}
|
|
338
655
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipeInstall.js","sourceRoot":"","sources":["../../src/commands/recipeInstall.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recipeInstall.js","sourceRoot":"","sources":["../../src/commands/recipeInstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,MAAM,EACN,UAAU,EACV,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,aAAa,GAEd,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAC1C,EAAE,CAAC,OAAO,EAAE,EACZ,YAAY,EACZ,SAAS,CACV,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,WAAW,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,IAAI,CAAC;AACd,CAAC;AAuBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,iCAAiC;IACjC,IACE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EACxB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzC,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,qFAAqF;IACrF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CACjC,yFAAyF,CAC1F,CAAC;IACF,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC;QACpD,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK;YACL,IAAI;YACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iCAAiC,MAAM,KAAK;QAC1C,sIAAsI,CACzI,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,oEAAoE;AACpE,2EAA2E;AAC3E,yEAAyE;AACzE,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AAErE,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,4EAA4E;IAC5E,uEAAuE;IACvE,+DAA+D;IAC/D,IAAI,GAAuB,CAAC;IAC5B,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACjC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CACb,qDAAqD,SAAS,IAAI,CACnE,CAAC;QACJ,CAAC;QACD,gEAAgE;QAChE,6DAA6D;QAC7D,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kCAAkC,GAAG,kCAAkC,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,6BAA6B,SAAS,iDAAiD,CACxF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,GAAG,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,kCAAkC,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,mCAAmC,IAAI,yCAAyC,CACjF,CAAC;IACJ,CAAC;IACD,wEAAwE;IACxE,8EAA8E;IAC9E,uBAAuB;IACvB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,6CAA6C,GAAG,aAAa,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK;QACL,IAAI;QACJ,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC;AACD,uBAAuB;AAEvB,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAA+B,EAC/B,MAAqB;IAErB,IAAI,QAAQ,EAAE,CAAC;QACb,2EAA2E;QAC3E,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,wEAAwE;AACxE,+DAA+D;AAC/D,6EAA6E;AAC7E,0EAA0E;AAC1E,uEAAuE;AACvE,6EAA6E;AAC7E,yEAAyE;AACzE,wEAAwE;AACxE,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAS;IAC5C,YAAY;IACZ,gBAAgB;IAChB,gBAAgB;IAChB,2BAA2B;IAC3B,qBAAqB;IACrB,+BAA+B;IAC/B,6BAA6B;CAC9B,CAAC,CAAC;AACH,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,OAAO,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAI,GAAG,CAAC;IAC3C,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC1D,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,yCAAyC,MAAM,CAAC,QAAQ,GAAG,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CACnB,GAAG,EACH;YACE,OAAO,EAAE;gBACP,YAAY,EAAE,gCAAgC;gBAC9C,MAAM,EAAE,gCAAgC;aACzC;SACF,EACD,CAAC,GAAG,EAAE,EAAE;YACN,oEAAoE;YACpE,IACE,GAAG,CAAC,UAAU;gBACd,GAAG,CAAC,UAAU,IAAI,GAAG;gBACrB,GAAG,CAAC,UAAU,GAAG,GAAG;gBACpB,GAAG,CAAC,OAAO,CAAC,QAAQ,EACpB,CAAC;gBACD,IAAI,IAAI,IAAI,uBAAuB,EAAE,CAAC;oBACpC,MAAM,CACJ,IAAI,KAAK,CAAC,wBAAwB,uBAAuB,GAAG,CAAC,CAC9D,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,mEAAmE;gBACnE,6DAA6D;gBAC7D,IAAI,OAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAC/C,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CACJ,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAClE,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,CACJ,IAAI,KAAK,CACP,6CAA6C,OAAO,CAAC,QAAQ,GAAG,CACjE,CACF,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC;qBACnC,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,UAAU,aAAa,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACpD,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAUD,KAAK,UAAU,kBAAkB,CAC/B,KAAa,EACb,IAAY,EACZ,OAAe,EACf,GAAW;IAEX,MAAM,GAAG,GAAG,gCAAgC,KAAK,IAAI,IAAI,aAAa,OAAO,QAAQ,GAAG,EAAE,CAAC;IAC3F,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAY,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,iDAAiD,OAAO,MAAM,EAAE,CACjE,CAAC;IACJ,CAAC;IACD,OAAO,MAA6B,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,KAAa,EACb,IAAY,EACZ,OAAe,EACf,GAAW,EACX,OAAe;IAEf,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACnC,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,SAAS;QACjC,sEAAsE;QACtE,uEAAuE;QACvE,sEAAsE;QACtE,kEAAkE;QAClE,oEAAoE;QACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,6EAA6E;QAC7E,IACE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EACzE,CAAC;YACD,SAAS;QACX,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAcD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,UAAmC,EAAE;IAErC,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAE7D,4BAA4B;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAED,2BAA2B;QAC3B,IAAI,QAAQ,GAA0B,IAAI,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,gCAAgC;QAChC,IAAI,WAAqB,CAAC;QAC1B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAClD,qEAAqE;YACrE,WAAW,GAAG,CAAC,aAAa,EAAE,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CACjC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,yCAAyC;YACzC,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,oCAAoC,SAAS,KAAK;gBAChD,sDAAsD,CACzD,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEtD,qEAAqE;QACrE,iEAAiE;QACjE,+DAA+D;QAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YACrD,CAAC,CAAC,KAAK,CAAC;QAEV,IAAI,WAAW,EAAE,CAAC;YAChB,oEAAoE;YACpE,sEAAsE;YACtE,uDAAuD;YACvD,IAAI,CAAC;gBACH,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,+DAA+D;YACjE,CAAC;QACH,CAAC;QACD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,aAAa;QACb,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACzC,uEAAuE;YACvE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,oCAAoC;QACpC,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ,EAAE,OAAO;YAC1B,UAAU;YACV,cAAc,EAAE,WAAW;YAC3B,QAAQ;SACT,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAA0B,EAC1B,MAAc;IAEd,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,MAA2B,EAC3B,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mCAAmC;QACnC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,iBAAiB,CACrB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,IAAI,EACX,OAAO,EACP,QAAQ,EACR,MAAM,CACP,CAAC;gBACF,OAAO;YACT,CAAC;YAAC,MAAM,CAAC;gBACP,iCAAiC;YACnC,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAiBD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAC7B,IAAY,EACZ,UAAkB;IAElB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,oFAAoF,CACjH,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3C,6EAA6E;IAC7E,6EAA6E;IAC7E,oCAAoC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CACb,oDAAoD,IAAI,GAAG,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACzD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAEvD,CAAC;YACF,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxD,IAAI,UAAU,CAAC,SAAS,CAAC;oBAAE,OAAO,SAAS,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;YAC9D,gEAAgE;YAChE,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5C,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,aAAa;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,4DAA4D,CAC/F,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;IACpD,CAAC;IACD,UAAU,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,4DAA4D,CAC/F,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,aAAa,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,8BAA8B,IAAI,4DAA4D;SACtG,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAmC,EAAE;IAErC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAE7D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,SAAS,OAAO,CAAC,GAAW,EAAE,UAAkB;QAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;YAEhD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAE/C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;oBACjC,WAAW,EAAE,IAAI;oBACjB,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC;iBACnC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACnD,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CACpB,CAAC;gBACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,SAAS;wBACf,SAAS;wBACT,WAAW,EAAE,KAAK;wBAClB,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC;qBACnC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,0DAA0D;oBAC1D,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,OAAO,CAAC,GAAG,CACT,eAAe,MAAM,CAAC,IAAI,GAAG,UAAU,OAAO,MAAM,CAAC,UAAU,EAAE,CAClE,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CACT,0BAA0B,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CACT,qDAAqD,MAAM,CAAC,IAAI,oCAAoC,CACrG,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7E,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CACT,oCAAoC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA+B;IAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CACT,2EAA2E,CAC5E,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAChD,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,iCAAiC,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW;YAC9B,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC9C,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,OAAO,KAAK,MAAM,KAAK,MAAM,EAAE,CAClE,CAAC;QAEF,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CACT,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/G,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* patchwork traces export — bundle the four local trace logs into a
|
|
3
|
+
* single round-trippable file so a user can move machines, take a
|
|
4
|
+
* compliance snapshot, or share traces with another tool without the
|
|
5
|
+
* fragile-glob ritual of finding each .jsonl by hand.
|
|
6
|
+
*
|
|
7
|
+
* Output format (Decision 1 / option A in the 2026-05-02 strategic walk-through):
|
|
8
|
+
* a single gzipped JSONL file. Line 1 is a manifest envelope; every
|
|
9
|
+
* subsequent line is a per-row envelope. Encryption is intentionally NOT
|
|
10
|
+
* in this PR — encryption is a 2-hour follow-up once we know which
|
|
11
|
+
* passphrase / KMS UX the user wants.
|
|
12
|
+
*
|
|
13
|
+
* {"type":"manifest","version":1,"exportedAt":"...","sources":[...],"counts":{...}}
|
|
14
|
+
* {"source":"runs","entry":{...one runs.jsonl row...}}
|
|
15
|
+
* {"source":"decision_traces","entry":{...one decision_traces.jsonl row...}}
|
|
16
|
+
* ...
|
|
17
|
+
*
|
|
18
|
+
* Round-trip with `gunzip -c file.jsonl.gz | jq`. Filter one source with
|
|
19
|
+
* `gunzip -c file.jsonl.gz | jq 'select(.source=="decision_traces") | .entry'`.
|
|
20
|
+
*
|
|
21
|
+
* Memory/Ecosystem strategic-plan agent (2026-05-02) flagged trace
|
|
22
|
+
* durability as the top backlog item — see
|
|
23
|
+
* `docs/strategic/2026-05-02/memory-ecosystem-report.md` items 1, 3, 12.
|
|
24
|
+
* Without this, every claim about "years of personal AI memory" is
|
|
25
|
+
* undercut by the existing 1 MB / 10 000-line silent rotation.
|
|
26
|
+
*/
|
|
27
|
+
export declare const TRACES_EXPORT_VERSION = 1;
|
|
28
|
+
/**
|
|
29
|
+
* Logical sources we bundle. Adding a new source: extend this enum, add
|
|
30
|
+
* a discoverer below, and consumer tooling that filters on source.
|
|
31
|
+
*/
|
|
32
|
+
export type TraceSource = "runs" | "decision_traces" | "commit_issue_links" | "activity";
|
|
33
|
+
export interface TracesExportOptions {
|
|
34
|
+
/** Where to write the bundle. Default: `${patchworkDir}/traces-export-{ISO}.jsonl.gz`. */
|
|
35
|
+
output?: string;
|
|
36
|
+
/** Directory containing runs.jsonl / decision_traces.jsonl / commit_issue_links.jsonl. Default: `~/.patchwork/`. */
|
|
37
|
+
patchworkDir?: string;
|
|
38
|
+
/** Directory containing `activity-{port}.jsonl` files. Default: `~/.claude/ide/`. */
|
|
39
|
+
activityDir?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface TracesExportSourceFile {
|
|
42
|
+
/** Logical source. */
|
|
43
|
+
source: TraceSource;
|
|
44
|
+
/** Absolute path read. */
|
|
45
|
+
path: string;
|
|
46
|
+
/** Number of JSONL rows successfully parsed and emitted. */
|
|
47
|
+
count: number;
|
|
48
|
+
/** Bytes read from disk. */
|
|
49
|
+
bytes: number;
|
|
50
|
+
}
|
|
51
|
+
export interface TracesExportResult {
|
|
52
|
+
/** Absolute path of the written `.jsonl.gz` bundle. */
|
|
53
|
+
outputPath: string;
|
|
54
|
+
/** ISO-8601 timestamp recorded in the manifest. */
|
|
55
|
+
exportedAt: string;
|
|
56
|
+
/** Per-source-file accounting. Multiple files possible for `activity` (one per bridge instance). */
|
|
57
|
+
files: TracesExportSourceFile[];
|
|
58
|
+
/** Total rows across all files. */
|
|
59
|
+
totalCount: number;
|
|
60
|
+
/** Total bytes read across all files. */
|
|
61
|
+
totalBytes: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Run the export. Pure function over filesystem state — no log instance
|
|
65
|
+
* handles needed, so it works headless (e.g. in CI restoring a snapshot)
|
|
66
|
+
* and during a running bridge alike (the export reads files atomically
|
|
67
|
+
* line-by-line; concurrent appends only add new rows beyond the export's
|
|
68
|
+
* point-in-time view).
|
|
69
|
+
*/
|
|
70
|
+
export declare function runTracesExport(opts?: TracesExportOptions): Promise<TracesExportResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Stream-variant of `runTracesExport` — writes gzip-compressed JSONL
|
|
73
|
+
* directly into a caller-supplied `Writable` (e.g. an HTTP response).
|
|
74
|
+
* No temp file is created; the manifest/rows are emitted in one pass.
|
|
75
|
+
*
|
|
76
|
+
* The caller is responsible for setting `Content-Type`,
|
|
77
|
+
* `Content-Encoding`, and `Content-Disposition` headers BEFORE calling
|
|
78
|
+
* this function because Node's HTTP response is not writable after headers
|
|
79
|
+
* have been flushed.
|
|
80
|
+
*
|
|
81
|
+
* Returns row/byte accounting but omits `outputPath` (no disk file).
|
|
82
|
+
*/
|
|
83
|
+
export declare function runTracesExportToStream(writable: import("node:stream").Writable, opts?: Omit<TracesExportOptions, "output">): Promise<Omit<TracesExportResult, "outputPath">>;
|