@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.
Files changed (188) hide show
  1. package/dist/{acp-adapter-w6zws6me.js → acp-adapter-yzfxn8vj.js} +4 -4
  2. package/dist/{actions-jna0b3wm.js → actions-qz3m692w.js} +20 -24
  3. package/dist/{amp-adapter-0eve81pz.js → amp-adapter-j1xbmsqz.js} +4 -4
  4. package/dist/{app-75hm5cfa.js → app-43vrdmv8.js} +6 -7
  5. package/dist/{assistant-yzd51j33.js → assistant-ertffmka.js} +21 -25
  6. package/dist/{boot-reembed-z158xq32.js → boot-reembed-998jtpdg.js} +9 -12
  7. package/dist/{boot-reembed-2ex2mcsh.js → boot-reembed-s7k7c6v2.js} +10 -12
  8. package/dist/boot-scrub-sweep-nepsk4t1.js +211 -0
  9. package/dist/{boot-seeds-2bmnh18p.js → boot-seeds-vvzs1zhk.js} +8 -8
  10. package/dist/{claude-adapter-jbj1mycz.js → claude-adapter-2zvmekrp.js} +9 -11
  11. package/dist/{claude-managed-adapter-17ggz09t.js → claude-managed-adapter-s49wbk8t.js} +3 -3
  12. package/dist/{claude-managed-setup-ptm1nzm2.js → claude-managed-setup-cvhqq8qn.js} +4 -4
  13. package/dist/{claude-sdk-session-9re1g7r2.js → claude-sdk-session-kkbxtw5q.js} +2618 -2600
  14. package/dist/{cli-k6xx3pve.js → cli-0nhdwxd5.js} +4 -4
  15. package/dist/{cli-n9ehc28t.js → cli-0qjcsxgz.js} +4 -4
  16. package/dist/{cli-zn2v3t8v.js → cli-3ddybbbx.js} +1 -1
  17. package/dist/{cli-5anb0ev3.js → cli-3qn4r334.js} +71 -14
  18. package/dist/{cli-1kzfvd1z.js → cli-4r1sjfc4.js} +9 -5
  19. package/dist/{cli-ba66wyhy.js → cli-66zh26sp.js} +6 -6
  20. package/dist/{cli-9xb89xca.js → cli-68r1j4sg.js} +6 -6
  21. package/dist/{cli-xnzrzets.js → cli-8kgvmkak.js} +2 -2
  22. package/dist/{cli-28smfvbn.js → cli-8t229cmr.js} +5 -5
  23. package/dist/{cli-9866bd07.js → cli-aqcey741.js} +1 -1
  24. package/dist/{cli-90v942q1.js → cli-cpfmqz3n.js} +8 -8
  25. package/dist/{cli-50eg13rj.js → cli-df56tqdw.js} +459 -282
  26. package/dist/{cli-8gpbwy09.js → cli-dw2q9f7g.js} +5 -5
  27. package/dist/{cli-0n4fasz0.js → cli-ecknp7p1.js} +15 -15
  28. package/dist/{cli-xb3c6aat.js → cli-f2n17zhp.js} +1 -1
  29. package/dist/{cli-ftry7975.js → cli-feh3dkah.js} +1 -1
  30. package/dist/{cli-amwhs8h2.js → cli-fn697bnt.js} +2 -2
  31. package/dist/{cli-prt9emct.js → cli-gt8azyet.js} +3 -3
  32. package/dist/{cli-59jn5twa.js → cli-h3x613ze.js} +2 -2
  33. package/dist/{cli-mmzwwptd.js → cli-hf5s9pgf.js} +1 -1
  34. package/dist/cli-j2jbr8af.js +516 -0
  35. package/dist/{cli-wfajtmf7.js → cli-jhm6hzjn.js} +593 -10
  36. package/dist/{cli-xtgtyafv.js → cli-jvj6a0cv.js} +190 -439
  37. package/dist/{cli-hpryr6em.js → cli-mb75wpxf.js} +1 -1
  38. package/dist/{cli-420bdgw0.js → cli-mv2520nm.js} +1 -1
  39. package/dist/{cli-pjxnr1jn.js → cli-mwegs4af.js} +3 -3
  40. package/dist/{cli-5b2fjjzh.js → cli-p4ztb80h.js} +2 -2
  41. package/dist/{cli-e7t4snpa.js → cli-rggdq8wq.js} +4 -4
  42. package/dist/{cli-bdv39kgj.js → cli-rsy933yz.js} +5 -5
  43. package/dist/{cli-gh5yqzpe.js → cli-v2a8x45d.js} +2 -2
  44. package/dist/{cli-bns5c8k9.js → cli-vzc73wet.js} +43 -47
  45. package/dist/cli-wt7ccy4r.js +2654 -0
  46. package/dist/{cli-j0pdrmwg.js → cli-x7kpr72a.js} +3 -3
  47. package/dist/{cli-x7afk5wm.js → cli-xvc3q9br.js} +1 -1
  48. package/dist/{cli-9s3h836g.js → cli-xvdgasgy.js} +1 -1
  49. package/dist/{cli-zvckv750.js → cli-y59h2pk9.js} +2 -2
  50. package/dist/{cli-qdv8kgz7.js → cli-yshaazs1.js} +13884 -3241
  51. package/dist/{cli-nfygw434.js → cli-ysnyhws9.js} +2 -2
  52. package/dist/{cli-fw6vdcq5.js → cli-zp67qg5x.js} +34 -1
  53. package/dist/{cli-ma3zvh39.js → cli-zy7vwsne.js} +6066 -5829
  54. package/dist/cli.js +24 -20
  55. package/dist/{codex-adapter-3qnxshje.js → codex-adapter-dw1wxqt8.js} +7 -7
  56. package/dist/{codex-login-brkxhhdg.js → codex-login-terbdsqq.js} +2 -2
  57. package/dist/{codex-session-runner-612wnapp.js → codex-session-runner-3cgb8y1g.js} +7 -7
  58. package/dist/{commands-2ybfcxkj.js → commands-mhxam6z2.js} +6 -6
  59. package/dist/{cursor-adapter-p3jgdehv.js → cursor-adapter-2qda3st7.js} +3 -3
  60. package/dist/{db-f4ans0jj.js → db-sjks418k.js} +8 -6
  61. package/dist/{devin-adapter-dhzt01ff.js → devin-adapter-bffjj5n4.js} +2 -2
  62. package/dist/{dispatcher-pk182apd.js → dispatcher-1es759rn.js} +18 -22
  63. package/dist/{dsh-adapter-7twaeps1.js → dsh-adapter-bek4cyw9.js} +3 -3
  64. package/dist/{e2b-y8t3jzyz.js → e2b-nd50eccg.js} +1 -1
  65. package/dist/{event-bus-w7ac4n3c.js → event-bus-vnfthafg.js} +2 -2
  66. package/dist/{grok-adapter-yt9pab3k.js → grok-adapter-ar9cw9jg.js} +5 -5
  67. package/dist/{handlers-g2wnr4t9.js → handlers-1gkbhktr.js} +21 -25
  68. package/dist/{hook-f7jt9vnm.js → hook-ds2zxq9v.js} +14 -16
  69. package/dist/{hook-bbdpnkb4.js → hook-vxa3tcsy.js} +8 -10
  70. package/dist/{http-w40q4w94.js → http-3h21z9md.js} +247 -164
  71. package/dist/{index-056j5kzn.js → index-9b65j1m5.js} +8 -8
  72. package/dist/{index-9bfssf54.js → index-bn6cy8ps.js} +18 -22
  73. package/dist/{index-cj1r9q83.js → index-dkfxpkmm.js} +19 -23
  74. package/dist/{index-7n70jwbb.js → index-f8xnqrye.js} +19 -21
  75. package/dist/{index-fdk1t4d6.js → index-n0rxa4ca.js} +11962 -9900
  76. package/dist/{index-k8xc083e.js → index-n99fycq7.js} +18 -22
  77. package/dist/{keepalive-1tj10tf4.js → keepalive-3xspa9jw.js} +11 -8
  78. package/dist/{lead-st0bg7v4.js → lead-6qphc124.js} +34 -38
  79. package/dist/{maintenance-nz71zats.js → maintenance-0teem1bb.js} +7 -9
  80. package/dist/{node-f0ykebbv.js → node-9sg7ajby.js} +25 -7
  81. package/dist/{oauth-refresh-sweep-aefzwvvq.js → oauth-refresh-sweep-sh9q25xp.js} +10 -7
  82. package/dist/{onboard-kgpr9mbn.js → onboard-54qmnqxe.js} +2 -2
  83. package/dist/{opencode-adapter-0c8e70dk.js → opencode-adapter-wjfa2wvd.js} +2 -2
  84. package/dist/{otel-impl-x8zp4y5a.js → otel-impl-ycqzp2a1.js} +2 -2
  85. package/dist/{pi-mono-adapter-t280ah5c.js → pi-mono-adapter-e77e9zst.js} +4 -4
  86. package/dist/{pricing-refresh-9e0q7cwk.js → pricing-refresh-atnkngqs.js} +7 -7
  87. package/dist/{rbac-roles-kcp6zge2.js → rbac-roles-9pjphh9q.js} +6 -6
  88. package/dist/{rbac-roles-790j3ga8.js → rbac-roles-j78wdksm.js} +6 -6
  89. package/dist/{render-v2-tch4nefj.js → render-v2-pxjs49fx.js} +6 -7
  90. package/dist/{setup-rcm303ns.js → setup-ymej0xtx.js} +2 -2
  91. package/dist/{work-objects-ctg7t70w.js → work-objects-3nh4ymzb.js} +22 -26
  92. package/dist/{worker-5dp0xm55.js → worker-qa9fkz5s.js} +34 -38
  93. package/dist/{x-v3yw66zs.js → x-ma4gnfgy.js} +2 -2
  94. package/openapi.json +5 -2
  95. package/package.json +9 -5
  96. package/src/be/automation-preflight.ts +9 -4
  97. package/src/be/boot-scrub-sweep.ts +302 -0
  98. package/src/be/crypto/key-bootstrap.ts +1 -1
  99. package/src/be/db/approvals.ts +15 -1
  100. package/src/be/db/codex-oauth-device-flows.ts +40 -0
  101. package/src/be/db/config-secrets.ts +31 -0
  102. package/src/be/db/runtime.ts +4 -0
  103. package/src/be/db/script-runs.ts +15 -0
  104. package/src/be/db/tasks/write.ts +1 -1
  105. package/src/be/db-queries/mcp-oauth.ts +5 -0
  106. package/src/be/db-queries/oauth.ts +77 -0
  107. package/src/be/db.ts +162 -59
  108. package/src/be/events.ts +17 -1
  109. package/src/be/memory/index-content.ts +2 -2
  110. package/src/be/memory/providers/sqlite-store.ts +63 -11
  111. package/src/be/memory/types.ts +14 -0
  112. package/src/be/migrations/201_workflow_replay_columns.sql +10 -0
  113. package/src/be/migrations/202_codex_oauth_device_flows.sql +24 -0
  114. package/src/be/scripts/db.ts +28 -4
  115. package/src/be/scripts/source-secrets.ts +37 -0
  116. package/src/be/scrub-json.ts +32 -0
  117. package/src/be/sealed-json.ts +59 -0
  118. package/src/be/secret-registry.ts +131 -0
  119. package/src/be/workflow-replay.ts +77 -0
  120. package/src/http/codex-oauth-device.ts +8 -10
  121. package/src/http/db-query-bounded.ts +3 -0
  122. package/src/http/db-query-shared.ts +107 -15
  123. package/src/http/db-query.ts +10 -2
  124. package/src/http/index.ts +23 -6
  125. package/src/http/script-runs.ts +9 -1
  126. package/src/http/scripts.ts +15 -0
  127. package/src/http/workflows.ts +3 -2
  128. package/src/oauth/mcp-wrapper.ts +1 -1
  129. package/src/providers/acp-adapter.ts +25 -11
  130. package/src/providers/acp-target-catalog.ts +35 -1
  131. package/src/providers/acp-targets.ts +69 -3
  132. package/src/providers/amp-adapter.ts +1 -1
  133. package/src/providers/cursor-adapter.ts +1 -1
  134. package/src/script-workflows/supervisor.ts +11 -2
  135. package/src/scripts-runtime/eval-harness.ts +2 -12
  136. package/src/scripts-runtime/executors/quickjs-bundle.ts +152 -0
  137. package/src/scripts-runtime/executors/quickjs-prelude.ts +285 -0
  138. package/src/scripts-runtime/executors/quickjs-runner.ts +580 -0
  139. package/src/scripts-runtime/executors/quickjs-worker.ts +81 -0
  140. package/src/scripts-runtime/executors/quickjs.ts +196 -0
  141. package/src/scripts-runtime/executors/registry.ts +2 -0
  142. package/src/scripts-runtime/executors/sourcemap.ts +79 -0
  143. package/src/scripts-runtime/script-error-hints.ts +14 -0
  144. package/src/server.ts +3 -1
  145. package/src/tests/acp-adapter.test.ts +127 -2
  146. package/src/tests/boot-scrub-sweep.test.ts +390 -0
  147. package/src/tests/check-text-columns.test.ts +145 -0
  148. package/src/tests/claude-sdk-process.fixture.ts +13 -2
  149. package/src/tests/codex-oauth-device.test.ts +23 -37
  150. package/src/tests/db-query-denylist.test.ts +202 -0
  151. package/src/tests/db-task-read-contract.test.ts +1 -0
  152. package/src/tests/db-task-write-contract.test.ts +1 -0
  153. package/src/tests/entrypoint-acp-target-binary.test.ts +31 -1
  154. package/src/tests/events-scrub.test.ts +88 -0
  155. package/src/tests/fixtures/secret-corpus.ts +320 -0
  156. package/src/tests/script-connections.test.ts +5 -0
  157. package/src/tests/script-executor-conformance.test.ts +3 -0
  158. package/src/tests/script-executor-quickjs.test.ts +442 -0
  159. package/src/tests/script-executor-registry.test.ts +6 -1
  160. package/src/tests/script-runs-http.test.ts +88 -1
  161. package/src/tests/script-runs-scrub.test.ts +275 -0
  162. package/src/tests/scripts-http.test.ts +82 -1
  163. package/src/tests/scrubbed-text-12e.test.ts +289 -0
  164. package/src/tests/sealed-key-guard.test.ts +166 -0
  165. package/src/tests/secret-canary-sweep.test.ts +958 -0
  166. package/src/tests/secret-registry.test.ts +355 -0
  167. package/src/tests/secret-rules.test.ts +230 -0
  168. package/src/tests/secret-scrubber.test.ts +3 -2
  169. package/src/tests/workflow-replay.test.ts +518 -0
  170. package/src/tests/workflow-scrub.test.ts +242 -0
  171. package/src/tools/db-query.ts +1 -1
  172. package/src/tools/inject-learning.ts +1 -1
  173. package/src/tools/workflows/get-workflow-run.ts +3 -2
  174. package/src/types.ts +1 -1
  175. package/src/utils/secret-rules.generated.ts +2055 -0
  176. package/src/utils/secret-scrubber.ts +363 -29
  177. package/src/workflows/engine.ts +39 -4
  178. package/src/workflows/recovery.ts +10 -1
  179. package/src/workflows/resume.ts +62 -3
  180. package/src/workflows/retry-poller.ts +3 -0
  181. package/dist/boot-scrub-logs-246yn076.js +0 -99
  182. package/dist/cli-3a4m1aws.js +0 -572
  183. package/dist/cli-a87b04k8.js +0 -951
  184. package/dist/cli-cvk6yzw5.js +0 -40
  185. package/dist/cli-h1spv8v4.js +0 -427
  186. package/dist/cli-jqt9hrnz.js +0 -168
  187. package/dist/cli-yhmwmv0g.js +0 -9281
  188. package/src/be/boot-scrub-logs.ts +0 -132
@@ -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
- };