@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
|
@@ -12,60 +12,64 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
DEFAULT_MODEL,
|
|
14
14
|
resolveCredential
|
|
15
|
-
} from "./cli-
|
|
15
|
+
} from "./cli-f2n17zhp.js";
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_OPENROUTER_BASE_URL,
|
|
18
18
|
getOpenRouterBaseUrl
|
|
19
19
|
} from "./cli-3dpj7atn.js";
|
|
20
|
-
import {
|
|
21
|
-
embedScript
|
|
22
|
-
} from "./cli-jqt9hrnz.js";
|
|
23
20
|
import {
|
|
24
21
|
calculatePKCECodeChallenge,
|
|
25
22
|
ensureAuthorizationTokenOrThrow,
|
|
26
23
|
generateRandomCodeVerifier,
|
|
27
24
|
generateRandomState,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
getOAuthAppById,
|
|
31
|
-
oauthAppRowToProviderConfig,
|
|
32
|
-
updateAuthorizationTokens,
|
|
33
|
-
upsertAuthorization
|
|
34
|
-
} from "./cli-a87b04k8.js";
|
|
25
|
+
oauthAppRowToProviderConfig
|
|
26
|
+
} from "./cli-j2jbr8af.js";
|
|
35
27
|
import {
|
|
36
28
|
getSlackApp
|
|
37
|
-
} from "./cli-
|
|
29
|
+
} from "./cli-ecknp7p1.js";
|
|
38
30
|
import {
|
|
39
31
|
CredentialBroker,
|
|
40
32
|
DEFAULT_CREDENTIAL_BINDINGS,
|
|
41
33
|
claimApprovalCancellationNotification,
|
|
42
34
|
completeApprovalCancellationNotificationClaim,
|
|
43
|
-
computeContentHash,
|
|
44
35
|
createTaskExtended,
|
|
45
36
|
decryptSecret,
|
|
46
37
|
encryptSecret,
|
|
38
|
+
getAuthorizationById,
|
|
47
39
|
getDb,
|
|
48
40
|
getDbClient,
|
|
49
41
|
getEncryptionKey,
|
|
50
42
|
getLeadAgent,
|
|
51
43
|
getMcpServerById,
|
|
44
|
+
getOAuthApp,
|
|
45
|
+
getOAuthAppById,
|
|
52
46
|
getResolvedConfig,
|
|
47
|
+
getScriptById,
|
|
53
48
|
getTaskById,
|
|
54
49
|
init_credential_broker,
|
|
55
50
|
init_crypto,
|
|
56
51
|
init_date_utils,
|
|
57
52
|
init_db,
|
|
53
|
+
init_db1 as init_db2,
|
|
54
|
+
init_oauth,
|
|
55
|
+
init_secret_registry,
|
|
58
56
|
normalizeDateRequired,
|
|
57
|
+
oauthSecretName,
|
|
59
58
|
placeholderForConfigKey,
|
|
59
|
+
registerStoredSecret,
|
|
60
60
|
releaseApprovalCancellationNotificationClaim,
|
|
61
|
+
restoreScratchScriptLastUsedIfUnchanged,
|
|
62
|
+
touchScratchScriptLastUsed,
|
|
63
|
+
updateAuthorizationTokens,
|
|
64
|
+
upsertAuthorization,
|
|
61
65
|
upsertSwarmConfig
|
|
62
|
-
} from "./cli-
|
|
66
|
+
} from "./cli-yshaazs1.js";
|
|
63
67
|
import {
|
|
64
68
|
TERMINAL_TASK_STATUSES,
|
|
65
69
|
defaultAssetKey,
|
|
66
70
|
init_key,
|
|
67
71
|
init_types
|
|
68
|
-
} from "./cli-
|
|
72
|
+
} from "./cli-xvdgasgy.js";
|
|
69
73
|
import {
|
|
70
74
|
getAppUrl,
|
|
71
75
|
init_constants
|
|
@@ -102,7 +106,7 @@ import {
|
|
|
102
106
|
registerVolatileSecret,
|
|
103
107
|
scrubObject,
|
|
104
108
|
scrubSecrets
|
|
105
|
-
} from "./cli-
|
|
109
|
+
} from "./cli-wt7ccy4r.js";
|
|
106
110
|
import {
|
|
107
111
|
__commonJS,
|
|
108
112
|
__require,
|
|
@@ -175254,7 +175258,7 @@ init_constants();
|
|
|
175254
175258
|
init_secret_scrubber();
|
|
175255
175259
|
|
|
175256
175260
|
// src/workflows/approval-notifications.ts
|
|
175257
|
-
|
|
175261
|
+
init_db2();
|
|
175258
175262
|
init_resolver();
|
|
175259
175263
|
init_types();
|
|
175260
175264
|
init_secret_scrubber();
|
|
@@ -175590,7 +175594,7 @@ class HumanInTheLoopExecutor extends BaseExecutor {
|
|
|
175590
175594
|
}
|
|
175591
175595
|
if (notification.channel === "slack") {
|
|
175592
175596
|
try {
|
|
175593
|
-
const { getSlackApp: getSlackApp2 } = await import("./app-
|
|
175597
|
+
const { getSlackApp: getSlackApp2 } = await import("./app-43vrdmv8.js");
|
|
175594
175598
|
const slackApp = getSlackApp2();
|
|
175595
175599
|
if (!slackApp) {
|
|
175596
175600
|
console.warn("[HITL] Slack not initialized — cannot send notification");
|
|
@@ -177233,7 +177237,8 @@ function applyDefinitionPatch(def, patch) {
|
|
|
177233
177237
|
|
|
177234
177238
|
// src/be/script-connections.ts
|
|
177235
177239
|
init_zod();
|
|
177236
|
-
|
|
177240
|
+
init_db2();
|
|
177241
|
+
init_oauth();
|
|
177237
177242
|
|
|
177238
177243
|
// src/oauth/mcp-wrapper.ts
|
|
177239
177244
|
init_env_flag();
|
|
@@ -177602,13 +177607,15 @@ init_credential_broker();
|
|
|
177602
177607
|
init_secret_scrubber();
|
|
177603
177608
|
|
|
177604
177609
|
// src/be/mcp-proxy.ts
|
|
177605
|
-
|
|
177610
|
+
init_db2();
|
|
177606
177611
|
|
|
177607
177612
|
// src/be/db-queries/mcp-oauth.ts
|
|
177608
177613
|
init_secret_scrubber();
|
|
177609
177614
|
init_crypto();
|
|
177610
177615
|
init_date_utils();
|
|
177611
|
-
|
|
177616
|
+
init_db2();
|
|
177617
|
+
init_secret_registry();
|
|
177618
|
+
init_oauth();
|
|
177612
177619
|
function parseObject(value) {
|
|
177613
177620
|
try {
|
|
177614
177621
|
const parsed = JSON.parse(value || "{}");
|
|
@@ -177695,6 +177702,7 @@ async function upsertMcpApp(input) {
|
|
|
177695
177702
|
invalidated: false
|
|
177696
177703
|
});
|
|
177697
177704
|
const encryptedClientSecret = input.dcrClientSecret == null || input.dcrClientSecret === "" ? existing?.clientSecret ?? null : encryptSecret(input.dcrClientSecret, getEncryptionKey());
|
|
177705
|
+
registerStoredSecret(input.dcrClientSecret, oauthSecretName(`mcp-${input.mcpServerId}`, "client_secret"));
|
|
177698
177706
|
const source = "dcr";
|
|
177699
177707
|
if (existing) {
|
|
177700
177708
|
await getDbClient().run(`UPDATE oauth_apps SET
|
|
@@ -179557,9 +179565,10 @@ ${members.join(`
|
|
|
179557
179565
|
// src/be/script-credential-broker.ts
|
|
179558
179566
|
init_credential_broker();
|
|
179559
179567
|
init_secret_scrubber();
|
|
179560
|
-
|
|
179568
|
+
init_db2();
|
|
179561
179569
|
|
|
179562
179570
|
// src/be/oauth-credential-bindings.ts
|
|
179571
|
+
init_oauth();
|
|
179563
179572
|
var OAUTH_BINDING_REFRESH_BUFFER_MS = 5 * 60 * 1000;
|
|
179564
179573
|
function oauthAppToProviderConfig(app) {
|
|
179565
179574
|
return oauthAppRowToProviderConfig(app);
|
|
@@ -179622,419 +179631,6 @@ async function buildScriptCredentialBindings(input) {
|
|
|
179622
179631
|
return (await buildScriptCredentialBindingsWithFailures(input)).egressSecrets;
|
|
179623
179632
|
}
|
|
179624
179633
|
|
|
179625
|
-
// src/be/scripts/db.ts
|
|
179626
|
-
init_key();
|
|
179627
|
-
init_secret_scrubber();
|
|
179628
|
-
|
|
179629
|
-
// src/utils/short-id.ts
|
|
179630
|
-
import { randomBytes } from "node:crypto";
|
|
179631
|
-
var LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
179632
|
-
var BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
179633
|
-
function generateShortId(len = 12) {
|
|
179634
|
-
let out = "";
|
|
179635
|
-
while (out.length < len) {
|
|
179636
|
-
for (const byte of randomBytes((len - out.length) * 2)) {
|
|
179637
|
-
if (byte < 208) {
|
|
179638
|
-
out += LETTERS[byte % 52];
|
|
179639
|
-
if (out.length === len)
|
|
179640
|
-
break;
|
|
179641
|
-
}
|
|
179642
|
-
}
|
|
179643
|
-
}
|
|
179644
|
-
return out;
|
|
179645
|
-
}
|
|
179646
|
-
function base62(bytes) {
|
|
179647
|
-
let out = "";
|
|
179648
|
-
for (const byte of bytes)
|
|
179649
|
-
out += BASE62[byte % 62];
|
|
179650
|
-
return out;
|
|
179651
|
-
}
|
|
179652
|
-
function generateBearerToken() {
|
|
179653
|
-
return `xsk_${base62(randomBytes(24))}`;
|
|
179654
|
-
}
|
|
179655
|
-
|
|
179656
|
-
// src/be/scripts/db.ts
|
|
179657
|
-
init_crypto();
|
|
179658
|
-
init_db();
|
|
179659
|
-
function normalizeScopeId(scope, scopeId) {
|
|
179660
|
-
if (scope === "global")
|
|
179661
|
-
return null;
|
|
179662
|
-
if (!scopeId) {
|
|
179663
|
-
throw new Error("scopeId is required for agent-scoped scripts");
|
|
179664
|
-
}
|
|
179665
|
-
return scopeId;
|
|
179666
|
-
}
|
|
179667
|
-
function rowToScript(row) {
|
|
179668
|
-
return {
|
|
179669
|
-
...row,
|
|
179670
|
-
scopeId: row.scopeId ?? null,
|
|
179671
|
-
isScratch: row.isScratch === 1,
|
|
179672
|
-
typeChecked: row.typeChecked === 1,
|
|
179673
|
-
createdByAgentId: row.createdByAgentId ?? null
|
|
179674
|
-
};
|
|
179675
|
-
}
|
|
179676
|
-
function rowToScriptVersion(row) {
|
|
179677
|
-
return {
|
|
179678
|
-
...row,
|
|
179679
|
-
changedByAgentId: row.changedByAgentId ?? null,
|
|
179680
|
-
changeReason: row.changeReason ?? null
|
|
179681
|
-
};
|
|
179682
|
-
}
|
|
179683
|
-
async function insertScriptVersion(args) {
|
|
179684
|
-
await getDbClient().run(`INSERT INTO script_versions (
|
|
179685
|
-
id, scriptId, version, source, description, intent, signatureJson,
|
|
179686
|
-
contentHash, changedByAgentId, changedAt, changeReason
|
|
179687
|
-
)
|
|
179688
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
179689
|
-
crypto.randomUUID(),
|
|
179690
|
-
args.scriptId,
|
|
179691
|
-
args.version,
|
|
179692
|
-
args.source,
|
|
179693
|
-
args.description,
|
|
179694
|
-
args.intent,
|
|
179695
|
-
args.signatureJson,
|
|
179696
|
-
args.contentHash,
|
|
179697
|
-
args.changedByAgentId ?? null,
|
|
179698
|
-
new Date().toISOString(),
|
|
179699
|
-
args.changeReason ?? null
|
|
179700
|
-
]);
|
|
179701
|
-
}
|
|
179702
|
-
async function insertScript(args) {
|
|
179703
|
-
const now = new Date().toISOString();
|
|
179704
|
-
const id = crypto.randomUUID();
|
|
179705
|
-
const scopeId = normalizeScopeId(args.scope, args.scopeId);
|
|
179706
|
-
const contentHash = computeContentHash(args.source);
|
|
179707
|
-
const fsMode = args.fsMode ?? "none";
|
|
179708
|
-
const isScratch = args.isScratch ? 1 : 0;
|
|
179709
|
-
const typeChecked = args.typeChecked ? 1 : 0;
|
|
179710
|
-
return await getDbClient().transaction(async (tx) => {
|
|
179711
|
-
const row = await tx.get(`INSERT INTO scripts (
|
|
179712
|
-
id, "key", name, scope, scopeId, source, description, intent, signatureJson,
|
|
179713
|
-
argsJsonSchema, contentHash, isScratch, typeChecked, fsMode, createdByAgentId, createdAt, updatedAt,
|
|
179714
|
-
created_by, updated_by
|
|
179715
|
-
)
|
|
179716
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
179717
|
-
RETURNING *`, [
|
|
179718
|
-
id,
|
|
179719
|
-
defaultAssetKey("script", id),
|
|
179720
|
-
args.name,
|
|
179721
|
-
args.scope,
|
|
179722
|
-
scopeId,
|
|
179723
|
-
args.source,
|
|
179724
|
-
args.description,
|
|
179725
|
-
args.intent,
|
|
179726
|
-
args.signatureJson,
|
|
179727
|
-
args.argsJsonSchema ?? null,
|
|
179728
|
-
contentHash,
|
|
179729
|
-
isScratch,
|
|
179730
|
-
typeChecked,
|
|
179731
|
-
fsMode,
|
|
179732
|
-
args.agentId ?? null,
|
|
179733
|
-
now,
|
|
179734
|
-
now,
|
|
179735
|
-
args.createdBy ?? null,
|
|
179736
|
-
args.createdBy ?? null
|
|
179737
|
-
]);
|
|
179738
|
-
if (!row)
|
|
179739
|
-
throw new Error("Failed to insert script");
|
|
179740
|
-
await insertScriptVersion({
|
|
179741
|
-
scriptId: row.id,
|
|
179742
|
-
version: row.version,
|
|
179743
|
-
source: row.source,
|
|
179744
|
-
description: row.description,
|
|
179745
|
-
intent: row.intent,
|
|
179746
|
-
signatureJson: row.signatureJson,
|
|
179747
|
-
contentHash: row.contentHash,
|
|
179748
|
-
changedByAgentId: args.agentId ?? null,
|
|
179749
|
-
changeReason: args.changeReason ?? "Initial creation"
|
|
179750
|
-
});
|
|
179751
|
-
return rowToScript(row);
|
|
179752
|
-
});
|
|
179753
|
-
}
|
|
179754
|
-
async function upsertScriptByName(args) {
|
|
179755
|
-
const shouldEmbed = args.embeddingMode !== "skip";
|
|
179756
|
-
const existing = await getScript(args);
|
|
179757
|
-
if (!existing) {
|
|
179758
|
-
const script2 = await insertScript(args);
|
|
179759
|
-
if (!script2.isScratch && shouldEmbed) {
|
|
179760
|
-
await embedScript(script2);
|
|
179761
|
-
}
|
|
179762
|
-
return {
|
|
179763
|
-
script: script2,
|
|
179764
|
-
isNew: true,
|
|
179765
|
-
contentDeduped: false
|
|
179766
|
-
};
|
|
179767
|
-
}
|
|
179768
|
-
const contentHash = computeContentHash(args.source);
|
|
179769
|
-
if (existing.contentHash === contentHash) {
|
|
179770
|
-
const fsMode2 = args.fsMode ?? existing.fsMode;
|
|
179771
|
-
const isScratch2 = args.isScratch ?? existing.isScratch;
|
|
179772
|
-
const typeChecked2 = args.typeChecked ?? existing.typeChecked;
|
|
179773
|
-
const argsJsonSchema2 = args.argsJsonSchema !== undefined ? args.argsJsonSchema : existing.argsJsonSchema;
|
|
179774
|
-
const trackedMetadataChanged = args.description !== existing.description || args.intent !== existing.intent || args.signatureJson !== existing.signatureJson || argsJsonSchema2 !== existing.argsJsonSchema;
|
|
179775
|
-
const promotedFromScratch = existing.isScratch && !isScratch2;
|
|
179776
|
-
const refreshScratchLastUsed = existing.scope === "agent" && existing.name.startsWith("scratch-") && existing.isScratch && isScratch2;
|
|
179777
|
-
if (fsMode2 !== existing.fsMode || isScratch2 !== existing.isScratch || typeChecked2 !== existing.typeChecked || trackedMetadataChanged || refreshScratchLastUsed) {
|
|
179778
|
-
const row = await getDbClient().get(`UPDATE scripts
|
|
179779
|
-
SET description = ?, intent = ?, signatureJson = ?, argsJsonSchema = ?,
|
|
179780
|
-
isScratch = ?, typeChecked = ?, fsMode = ?, updatedAt = ?, updated_by = ?
|
|
179781
|
-
WHERE id = ?
|
|
179782
|
-
RETURNING *`, [
|
|
179783
|
-
args.description,
|
|
179784
|
-
args.intent,
|
|
179785
|
-
args.signatureJson,
|
|
179786
|
-
argsJsonSchema2 ?? null,
|
|
179787
|
-
isScratch2 ? 1 : 0,
|
|
179788
|
-
typeChecked2 ? 1 : 0,
|
|
179789
|
-
fsMode2,
|
|
179790
|
-
new Date().toISOString(),
|
|
179791
|
-
args.createdBy ?? null,
|
|
179792
|
-
existing.id
|
|
179793
|
-
]);
|
|
179794
|
-
if (!row)
|
|
179795
|
-
throw new Error("Failed to update script metadata");
|
|
179796
|
-
const script2 = rowToScript(row);
|
|
179797
|
-
if (!script2.isScratch && shouldEmbed && (trackedMetadataChanged || promotedFromScratch)) {
|
|
179798
|
-
await embedScript(script2);
|
|
179799
|
-
}
|
|
179800
|
-
return {
|
|
179801
|
-
script: script2,
|
|
179802
|
-
isNew: false,
|
|
179803
|
-
contentDeduped: true
|
|
179804
|
-
};
|
|
179805
|
-
}
|
|
179806
|
-
return {
|
|
179807
|
-
script: existing,
|
|
179808
|
-
isNew: false,
|
|
179809
|
-
contentDeduped: true
|
|
179810
|
-
};
|
|
179811
|
-
}
|
|
179812
|
-
const now = new Date().toISOString();
|
|
179813
|
-
const newVersion = existing.version + 1;
|
|
179814
|
-
const fsMode = args.fsMode ?? existing.fsMode;
|
|
179815
|
-
const isScratch = args.isScratch ?? existing.isScratch;
|
|
179816
|
-
const typeChecked = args.typeChecked ?? existing.typeChecked;
|
|
179817
|
-
const argsJsonSchema = args.argsJsonSchema !== undefined ? args.argsJsonSchema : existing.argsJsonSchema;
|
|
179818
|
-
const script = await getDbClient().transaction(async (tx) => {
|
|
179819
|
-
const row = await tx.get(`UPDATE scripts
|
|
179820
|
-
SET source = ?, description = ?, intent = ?, signatureJson = ?, argsJsonSchema = ?,
|
|
179821
|
-
contentHash = ?, version = ?, isScratch = ?, typeChecked = ?, fsMode = ?, updatedAt = ?, updated_by = ?
|
|
179822
|
-
WHERE id = ?
|
|
179823
|
-
RETURNING *`, [
|
|
179824
|
-
args.source,
|
|
179825
|
-
args.description,
|
|
179826
|
-
args.intent,
|
|
179827
|
-
args.signatureJson,
|
|
179828
|
-
argsJsonSchema ?? null,
|
|
179829
|
-
contentHash,
|
|
179830
|
-
newVersion,
|
|
179831
|
-
isScratch ? 1 : 0,
|
|
179832
|
-
typeChecked ? 1 : 0,
|
|
179833
|
-
fsMode,
|
|
179834
|
-
now,
|
|
179835
|
-
args.createdBy ?? null,
|
|
179836
|
-
existing.id
|
|
179837
|
-
]);
|
|
179838
|
-
if (!row)
|
|
179839
|
-
throw new Error("Failed to update script");
|
|
179840
|
-
await insertScriptVersion({
|
|
179841
|
-
scriptId: row.id,
|
|
179842
|
-
version: row.version,
|
|
179843
|
-
source: row.source,
|
|
179844
|
-
description: row.description,
|
|
179845
|
-
intent: row.intent,
|
|
179846
|
-
signatureJson: row.signatureJson,
|
|
179847
|
-
contentHash: row.contentHash,
|
|
179848
|
-
changedByAgentId: args.agentId ?? null,
|
|
179849
|
-
changeReason: args.changeReason ?? null
|
|
179850
|
-
});
|
|
179851
|
-
return rowToScript(row);
|
|
179852
|
-
});
|
|
179853
|
-
if (!script.isScratch && shouldEmbed) {
|
|
179854
|
-
await embedScript(script);
|
|
179855
|
-
}
|
|
179856
|
-
return {
|
|
179857
|
-
script,
|
|
179858
|
-
isNew: false,
|
|
179859
|
-
contentDeduped: false
|
|
179860
|
-
};
|
|
179861
|
-
}
|
|
179862
|
-
async function getScript(args) {
|
|
179863
|
-
const scopeId = normalizeScopeId(args.scope, args.scopeId);
|
|
179864
|
-
const row = scopeId === null ? await getDbClient().get("SELECT * FROM scripts WHERE name = ? AND scope = ? AND scopeId IS NULL", [args.name, args.scope]) : await getDbClient().get("SELECT * FROM scripts WHERE name = ? AND scope = ? AND scopeId = ?", [args.name, args.scope, scopeId]);
|
|
179865
|
-
return row ? rowToScript(row) : null;
|
|
179866
|
-
}
|
|
179867
|
-
async function getScriptById(id) {
|
|
179868
|
-
const row = await getDbClient().get("SELECT * FROM scripts WHERE id = ?", [id]);
|
|
179869
|
-
return row ? rowToScript(row) : null;
|
|
179870
|
-
}
|
|
179871
|
-
async function getScriptVersion(args) {
|
|
179872
|
-
if (args.version === undefined && args.contentHash === undefined) {
|
|
179873
|
-
throw new Error("version or contentHash is required");
|
|
179874
|
-
}
|
|
179875
|
-
const row = args.version !== undefined ? await getDbClient().get("SELECT * FROM script_versions WHERE scriptId = ? AND version = ?", [args.scriptId, args.version]) : await getDbClient().get("SELECT * FROM script_versions WHERE scriptId = ? AND contentHash = ? ORDER BY version DESC LIMIT 1", [args.scriptId, args.contentHash]);
|
|
179876
|
-
return row ? rowToScriptVersion(row) : null;
|
|
179877
|
-
}
|
|
179878
|
-
async function listScripts(args) {
|
|
179879
|
-
const conditions = [];
|
|
179880
|
-
const params = [];
|
|
179881
|
-
if (args?.scope) {
|
|
179882
|
-
conditions.push("scope = ?");
|
|
179883
|
-
params.push(args.scope);
|
|
179884
|
-
if (args.scope === "global") {
|
|
179885
|
-
conditions.push("scopeId IS NULL");
|
|
179886
|
-
} else if (args.scopeId !== undefined) {
|
|
179887
|
-
conditions.push("scopeId = ?");
|
|
179888
|
-
params.push(normalizeScopeId(args.scope, args.scopeId));
|
|
179889
|
-
}
|
|
179890
|
-
} else if (args?.scopeId !== undefined) {
|
|
179891
|
-
conditions.push("scopeId = ?");
|
|
179892
|
-
params.push(args.scopeId ?? "");
|
|
179893
|
-
}
|
|
179894
|
-
if (!args?.includeScratch) {
|
|
179895
|
-
conditions.push("isScratch = 0");
|
|
179896
|
-
}
|
|
179897
|
-
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
179898
|
-
const rows = await getDbClient().query(`SELECT * FROM scripts ${whereClause} ORDER BY scope ASC, scopeId ASC, name ASC`, params);
|
|
179899
|
-
return rows.map(rowToScript);
|
|
179900
|
-
}
|
|
179901
|
-
async function listScriptVersions(scriptId) {
|
|
179902
|
-
const rows = await getDbClient().query("SELECT * FROM script_versions WHERE scriptId = ? ORDER BY version DESC", [scriptId]);
|
|
179903
|
-
return rows.map(rowToScriptVersion);
|
|
179904
|
-
}
|
|
179905
|
-
async function deleteScript(args) {
|
|
179906
|
-
const existing = await getScript(args);
|
|
179907
|
-
if (!existing)
|
|
179908
|
-
return false;
|
|
179909
|
-
const result = await getDbClient().run("DELETE FROM scripts WHERE id = ?", [existing.id]);
|
|
179910
|
-
return result.changes > 0;
|
|
179911
|
-
}
|
|
179912
|
-
async function touchScratchScriptLastUsed(id, at = new Date().toISOString()) {
|
|
179913
|
-
const result = await getDbClient().run(`UPDATE scripts SET updatedAt = ?
|
|
179914
|
-
WHERE id = ? AND scope = 'agent' AND isScratch = 1 AND name GLOB 'scratch-*'`, [at, id]);
|
|
179915
|
-
return result.changes > 0 ? at : null;
|
|
179916
|
-
}
|
|
179917
|
-
async function restoreScratchScriptLastUsedIfUnchanged(id, priorUpdatedAt, expectedUpdatedAt) {
|
|
179918
|
-
const result = await getDbClient().run(`UPDATE scripts SET updatedAt = ?
|
|
179919
|
-
WHERE id = ? AND scope = 'agent' AND isScratch = 1 AND name GLOB 'scratch-*' AND updatedAt = ?`, [priorUpdatedAt, id, expectedUpdatedAt]);
|
|
179920
|
-
return result.changes > 0;
|
|
179921
|
-
}
|
|
179922
|
-
var SCRIPT_API_ID_LEN = 12;
|
|
179923
|
-
function rowToScriptApi(row) {
|
|
179924
|
-
return {
|
|
179925
|
-
id: row.id,
|
|
179926
|
-
scriptId: row.scriptId,
|
|
179927
|
-
agentId: row.agentId,
|
|
179928
|
-
authMode: row.authMode,
|
|
179929
|
-
enabled: row.enabled === 1,
|
|
179930
|
-
label: row.label ?? null,
|
|
179931
|
-
callCount: row.callCount,
|
|
179932
|
-
lastUsedAt: row.lastUsedAt ?? null,
|
|
179933
|
-
createdAt: row.createdAt
|
|
179934
|
-
};
|
|
179935
|
-
}
|
|
179936
|
-
function isUniqueConstraintError(err) {
|
|
179937
|
-
return err instanceof Error && /UNIQUE constraint failed/i.test(err.message);
|
|
179938
|
-
}
|
|
179939
|
-
async function createScriptApi(args) {
|
|
179940
|
-
const now = new Date().toISOString();
|
|
179941
|
-
const token = args.authMode === "bearer" ? generateBearerToken() : null;
|
|
179942
|
-
const encrypted = token ? encryptSecret(token, getEncryptionKey()) : null;
|
|
179943
|
-
const createdBy = args.createdBy ?? null;
|
|
179944
|
-
for (let attempt = 0;attempt < 5; attempt++) {
|
|
179945
|
-
const id = generateShortId(SCRIPT_API_ID_LEN);
|
|
179946
|
-
try {
|
|
179947
|
-
const row = await getDbClient().get(`INSERT INTO script_apis
|
|
179948
|
-
(id, scriptId, agentId, authMode, bearerTokenEncrypted, enabled, label,
|
|
179949
|
-
callCount, lastUsedAt, createdAt, created_by, updated_by)
|
|
179950
|
-
VALUES (?, ?, ?, ?, ?, 1, ?, 0, NULL, ?, ?, ?)
|
|
179951
|
-
RETURNING *`, [
|
|
179952
|
-
id,
|
|
179953
|
-
args.scriptId,
|
|
179954
|
-
args.agentId,
|
|
179955
|
-
args.authMode,
|
|
179956
|
-
encrypted,
|
|
179957
|
-
args.label ?? null,
|
|
179958
|
-
now,
|
|
179959
|
-
createdBy,
|
|
179960
|
-
createdBy
|
|
179961
|
-
]);
|
|
179962
|
-
if (!row)
|
|
179963
|
-
throw new Error("Failed to create script API endpoint");
|
|
179964
|
-
if (token)
|
|
179965
|
-
registerVolatileSecret(token, `script-api:${id}`);
|
|
179966
|
-
return { ...rowToScriptApi(row), token };
|
|
179967
|
-
} catch (err) {
|
|
179968
|
-
if (isUniqueConstraintError(err) && attempt < 4)
|
|
179969
|
-
continue;
|
|
179970
|
-
throw err;
|
|
179971
|
-
}
|
|
179972
|
-
}
|
|
179973
|
-
throw new Error("Failed to allocate a unique script API endpoint id");
|
|
179974
|
-
}
|
|
179975
|
-
async function listScriptApisForScript(scriptId) {
|
|
179976
|
-
const rows = await getDbClient().query("SELECT * FROM script_apis WHERE scriptId = ? ORDER BY createdAt DESC", [scriptId]);
|
|
179977
|
-
return rows.map(rowToScriptApi);
|
|
179978
|
-
}
|
|
179979
|
-
async function getScriptApiById(id) {
|
|
179980
|
-
const row = await getDbClient().get("SELECT * FROM script_apis WHERE id = ?", [id]);
|
|
179981
|
-
if (!row)
|
|
179982
|
-
return null;
|
|
179983
|
-
return { ...rowToScriptApi(row), bearerTokenEncrypted: row.bearerTokenEncrypted ?? null };
|
|
179984
|
-
}
|
|
179985
|
-
async function getScriptApiSecret(id) {
|
|
179986
|
-
const row = await getDbClient().get("SELECT bearerTokenEncrypted FROM script_apis WHERE id = ?", [id]);
|
|
179987
|
-
if (!row?.bearerTokenEncrypted)
|
|
179988
|
-
return null;
|
|
179989
|
-
const token = decryptSecret(row.bearerTokenEncrypted, getEncryptionKey());
|
|
179990
|
-
registerVolatileSecret(token, `script-api:${id}`);
|
|
179991
|
-
return token;
|
|
179992
|
-
}
|
|
179993
|
-
async function updateScriptApi(id, args) {
|
|
179994
|
-
const sets = [];
|
|
179995
|
-
const vals = [];
|
|
179996
|
-
if (args.enabled !== undefined) {
|
|
179997
|
-
sets.push("enabled = ?");
|
|
179998
|
-
vals.push(args.enabled ? 1 : 0);
|
|
179999
|
-
}
|
|
180000
|
-
if (args.label !== undefined) {
|
|
180001
|
-
sets.push("label = ?");
|
|
180002
|
-
vals.push(args.label);
|
|
180003
|
-
}
|
|
180004
|
-
if (args.updatedBy !== undefined) {
|
|
180005
|
-
sets.push("updated_by = ?");
|
|
180006
|
-
vals.push(args.updatedBy);
|
|
180007
|
-
}
|
|
180008
|
-
if (sets.length === 0) {
|
|
180009
|
-
const row2 = await getDbClient().get("SELECT * FROM script_apis WHERE id = ?", [
|
|
180010
|
-
id
|
|
180011
|
-
]);
|
|
180012
|
-
return row2 ? rowToScriptApi(row2) : null;
|
|
180013
|
-
}
|
|
180014
|
-
vals.push(id);
|
|
180015
|
-
const row = await getDbClient().get(`UPDATE script_apis SET ${sets.join(", ")} WHERE id = ? RETURNING *`, vals);
|
|
180016
|
-
return row ? rowToScriptApi(row) : null;
|
|
180017
|
-
}
|
|
180018
|
-
async function rotateScriptApiSecret(id, updatedBy) {
|
|
180019
|
-
const existing = await getScriptApiById(id);
|
|
180020
|
-
if (!existing || existing.authMode !== "bearer")
|
|
180021
|
-
return null;
|
|
180022
|
-
const token = generateBearerToken();
|
|
180023
|
-
const encrypted = encryptSecret(token, getEncryptionKey());
|
|
180024
|
-
const row = await getDbClient().get("UPDATE script_apis SET bearerTokenEncrypted = ?, updated_by = ? WHERE id = ? RETURNING *", [encrypted, updatedBy ?? null, id]);
|
|
180025
|
-
if (!row)
|
|
180026
|
-
return null;
|
|
180027
|
-
registerVolatileSecret(token, `script-api:${id}`);
|
|
180028
|
-
return { ...rowToScriptApi(row), token };
|
|
180029
|
-
}
|
|
180030
|
-
async function deleteScriptApi(id) {
|
|
180031
|
-
const result = await getDbClient().run("DELETE FROM script_apis WHERE id = ?", [id]);
|
|
180032
|
-
return result.changes > 0;
|
|
180033
|
-
}
|
|
180034
|
-
async function recordScriptApiUsage(id) {
|
|
180035
|
-
await getDbClient().run("UPDATE script_apis SET callCount = callCount + 1, lastUsedAt = ? WHERE id = ?", [new Date().toISOString(), id]);
|
|
180036
|
-
}
|
|
180037
|
-
|
|
180038
179634
|
// src/scripts-runtime/import-allowlist.ts
|
|
180039
179635
|
var import_typescript = __toESM(require_typescript(), 1);
|
|
180040
179636
|
var SCRIPT_ALLOWED_BARE_IMPORTS = ["swarm-sdk", "stdlib", "zod"];
|
|
@@ -180436,9 +180032,162 @@ class NativeScriptExecutor {
|
|
|
180436
180032
|
}
|
|
180437
180033
|
}
|
|
180438
180034
|
|
|
180035
|
+
// src/scripts-runtime/executors/quickjs.ts
|
|
180036
|
+
var POOL_SIZE = 4;
|
|
180037
|
+
var UNRESPONSIVE_GRACE_MS = 5000;
|
|
180038
|
+
var RECYCLE_WASM_HEAP_BYTES = 64 * 1024 * 1024;
|
|
180039
|
+
function workerSpecifier() {
|
|
180040
|
+
if (import.meta.url.includes("/$bunfs/"))
|
|
180041
|
+
return "./scripts-runtime/executors/quickjs-worker.ts";
|
|
180042
|
+
return new URL("./quickjs-worker.ts", import.meta.url).href;
|
|
180043
|
+
}
|
|
180044
|
+
function emptyOutput(error, stderr = "") {
|
|
180045
|
+
return {
|
|
180046
|
+
result: undefined,
|
|
180047
|
+
stdout: "",
|
|
180048
|
+
stderr,
|
|
180049
|
+
truncated: { stdout: false, stderr: false },
|
|
180050
|
+
durationMs: 0,
|
|
180051
|
+
exitCode: 1,
|
|
180052
|
+
error
|
|
180053
|
+
};
|
|
180054
|
+
}
|
|
180055
|
+
|
|
180056
|
+
class QuickJSWorkerPool {
|
|
180057
|
+
size;
|
|
180058
|
+
slots = [];
|
|
180059
|
+
waiters = [];
|
|
180060
|
+
constructor(size) {
|
|
180061
|
+
this.size = size;
|
|
180062
|
+
}
|
|
180063
|
+
spawn() {
|
|
180064
|
+
const worker = new Worker(workerSpecifier());
|
|
180065
|
+
worker.unref?.();
|
|
180066
|
+
const ready = new Promise((resolve, reject) => {
|
|
180067
|
+
const onMessage = (event) => {
|
|
180068
|
+
if (event.data.type === "ready")
|
|
180069
|
+
resolve();
|
|
180070
|
+
else if (event.data.type === "fatal" && event.data.id === undefined) {
|
|
180071
|
+
reject(new Error(event.data.message));
|
|
180072
|
+
} else
|
|
180073
|
+
return;
|
|
180074
|
+
worker.removeEventListener("message", onMessage);
|
|
180075
|
+
};
|
|
180076
|
+
worker.addEventListener("message", onMessage);
|
|
180077
|
+
worker.addEventListener("error", (event) => reject(new Error(event.message)), { once: true });
|
|
180078
|
+
});
|
|
180079
|
+
ready.catch(() => {});
|
|
180080
|
+
const slot = { worker, ready, busy: true };
|
|
180081
|
+
this.slots.push(slot);
|
|
180082
|
+
return slot;
|
|
180083
|
+
}
|
|
180084
|
+
acquire() {
|
|
180085
|
+
const idle = this.slots.find((slot) => !slot.busy);
|
|
180086
|
+
if (idle) {
|
|
180087
|
+
idle.busy = true;
|
|
180088
|
+
return Promise.resolve(idle);
|
|
180089
|
+
}
|
|
180090
|
+
if (this.slots.length < this.size)
|
|
180091
|
+
return Promise.resolve(this.spawn());
|
|
180092
|
+
return new Promise((resolve) => this.waiters.push(resolve));
|
|
180093
|
+
}
|
|
180094
|
+
release(slot) {
|
|
180095
|
+
const waiter = this.waiters.shift();
|
|
180096
|
+
if (waiter)
|
|
180097
|
+
waiter(slot);
|
|
180098
|
+
else
|
|
180099
|
+
slot.busy = false;
|
|
180100
|
+
}
|
|
180101
|
+
get workerCount() {
|
|
180102
|
+
return this.slots.length;
|
|
180103
|
+
}
|
|
180104
|
+
discard(slot) {
|
|
180105
|
+
slot.worker.terminate();
|
|
180106
|
+
const index = this.slots.indexOf(slot);
|
|
180107
|
+
if (index !== -1)
|
|
180108
|
+
this.slots.splice(index, 1);
|
|
180109
|
+
const waiter = this.waiters.shift();
|
|
180110
|
+
if (waiter)
|
|
180111
|
+
waiter(this.spawn());
|
|
180112
|
+
}
|
|
180113
|
+
}
|
|
180114
|
+
var sharedPool;
|
|
180115
|
+
var requestSeq = 0;
|
|
180116
|
+
|
|
180117
|
+
class QuickJSScriptExecutor {
|
|
180118
|
+
name = "quickjs";
|
|
180119
|
+
async run(input) {
|
|
180120
|
+
if (input.fsMode === "workspace-rw") {
|
|
180121
|
+
return emptyOutput("executor_error", "workspace-rw not supported by quickjs executor");
|
|
180122
|
+
}
|
|
180123
|
+
if (input.signal?.aborted)
|
|
180124
|
+
return emptyOutput("killed");
|
|
180125
|
+
sharedPool ??= new QuickJSWorkerPool(POOL_SIZE);
|
|
180126
|
+
const pool = sharedPool;
|
|
180127
|
+
const slot = await pool.acquire();
|
|
180128
|
+
if (input.signal?.aborted) {
|
|
180129
|
+
pool.release(slot);
|
|
180130
|
+
return emptyOutput("killed");
|
|
180131
|
+
}
|
|
180132
|
+
try {
|
|
180133
|
+
await slot.ready;
|
|
180134
|
+
} catch (error) {
|
|
180135
|
+
pool.discard(slot);
|
|
180136
|
+
return emptyOutput("executor_error", `quickjs worker failed to start: ${error instanceof Error ? error.message : String(error)}`);
|
|
180137
|
+
}
|
|
180138
|
+
const id = ++requestSeq;
|
|
180139
|
+
const start = performance.now();
|
|
180140
|
+
return await new Promise((resolve) => {
|
|
180141
|
+
let settled = false;
|
|
180142
|
+
const settle = (output, healthy) => {
|
|
180143
|
+
if (settled)
|
|
180144
|
+
return;
|
|
180145
|
+
settled = true;
|
|
180146
|
+
clearTimeout(watchdog);
|
|
180147
|
+
slot.worker.removeEventListener("message", onMessage);
|
|
180148
|
+
slot.worker.removeEventListener("error", onError);
|
|
180149
|
+
input.signal?.removeEventListener("abort", onAbort);
|
|
180150
|
+
if (healthy)
|
|
180151
|
+
pool.release(slot);
|
|
180152
|
+
else
|
|
180153
|
+
pool.discard(slot);
|
|
180154
|
+
resolve(output);
|
|
180155
|
+
};
|
|
180156
|
+
const elapsed = () => Math.round(performance.now() - start);
|
|
180157
|
+
const onMessage = (event) => {
|
|
180158
|
+
const message = event.data;
|
|
180159
|
+
if (message.type === "result" && message.id === id) {
|
|
180160
|
+
const reusable = message.leakedHostCalls === 0 && (message.wasmHeapBytes ?? 0) <= RECYCLE_WASM_HEAP_BYTES;
|
|
180161
|
+
settle(message.output, reusable);
|
|
180162
|
+
} else if (message.type === "fatal" && message.id === id) {
|
|
180163
|
+
settle({ ...emptyOutput("executor_error", message.message), durationMs: elapsed() }, false);
|
|
180164
|
+
}
|
|
180165
|
+
};
|
|
180166
|
+
const onError = (event) => {
|
|
180167
|
+
settle({ ...emptyOutput("executor_error", event.message), durationMs: elapsed() }, false);
|
|
180168
|
+
};
|
|
180169
|
+
const onAbort = () => settle({ ...emptyOutput("killed"), durationMs: elapsed() }, false);
|
|
180170
|
+
const watchdog = setTimeout(() => settle({ ...emptyOutput("timeout"), exitCode: 124, durationMs: elapsed() }, false), input.resources.wallClockMs + UNRESPONSIVE_GRACE_MS);
|
|
180171
|
+
slot.worker.addEventListener("message", onMessage);
|
|
180172
|
+
slot.worker.addEventListener("error", onError);
|
|
180173
|
+
input.signal?.addEventListener("abort", onAbort, { once: true });
|
|
180174
|
+
slot.worker.postMessage({
|
|
180175
|
+
id,
|
|
180176
|
+
job: {
|
|
180177
|
+
source: input.source,
|
|
180178
|
+
args: input.args,
|
|
180179
|
+
configPayload: input.configPayload,
|
|
180180
|
+
resources: input.resources
|
|
180181
|
+
}
|
|
180182
|
+
});
|
|
180183
|
+
});
|
|
180184
|
+
}
|
|
180185
|
+
}
|
|
180186
|
+
|
|
180439
180187
|
// src/scripts-runtime/executors/registry.ts
|
|
180440
180188
|
var EXECUTORS = {
|
|
180441
|
-
native: () => new NativeScriptExecutor
|
|
180189
|
+
native: () => new NativeScriptExecutor,
|
|
180190
|
+
quickjs: () => new QuickJSScriptExecutor
|
|
180442
180191
|
};
|
|
180443
180192
|
function getScriptExecutor(name = process.env.SCRIPT_EXECUTOR ?? "native") {
|
|
180444
180193
|
const factory = EXECUTORS[name];
|
|
@@ -180646,8 +180395,10 @@ import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
|
180646
180395
|
|
|
180647
180396
|
// src/apps/definition.ts
|
|
180648
180397
|
init_zod();
|
|
180398
|
+
init_db();
|
|
180649
180399
|
|
|
180650
180400
|
// src/be/scripts/run-saved.ts
|
|
180401
|
+
init_db();
|
|
180651
180402
|
function getSavedScriptOwnerAgentId(script) {
|
|
180652
180403
|
return script.scopeId ?? script.createdByAgentId;
|
|
180653
180404
|
}
|
|
@@ -183042,7 +182793,7 @@ function validatePage(definition, catalog, target) {
|
|
|
183042
182793
|
}
|
|
183043
182794
|
|
|
183044
182795
|
// src/apps/sync-run-as.ts
|
|
183045
|
-
|
|
182796
|
+
init_db2();
|
|
183046
182797
|
async function resolveSyncRunAs(script) {
|
|
183047
182798
|
return getSavedScriptOwnerAgentId(script) ?? (await getLeadAgent())?.id ?? "app-sync";
|
|
183048
182799
|
}
|
|
@@ -183764,7 +183515,7 @@ function applyAppDefinitionPatch(stored, patch) {
|
|
|
183764
183515
|
|
|
183765
183516
|
// src/apps/store.ts
|
|
183766
183517
|
init_key();
|
|
183767
|
-
|
|
183518
|
+
init_db2();
|
|
183768
183519
|
|
|
183769
183520
|
// src/apps/format-upgrades.ts
|
|
183770
183521
|
var CURRENT_APP_SCHEMA_VERSION = 1;
|
|
@@ -185166,4 +184917,4 @@ void _scriptMain;
|
|
|
185166
184917
|
});
|
|
185167
184918
|
}
|
|
185168
184919
|
|
|
185169
|
-
export { require_dist, isInvalidClientError, assertUrlSafe, publicEndpointSsrfOptions, discoverProtectedResourceMetadata, discoverAuthorizationServerMetadata, normalizeTokenEndpointAuthMethod, resolveAdvertisedTokenEndpointAuthMethod, authMethodForStoredClient, selectDcrTokenEndpointAuthMethod, registerClient, buildAuthorizeUrl, exchangeCodeForTokens, refreshMcpToken, revokeMcpToken, computeExpiresAt, getMcpOAuthToken, findReusableMcpOAuthClient, invalidateMcpOAuthClient, upsertMcpOAuthToken, applyMcpOAuthRefresh, markMcpOAuthTokenStatus, deleteMcpOAuthToken, insertMcpOAuthPending, consumeMcpOAuthPending, gcMcpOAuthPending, setMcpServerAuthMethod, ensureMcpToken, callMcpServerTool, listVendoredOpenapiEntries, ConnectionAuthInputSchema, connectionAuthSummary, listRelationalCredentialBindings, getCredentialBindingById, findCredentialBindingByIdentity, upsertCredentialBinding, disableCredentialBinding, listScriptConnections, listScriptConnectionsAsync, getScriptConnectionById, ScriptConnectionConflictError, connectionAuthInputFromFlat, upsertScriptConnection, refreshScriptConnection, setScriptConnectionEnabled, getScriptApiConnectionDescriptors, getScriptMcpConnectionDescriptors, getScriptApiTypes, getScriptMcpTypes, oauthAppToProviderConfig, getOAuthProviderConfig, getOAuthBindingTokenStatus, buildScriptCredentialBindingsWithFailures, buildScriptCredentialBindings,
|
|
184920
|
+
export { require_dist, isInvalidClientError, assertUrlSafe, publicEndpointSsrfOptions, discoverProtectedResourceMetadata, discoverAuthorizationServerMetadata, normalizeTokenEndpointAuthMethod, resolveAdvertisedTokenEndpointAuthMethod, authMethodForStoredClient, selectDcrTokenEndpointAuthMethod, registerClient, buildAuthorizeUrl, exchangeCodeForTokens, refreshMcpToken, revokeMcpToken, computeExpiresAt, getMcpOAuthToken, findReusableMcpOAuthClient, invalidateMcpOAuthClient, upsertMcpOAuthToken, applyMcpOAuthRefresh, markMcpOAuthTokenStatus, deleteMcpOAuthToken, insertMcpOAuthPending, consumeMcpOAuthPending, gcMcpOAuthPending, setMcpServerAuthMethod, ensureMcpToken, callMcpServerTool, listVendoredOpenapiEntries, ConnectionAuthInputSchema, connectionAuthSummary, listRelationalCredentialBindings, getCredentialBindingById, findCredentialBindingByIdentity, upsertCredentialBinding, disableCredentialBinding, listScriptConnections, listScriptConnectionsAsync, getScriptConnectionById, ScriptConnectionConflictError, connectionAuthInputFromFlat, upsertScriptConnection, refreshScriptConnection, setScriptConnectionEnabled, getScriptApiConnectionDescriptors, getScriptMcpConnectionDescriptors, getScriptApiTypes, getScriptMcpTypes, oauthAppToProviderConfig, getOAuthProviderConfig, getOAuthBindingTokenStatus, buildScriptCredentialBindingsWithFailures, buildScriptCredentialBindings, buildSandboxedCommand, sandboxSpawnEnv, createCappedStreamState, snapshotCapped, readStreamCapped, writeBareImportShim, MIN_SCRIPT_WALL_CLOCK_MS, SCRIPT_LONG_TIMEOUT_HINT_MS, MAX_SCRIPT_WALL_CLOCK_MS, DEFAULT_SCRIPT_RESOURCES, require_typescript, checkImportAllowlist, validateScriptImports, runScript, BaseExecutor, postApprovalCancellationUpdates, createApprovalFollowUpTask, HumanInTheLoopExecutor, resolveWorkflowLlmConfig, SYSTEM_ONE_DECISION_NODE_TYPE, systemOneRetryViolations, systemOneUnresolvedError, SystemOneDecisionExecutor, getNextTargets, generateEdges, findEntryNodes, resolveValidationPort, getSuccessors, definitionNodeIds, validateDefinition, applyDefinitionPatch, extractScriptSignature, extractArgsJsonSchema, getSavedScriptOwnerAgentId, runSavedScriptAsAgent, resolveSyncRunAs, AppNameSchema, ColumnKindSchema, isIso8601Date, SYSTEM_COLUMN_KINDS, SORTABLE_SYSTEM_DATE_COLUMNS, AppElementsSchema, AppDefinitionSchema, collectScriptReferences, parseAppDefinition, applyAppDefinitionPatch, upgradeAppDefinition, decodeAppDefinition, appDefinitionNeedsRepair, createApp, getApp, listApps, listAppRecords, updateApp, deleteApp, getScriptAppTypes, SCRIPT_SDK_TYPES, scriptSdkTypesWithGeneratedApis, SCRIPT_STDLIB_MODULE_TYPES, scriptStdlibTypesWithGeneratedApis, typecheckWithAmbient, typecheckScript };
|