@desplega.ai/agent-swarm 1.165.0 → 1.166.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/dist/{acp-adapter-w6zws6me.js → acp-adapter-yzfxn8vj.js} +4 -4
- package/dist/{actions-jna0b3wm.js → actions-qz3m692w.js} +20 -24
- package/dist/{amp-adapter-0eve81pz.js → amp-adapter-j1xbmsqz.js} +4 -4
- package/dist/{app-75hm5cfa.js → app-43vrdmv8.js} +6 -7
- package/dist/{assistant-yzd51j33.js → assistant-ertffmka.js} +21 -25
- package/dist/{boot-reembed-z158xq32.js → boot-reembed-998jtpdg.js} +9 -12
- package/dist/{boot-reembed-2ex2mcsh.js → boot-reembed-s7k7c6v2.js} +10 -12
- package/dist/boot-scrub-sweep-nepsk4t1.js +211 -0
- package/dist/{boot-seeds-2bmnh18p.js → boot-seeds-vvzs1zhk.js} +8 -8
- package/dist/{claude-adapter-jbj1mycz.js → claude-adapter-2zvmekrp.js} +9 -11
- package/dist/{claude-managed-adapter-17ggz09t.js → claude-managed-adapter-s49wbk8t.js} +3 -3
- package/dist/{claude-managed-setup-ptm1nzm2.js → claude-managed-setup-cvhqq8qn.js} +4 -4
- package/dist/{claude-sdk-session-9re1g7r2.js → claude-sdk-session-kkbxtw5q.js} +2618 -2600
- package/dist/{cli-k6xx3pve.js → cli-0nhdwxd5.js} +4 -4
- package/dist/{cli-n9ehc28t.js → cli-0qjcsxgz.js} +4 -4
- package/dist/{cli-zn2v3t8v.js → cli-3ddybbbx.js} +1 -1
- package/dist/{cli-5anb0ev3.js → cli-3qn4r334.js} +71 -14
- package/dist/{cli-1kzfvd1z.js → cli-4r1sjfc4.js} +9 -5
- package/dist/{cli-ba66wyhy.js → cli-66zh26sp.js} +6 -6
- package/dist/{cli-9xb89xca.js → cli-68r1j4sg.js} +6 -6
- package/dist/{cli-xnzrzets.js → cli-8kgvmkak.js} +2 -2
- package/dist/{cli-28smfvbn.js → cli-8t229cmr.js} +5 -5
- package/dist/{cli-9866bd07.js → cli-aqcey741.js} +1 -1
- package/dist/{cli-90v942q1.js → cli-cpfmqz3n.js} +8 -8
- package/dist/{cli-50eg13rj.js → cli-df56tqdw.js} +459 -282
- package/dist/{cli-8gpbwy09.js → cli-dw2q9f7g.js} +5 -5
- package/dist/{cli-0n4fasz0.js → cli-ecknp7p1.js} +15 -15
- package/dist/{cli-xb3c6aat.js → cli-f2n17zhp.js} +1 -1
- package/dist/{cli-ftry7975.js → cli-feh3dkah.js} +1 -1
- package/dist/{cli-amwhs8h2.js → cli-fn697bnt.js} +2 -2
- package/dist/{cli-prt9emct.js → cli-gt8azyet.js} +3 -3
- package/dist/{cli-59jn5twa.js → cli-h3x613ze.js} +2 -2
- package/dist/{cli-mmzwwptd.js → cli-hf5s9pgf.js} +1 -1
- package/dist/cli-j2jbr8af.js +516 -0
- package/dist/{cli-wfajtmf7.js → cli-jhm6hzjn.js} +593 -10
- package/dist/{cli-xtgtyafv.js → cli-jvj6a0cv.js} +190 -439
- package/dist/{cli-hpryr6em.js → cli-mb75wpxf.js} +1 -1
- package/dist/{cli-420bdgw0.js → cli-mv2520nm.js} +1 -1
- package/dist/{cli-pjxnr1jn.js → cli-mwegs4af.js} +3 -3
- package/dist/{cli-5b2fjjzh.js → cli-p4ztb80h.js} +2 -2
- package/dist/{cli-e7t4snpa.js → cli-rggdq8wq.js} +4 -4
- package/dist/{cli-bdv39kgj.js → cli-rsy933yz.js} +5 -5
- package/dist/{cli-gh5yqzpe.js → cli-v2a8x45d.js} +2 -2
- package/dist/{cli-bns5c8k9.js → cli-vzc73wet.js} +43 -47
- package/dist/cli-wt7ccy4r.js +2654 -0
- package/dist/{cli-j0pdrmwg.js → cli-x7kpr72a.js} +3 -3
- package/dist/{cli-x7afk5wm.js → cli-xvc3q9br.js} +1 -1
- package/dist/{cli-9s3h836g.js → cli-xvdgasgy.js} +1 -1
- package/dist/{cli-zvckv750.js → cli-y59h2pk9.js} +2 -2
- package/dist/{cli-qdv8kgz7.js → cli-yshaazs1.js} +13884 -3241
- package/dist/{cli-nfygw434.js → cli-ysnyhws9.js} +2 -2
- package/dist/{cli-fw6vdcq5.js → cli-zp67qg5x.js} +34 -1
- package/dist/{cli-ma3zvh39.js → cli-zy7vwsne.js} +6066 -5829
- package/dist/cli.js +24 -20
- package/dist/{codex-adapter-3qnxshje.js → codex-adapter-dw1wxqt8.js} +7 -7
- package/dist/{codex-login-brkxhhdg.js → codex-login-terbdsqq.js} +2 -2
- package/dist/{codex-session-runner-612wnapp.js → codex-session-runner-3cgb8y1g.js} +7 -7
- package/dist/{commands-2ybfcxkj.js → commands-mhxam6z2.js} +6 -6
- package/dist/{cursor-adapter-p3jgdehv.js → cursor-adapter-2qda3st7.js} +3 -3
- package/dist/{db-f4ans0jj.js → db-sjks418k.js} +8 -6
- package/dist/{devin-adapter-dhzt01ff.js → devin-adapter-bffjj5n4.js} +2 -2
- package/dist/{dispatcher-pk182apd.js → dispatcher-1es759rn.js} +18 -22
- package/dist/{dsh-adapter-7twaeps1.js → dsh-adapter-bek4cyw9.js} +3 -3
- package/dist/{e2b-y8t3jzyz.js → e2b-nd50eccg.js} +1 -1
- package/dist/{event-bus-w7ac4n3c.js → event-bus-vnfthafg.js} +2 -2
- package/dist/{grok-adapter-yt9pab3k.js → grok-adapter-ar9cw9jg.js} +5 -5
- package/dist/{handlers-g2wnr4t9.js → handlers-1gkbhktr.js} +21 -25
- package/dist/{hook-f7jt9vnm.js → hook-ds2zxq9v.js} +14 -16
- package/dist/{hook-bbdpnkb4.js → hook-vxa3tcsy.js} +8 -10
- package/dist/{http-w40q4w94.js → http-3h21z9md.js} +247 -164
- package/dist/{index-056j5kzn.js → index-9b65j1m5.js} +8 -8
- package/dist/{index-9bfssf54.js → index-bn6cy8ps.js} +18 -22
- package/dist/{index-cj1r9q83.js → index-dkfxpkmm.js} +19 -23
- package/dist/{index-7n70jwbb.js → index-f8xnqrye.js} +19 -21
- package/dist/{index-fdk1t4d6.js → index-n0rxa4ca.js} +11962 -9900
- package/dist/{index-k8xc083e.js → index-n99fycq7.js} +18 -22
- package/dist/{keepalive-1tj10tf4.js → keepalive-3xspa9jw.js} +11 -8
- package/dist/{lead-st0bg7v4.js → lead-6qphc124.js} +34 -38
- package/dist/{maintenance-nz71zats.js → maintenance-0teem1bb.js} +7 -9
- package/dist/{node-f0ykebbv.js → node-9sg7ajby.js} +25 -7
- package/dist/{oauth-refresh-sweep-aefzwvvq.js → oauth-refresh-sweep-sh9q25xp.js} +10 -7
- package/dist/{onboard-kgpr9mbn.js → onboard-54qmnqxe.js} +2 -2
- package/dist/{opencode-adapter-0c8e70dk.js → opencode-adapter-wjfa2wvd.js} +2 -2
- package/dist/{otel-impl-x8zp4y5a.js → otel-impl-ycqzp2a1.js} +2 -2
- package/dist/{pi-mono-adapter-t280ah5c.js → pi-mono-adapter-e77e9zst.js} +4 -4
- package/dist/{pricing-refresh-9e0q7cwk.js → pricing-refresh-atnkngqs.js} +7 -7
- package/dist/{rbac-roles-kcp6zge2.js → rbac-roles-9pjphh9q.js} +6 -6
- package/dist/{rbac-roles-790j3ga8.js → rbac-roles-j78wdksm.js} +6 -6
- package/dist/{render-v2-tch4nefj.js → render-v2-pxjs49fx.js} +6 -7
- package/dist/{setup-rcm303ns.js → setup-ymej0xtx.js} +2 -2
- package/dist/{work-objects-ctg7t70w.js → work-objects-3nh4ymzb.js} +22 -26
- package/dist/{worker-5dp0xm55.js → worker-qa9fkz5s.js} +34 -38
- package/dist/{x-v3yw66zs.js → x-ma4gnfgy.js} +2 -2
- package/openapi.json +5 -2
- package/package.json +9 -5
- package/src/be/automation-preflight.ts +9 -4
- package/src/be/boot-scrub-sweep.ts +302 -0
- package/src/be/crypto/key-bootstrap.ts +1 -1
- package/src/be/db/approvals.ts +15 -1
- package/src/be/db/codex-oauth-device-flows.ts +40 -0
- package/src/be/db/config-secrets.ts +31 -0
- package/src/be/db/runtime.ts +4 -0
- package/src/be/db/script-runs.ts +15 -0
- package/src/be/db/tasks/write.ts +1 -1
- package/src/be/db-queries/mcp-oauth.ts +5 -0
- package/src/be/db-queries/oauth.ts +77 -0
- package/src/be/db.ts +162 -59
- package/src/be/events.ts +17 -1
- package/src/be/memory/index-content.ts +2 -2
- package/src/be/memory/providers/sqlite-store.ts +63 -11
- package/src/be/memory/types.ts +14 -0
- package/src/be/migrations/201_workflow_replay_columns.sql +10 -0
- package/src/be/migrations/202_codex_oauth_device_flows.sql +24 -0
- package/src/be/scripts/db.ts +28 -4
- package/src/be/scripts/source-secrets.ts +37 -0
- package/src/be/scrub-json.ts +32 -0
- package/src/be/sealed-json.ts +59 -0
- package/src/be/secret-registry.ts +131 -0
- package/src/be/workflow-replay.ts +77 -0
- package/src/http/codex-oauth-device.ts +8 -10
- package/src/http/db-query-bounded.ts +3 -0
- package/src/http/db-query-shared.ts +107 -15
- package/src/http/db-query.ts +10 -2
- package/src/http/index.ts +23 -6
- package/src/http/script-runs.ts +9 -1
- package/src/http/scripts.ts +15 -0
- package/src/http/workflows.ts +3 -2
- package/src/oauth/mcp-wrapper.ts +1 -1
- package/src/providers/acp-adapter.ts +25 -11
- package/src/providers/acp-target-catalog.ts +35 -1
- package/src/providers/acp-targets.ts +69 -3
- package/src/providers/amp-adapter.ts +1 -1
- package/src/providers/cursor-adapter.ts +1 -1
- package/src/script-workflows/supervisor.ts +11 -2
- package/src/scripts-runtime/eval-harness.ts +2 -12
- package/src/scripts-runtime/executors/quickjs-bundle.ts +152 -0
- package/src/scripts-runtime/executors/quickjs-prelude.ts +285 -0
- package/src/scripts-runtime/executors/quickjs-runner.ts +580 -0
- package/src/scripts-runtime/executors/quickjs-worker.ts +81 -0
- package/src/scripts-runtime/executors/quickjs.ts +196 -0
- package/src/scripts-runtime/executors/registry.ts +2 -0
- package/src/scripts-runtime/executors/sourcemap.ts +79 -0
- package/src/scripts-runtime/script-error-hints.ts +14 -0
- package/src/server.ts +3 -1
- package/src/tests/acp-adapter.test.ts +127 -2
- package/src/tests/boot-scrub-sweep.test.ts +390 -0
- package/src/tests/check-text-columns.test.ts +145 -0
- package/src/tests/claude-sdk-process.fixture.ts +13 -2
- package/src/tests/codex-oauth-device.test.ts +23 -37
- package/src/tests/db-query-denylist.test.ts +202 -0
- package/src/tests/db-task-read-contract.test.ts +1 -0
- package/src/tests/db-task-write-contract.test.ts +1 -0
- package/src/tests/entrypoint-acp-target-binary.test.ts +31 -1
- package/src/tests/events-scrub.test.ts +88 -0
- package/src/tests/fixtures/secret-corpus.ts +320 -0
- package/src/tests/script-connections.test.ts +5 -0
- package/src/tests/script-executor-conformance.test.ts +3 -0
- package/src/tests/script-executor-quickjs.test.ts +442 -0
- package/src/tests/script-executor-registry.test.ts +6 -1
- package/src/tests/script-runs-http.test.ts +88 -1
- package/src/tests/script-runs-scrub.test.ts +275 -0
- package/src/tests/scripts-http.test.ts +82 -1
- package/src/tests/scrubbed-text-12e.test.ts +289 -0
- package/src/tests/sealed-key-guard.test.ts +166 -0
- package/src/tests/secret-canary-sweep.test.ts +958 -0
- package/src/tests/secret-registry.test.ts +355 -0
- package/src/tests/secret-rules.test.ts +230 -0
- package/src/tests/secret-scrubber.test.ts +3 -2
- package/src/tests/workflow-replay.test.ts +518 -0
- package/src/tests/workflow-scrub.test.ts +242 -0
- package/src/tools/db-query.ts +1 -1
- package/src/tools/inject-learning.ts +1 -1
- package/src/tools/workflows/get-workflow-run.ts +3 -2
- package/src/types.ts +1 -1
- package/src/utils/secret-rules.generated.ts +2055 -0
- package/src/utils/secret-scrubber.ts +363 -29
- package/src/workflows/engine.ts +39 -4
- package/src/workflows/recovery.ts +10 -1
- package/src/workflows/resume.ts +62 -3
- package/src/workflows/retry-poller.ts +3 -0
- package/dist/boot-scrub-logs-246yn076.js +0 -99
- package/dist/cli-3a4m1aws.js +0 -572
- package/dist/cli-a87b04k8.js +0 -951
- package/dist/cli-cvk6yzw5.js +0 -40
- package/dist/cli-h1spv8v4.js +0 -427
- package/dist/cli-jqt9hrnz.js +0 -168
- package/dist/cli-yhmwmv0g.js +0 -9281
- package/src/be/boot-scrub-logs.ts +0 -132
package/src/workflows/resume.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
updateWorkflowRun,
|
|
18
18
|
updateWorkflowRunStep,
|
|
19
19
|
} from "../be/db";
|
|
20
|
+
import type { WaitStateRow } from "../types";
|
|
20
21
|
import { scrubSecrets } from "../utils/secret-scrubber";
|
|
21
22
|
import {
|
|
22
23
|
type ApprovalSlackClient,
|
|
@@ -26,7 +27,7 @@ import { shapeApprovalResolution } from "./approval-resolution";
|
|
|
26
27
|
import { loadCompletedStepRouting } from "./completed-step-routing";
|
|
27
28
|
import { FAILED_TASK_OUTPUT_PREFIX } from "./constants";
|
|
28
29
|
import { getNextTargets } from "./definition";
|
|
29
|
-
import { findReadyNodes, hasRunningStep, walkGraph } from "./engine";
|
|
30
|
+
import { failRunOnUnreadableReplay, findReadyNodes, hasRunningStep, walkGraph } from "./engine";
|
|
30
31
|
import type { WorkflowEventBus } from "./event-bus";
|
|
31
32
|
import { workflowEventBus } from "./event-bus";
|
|
32
33
|
import type { ExecutorRegistry } from "./executors/registry";
|
|
@@ -127,6 +128,23 @@ export function setupWorkflowResumeListener(
|
|
|
127
128
|
};
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Run one live resume of a waiting step. A sealed replay copy that cannot be
|
|
133
|
+
* opened fails the step and its run now, instead of logging and leaving the
|
|
134
|
+
* run `waiting` until a recovery sweep. Any other error rethrows.
|
|
135
|
+
*/
|
|
136
|
+
async function failClosedOnUnreadableReplay(
|
|
137
|
+
runId: string,
|
|
138
|
+
stepId: string,
|
|
139
|
+
resume: () => Promise<void>,
|
|
140
|
+
): Promise<void> {
|
|
141
|
+
try {
|
|
142
|
+
await resume();
|
|
143
|
+
} catch (err) {
|
|
144
|
+
if (!(await failRunOnUnreadableReplay(runId, err, stepId))) throw err;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
130
148
|
/**
|
|
131
149
|
* Resume a workflow after a linked task completes.
|
|
132
150
|
*
|
|
@@ -138,6 +156,15 @@ export function setupWorkflowResumeListener(
|
|
|
138
156
|
async function resumeFromTaskCompletion(
|
|
139
157
|
event: TaskEvent,
|
|
140
158
|
registry: ExecutorRegistry,
|
|
159
|
+
): Promise<void> {
|
|
160
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
161
|
+
resumeFromTaskCompletionUnguarded(event, registry),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async function resumeFromTaskCompletionUnguarded(
|
|
166
|
+
event: TaskEvent,
|
|
167
|
+
registry: ExecutorRegistry,
|
|
141
168
|
): Promise<void> {
|
|
142
169
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
143
170
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -245,6 +272,17 @@ async function handleTaskFailure(
|
|
|
245
272
|
reason: string,
|
|
246
273
|
registry: ExecutorRegistry,
|
|
247
274
|
options: { retryable: boolean },
|
|
275
|
+
): Promise<void> {
|
|
276
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
277
|
+
handleTaskFailureUnguarded(event, reason, registry, options),
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
async function handleTaskFailureUnguarded(
|
|
282
|
+
event: TaskEvent,
|
|
283
|
+
reason: string,
|
|
284
|
+
registry: ExecutorRegistry,
|
|
285
|
+
options: { retryable: boolean },
|
|
248
286
|
): Promise<void> {
|
|
249
287
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
250
288
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -541,6 +579,15 @@ export async function cancelWorkflowRunStep(
|
|
|
541
579
|
async function resumeFromApprovalResolution(
|
|
542
580
|
event: ApprovalEvent,
|
|
543
581
|
registry: ExecutorRegistry,
|
|
582
|
+
): Promise<void> {
|
|
583
|
+
await failClosedOnUnreadableReplay(event.workflowRunId!, event.workflowRunStepId!, () =>
|
|
584
|
+
resumeFromApprovalResolutionUnguarded(event, registry),
|
|
585
|
+
);
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
async function resumeFromApprovalResolutionUnguarded(
|
|
589
|
+
event: ApprovalEvent,
|
|
590
|
+
registry: ExecutorRegistry,
|
|
544
591
|
): Promise<void> {
|
|
545
592
|
const run = await getWorkflowRun(event.workflowRunId!);
|
|
546
593
|
if (!run || (run.status !== "waiting" && run.status !== "running")) return;
|
|
@@ -551,8 +598,6 @@ async function resumeFromApprovalResolution(
|
|
|
551
598
|
const workflow = await getWorkflow(run.workflowId);
|
|
552
599
|
if (!workflow) return;
|
|
553
600
|
|
|
554
|
-
const ctx = (run.context ?? {}) as Record<string, unknown>;
|
|
555
|
-
|
|
556
601
|
if (event.status === "cancelled") {
|
|
557
602
|
console.warn(
|
|
558
603
|
`[workflows] approval ${event.requestId} is cancelled; step ${event.workflowRunStepId} stays waiting for the run cancel path`,
|
|
@@ -560,6 +605,10 @@ async function resumeFromApprovalResolution(
|
|
|
560
605
|
return;
|
|
561
606
|
}
|
|
562
607
|
|
|
608
|
+
// Opens the sealed replay context: after the cancelled bail-out, which leaves
|
|
609
|
+
// the step to the run cancel path.
|
|
610
|
+
const ctx = (run.context ?? {}) as Record<string, unknown>;
|
|
611
|
+
|
|
563
612
|
// Output and port for the approval status. A step parked by an executor other
|
|
564
613
|
// than human-in-the-loop shapes its own (see shapeApprovalResolution).
|
|
565
614
|
const { output: stepOutput, nextPort } = shapeApprovalResolution(
|
|
@@ -643,7 +692,17 @@ export async function resumeWaitState(
|
|
|
643
692
|
if (!result.updated || !result.row) return;
|
|
644
693
|
|
|
645
694
|
const waitRow = result.row;
|
|
695
|
+
await failClosedOnUnreadableReplay(waitRow.workflowRunId, waitRow.workflowRunStepId, () =>
|
|
696
|
+
resumeClaimedWait(waitRow, status, cappedPayload, registry),
|
|
697
|
+
);
|
|
698
|
+
}
|
|
646
699
|
|
|
700
|
+
async function resumeClaimedWait(
|
|
701
|
+
waitRow: WaitStateRow,
|
|
702
|
+
status: "fired" | "timeout",
|
|
703
|
+
cappedPayload: unknown,
|
|
704
|
+
registry: ExecutorRegistry,
|
|
705
|
+
): Promise<void> {
|
|
647
706
|
// 2. Load the surrounding run + step. If anything has moved on (cancelled,
|
|
648
707
|
// failed, retried, etc.), stay quiet.
|
|
649
708
|
const run = await getWorkflowRun(waitRow.workflowRunId);
|
|
@@ -11,6 +11,7 @@ import { checkpointStep, checkpointStepFailure, checkpointStepWaiting } from "./
|
|
|
11
11
|
import { getSuccessors, resolveValidationPort } from "./definition";
|
|
12
12
|
import {
|
|
13
13
|
buildNodeInterpolationCtx,
|
|
14
|
+
failRunOnUnreadableReplay,
|
|
14
15
|
holdWorkflowRun,
|
|
15
16
|
interpolateNodeConfig,
|
|
16
17
|
rehydrateCompletedStepOutputs,
|
|
@@ -200,11 +201,13 @@ export function startRetryPoller(registry: ExecutorRegistry, intervalMs = 5000):
|
|
|
200
201
|
}
|
|
201
202
|
} catch (err) {
|
|
202
203
|
// Execution threw — treat as failure
|
|
204
|
+
if (await failRunOnUnreadableReplay(run.id, err, step.id)) continue;
|
|
203
205
|
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
204
206
|
const retryPolicy = node.retry || executor.retryPolicy;
|
|
205
207
|
await checkpointStepFailure(run.id, step.id, errorMsg, step.retryCount, retryPolicy);
|
|
206
208
|
}
|
|
207
209
|
} catch (err) {
|
|
210
|
+
if (await failRunOnUnreadableReplay(step.runId, err, step.id)) continue;
|
|
208
211
|
console.error(`[workflows] Retry failed for step ${step.id}:`, err);
|
|
209
212
|
} finally {
|
|
210
213
|
release?.();
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getDbClient,
|
|
3
|
-
init_db
|
|
4
|
-
} from "./cli-qdv8kgz7.js";
|
|
5
|
-
import"./cli-9s3h836g.js";
|
|
6
|
-
import"./cli-3qhyh31j.js";
|
|
7
|
-
import"./cli-3a4m1aws.js";
|
|
8
|
-
import"./cli-7mm2r1kp.js";
|
|
9
|
-
import"./cli-g5erf0zt.js";
|
|
10
|
-
import"./cli-dmtrxqhg.js";
|
|
11
|
-
import"./cli-tadfgd0t.js";
|
|
12
|
-
import"./cli-ywybs5as.js";
|
|
13
|
-
import"./cli-gd4favx9.js";
|
|
14
|
-
import"./cli-agamgm0p.js";
|
|
15
|
-
import"./cli-5c2j5yvx.js";
|
|
16
|
-
import"./cli-1a2j50m0.js";
|
|
17
|
-
import"./cli-f9w1semm.js";
|
|
18
|
-
import"./cli-ej6gbxfb.js";
|
|
19
|
-
import"./cli-zsh093hk.js";
|
|
20
|
-
import"./cli-sd0mxa3c.js";
|
|
21
|
-
import"./cli-w5e1d1vv.js";
|
|
22
|
-
import"./cli-1kzfvd1z.js";
|
|
23
|
-
import"./cli-zf8jjwex.js";
|
|
24
|
-
import {
|
|
25
|
-
init_secret_scrubber,
|
|
26
|
-
scrubSecrets
|
|
27
|
-
} from "./cli-h1spv8v4.js";
|
|
28
|
-
import"./cli-bc05qbss.js";
|
|
29
|
-
|
|
30
|
-
// src/be/boot-scrub-logs.ts
|
|
31
|
-
init_secret_scrubber();
|
|
32
|
-
init_db();
|
|
33
|
-
var SCRUB_KEY = "boot-scrub-logs-v2";
|
|
34
|
-
var CURSOR_KEY = "boot-scrub-logs-v2-cursor";
|
|
35
|
-
var BATCH_SIZE = 200;
|
|
36
|
-
var yieldTick = () => new Promise((r) => setTimeout(r, 5));
|
|
37
|
-
async function runBootScrubLogs() {
|
|
38
|
-
const done = await getDbClient().get("SELECT key FROM seed_state WHERE kind = ? AND key = ?", ["maintenance", SCRUB_KEY]);
|
|
39
|
-
if (done)
|
|
40
|
-
return;
|
|
41
|
-
const savedCursor = (await getDbClient().get("SELECT seededHash FROM seed_state WHERE kind = ? AND key = ?", ["maintenance", CURSOR_KEY]))?.seededHash ?? "";
|
|
42
|
-
const lastProcessedId = savedCursor || "";
|
|
43
|
-
const totalRemaining = (await getDbClient().get(`SELECT COUNT(*) as count FROM session_logs
|
|
44
|
-
WHERE id > ?
|
|
45
|
-
AND (content LIKE '%lin!_oauth!_%' ESCAPE '!'
|
|
46
|
-
OR content LIKE '%lin!_api!_%' ESCAPE '!'
|
|
47
|
-
OR content LIKE '%npm!_%' ESCAPE '!'
|
|
48
|
-
OR content LIKE '%ATATT%')`, [lastProcessedId]))?.count ?? 0;
|
|
49
|
-
if (totalRemaining === 0) {
|
|
50
|
-
await markDone();
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
console.log(`[boot-scrub-logs] starting: ${totalRemaining} candidate rows remaining` + (lastProcessedId ? ` (resuming from cursor ${lastProcessedId.slice(0, 8)}…)` : ""));
|
|
54
|
-
const saveCursorSql = `INSERT INTO seed_state (kind, key, seededHash, seededAt)
|
|
55
|
-
VALUES ('maintenance', '${CURSOR_KEY}', ?, datetime('now'))
|
|
56
|
-
ON CONFLICT (kind, key) DO UPDATE SET seededHash = ?, seededAt = datetime('now')`;
|
|
57
|
-
let scrubbed = 0;
|
|
58
|
-
let scanned = 0;
|
|
59
|
-
let cursor = lastProcessedId;
|
|
60
|
-
for (;; ) {
|
|
61
|
-
const rows = await getDbClient().query(`SELECT id, content FROM session_logs
|
|
62
|
-
WHERE id > ?
|
|
63
|
-
AND (content LIKE '%lin!_oauth!_%' ESCAPE '!'
|
|
64
|
-
OR content LIKE '%lin!_api!_%' ESCAPE '!'
|
|
65
|
-
OR content LIKE '%npm!_%' ESCAPE '!'
|
|
66
|
-
OR content LIKE '%ATATT%')
|
|
67
|
-
ORDER BY id ASC
|
|
68
|
-
LIMIT ${BATCH_SIZE}`, [cursor]);
|
|
69
|
-
if (rows.length === 0)
|
|
70
|
-
break;
|
|
71
|
-
const batchLastId = rows[rows.length - 1].id;
|
|
72
|
-
await getDbClient().transaction(async (tx) => {
|
|
73
|
-
for (const row of rows) {
|
|
74
|
-
const cleaned = scrubSecrets(row.content);
|
|
75
|
-
if (cleaned !== row.content) {
|
|
76
|
-
await tx.run("UPDATE session_logs SET content = ? WHERE id = ?", [cleaned, row.id]);
|
|
77
|
-
scrubbed++;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
await tx.run(saveCursorSql, [batchLastId, batchLastId]);
|
|
81
|
-
});
|
|
82
|
-
scanned += rows.length;
|
|
83
|
-
cursor = batchLastId;
|
|
84
|
-
await yieldTick();
|
|
85
|
-
}
|
|
86
|
-
await markDone();
|
|
87
|
-
await getDbClient().run("DELETE FROM seed_state WHERE kind = 'maintenance' AND key = ?", [
|
|
88
|
-
CURSOR_KEY
|
|
89
|
-
]);
|
|
90
|
-
console.log(`[boot-scrub-logs] complete: scanned=${scanned} scrubbed=${scrubbed}`);
|
|
91
|
-
}
|
|
92
|
-
async function markDone() {
|
|
93
|
-
await getDbClient().run(`INSERT INTO seed_state (kind, key, seededHash, seededAt)
|
|
94
|
-
VALUES ('maintenance', ?, 'done', datetime('now'))
|
|
95
|
-
ON CONFLICT (kind, key) DO UPDATE SET seededHash = 'done', seededAt = datetime('now')`, [SCRUB_KEY]);
|
|
96
|
-
}
|
|
97
|
-
export {
|
|
98
|
-
runBootScrubLogs
|
|
99
|
-
};
|