ship 1.4.67:Arcrun@b08a8cee44cd
This commit is contained in:
@@ -29,7 +29,7 @@ Served via jsDelivr; fetched automatically during install — you never need to
|
||||
- `arcrun-wait/` — **arcrun-wait**(首裝)
|
||||
- `daemon/` — 桌面 App(Mac/Windows)安裝檔
|
||||
|
||||
Built from `Arcrun@63e3c6da1b38` by `installer/scripts/ship.mjs`(arcrun-rag repo,release 1.4.66,built 2026-09-13)。
|
||||
Built from `Arcrun@b08a8cee44cd` by `installer/scripts/ship.mjs`(arcrun-rag repo,release 1.4.67,built 2026-09-13)。
|
||||
|
||||
⚠️ 這份檔案由出貨管線每次自動重寫(`installer/scripts/render-bundles-readme.mjs`)——
|
||||
不要手動改這裡列的零件清單——它是算出來的:公庫=Arcrun 這一版編了什麼,
|
||||
|
||||
@@ -3525,11 +3525,11 @@ function invalidateCredentialCache(apiKey) {
|
||||
async function getCredentialDirectory(env, apiKey) {
|
||||
const now2 = Date.now();
|
||||
const cached = dirCache[apiKey];
|
||||
if (cached && now2 - cached.fetchedAt < DIR_CACHE_TTL_MS) return cached.rows;
|
||||
if (cached && now2 - cached.fetchedAt < DIR_CACHE_TTL_MS) return { rows: cached.rows, error: null };
|
||||
const qs = new URLSearchParams({ owner_id: apiKey, entry_type: CREDENTIAL_ENTRY_TYPE, limit: "200" });
|
||||
const res = await kbdbCredFetch(env, `/entries?${qs.toString()}`);
|
||||
if (!res.ok) {
|
||||
return [];
|
||||
return { rows: [], error: `KBDB \u56DE HTTP ${res.status}` };
|
||||
}
|
||||
const body = await res.json().catch(() => null);
|
||||
const rows = (body?.entries ?? []).filter((e) => !!e.page_name).map((e) => {
|
||||
@@ -3544,15 +3544,15 @@ async function getCredentialDirectory(env, apiKey) {
|
||||
};
|
||||
});
|
||||
dirCache[apiKey] = { rows, fetchedAt: now2 };
|
||||
return rows;
|
||||
return { rows, error: null };
|
||||
}
|
||||
async function getCredentialSecretRefs(env, apiKey) {
|
||||
const rows = await getCredentialDirectory(env, apiKey);
|
||||
const out = {};
|
||||
async function getCredentialSecretRefsDetailed(env, apiKey) {
|
||||
const { rows, error } = await getCredentialDirectory(env, apiKey);
|
||||
const refs = {};
|
||||
for (const r of rows) {
|
||||
if (r.secret_ref) out[r.name] = r.secret_ref;
|
||||
if (r.secret_ref) refs[r.name] = r.secret_ref;
|
||||
}
|
||||
return out;
|
||||
return { refs, directoryError: error };
|
||||
}
|
||||
function touchLastUsed(env, apiKey, names) {
|
||||
const cached = dirCache[apiKey];
|
||||
@@ -3560,6 +3560,7 @@ function touchLastUsed(env, apiKey, names) {
|
||||
const now2 = Math.floor(Date.now() / 1e3);
|
||||
for (const r of cached.rows) {
|
||||
if (!names.includes(r.name)) continue;
|
||||
if (typeof r.last_used_at === "number" && now2 - r.last_used_at < LAST_USED_MIN_INTERVAL_S) continue;
|
||||
const meta = {
|
||||
service: r.service,
|
||||
sensitivity: r.sensitivity,
|
||||
@@ -3639,7 +3640,7 @@ async function writeCredential(env, apiKey, name, value, service, sensitivityRaw
|
||||
await upsertCredentialEntry(env, apiKey, name, service ?? null, sensitivity, secretRef);
|
||||
return { secretRef, sensitivity };
|
||||
}
|
||||
var credentialsRouter, CYPHER_SCRIPT_NAME, CREDENTIAL_ENTRY_TYPE, DIR_CACHE_TTL_MS, dirCache, VALUE_LIKE_FIELDS;
|
||||
var credentialsRouter, CYPHER_SCRIPT_NAME, CREDENTIAL_ENTRY_TYPE, DIR_CACHE_TTL_MS, dirCache, LAST_USED_MIN_INTERVAL_S, VALUE_LIKE_FIELDS;
|
||||
var init_credentials = __esm({
|
||||
"cypher-executor/src/routes/credentials.ts"() {
|
||||
"use strict";
|
||||
@@ -3651,6 +3652,7 @@ var init_credentials = __esm({
|
||||
CREDENTIAL_ENTRY_TYPE = "credential";
|
||||
DIR_CACHE_TTL_MS = 6e4;
|
||||
dirCache = {};
|
||||
LAST_USED_MIN_INTERVAL_S = 300;
|
||||
VALUE_LIKE_FIELDS = ["value", "secret", "token", "text", "plaintext"];
|
||||
credentialsRouter.post("/credentials/directory", async (c) => {
|
||||
const apiKey = c.req.header("X-Arcrun-API-Key");
|
||||
@@ -3790,13 +3792,13 @@ var init_credentials = __esm({
|
||||
});
|
||||
|
||||
// cypher-executor/src/actions/auth-dispatcher.ts
|
||||
async function resolveSecretsFromNewHome(env, apiKey, names) {
|
||||
async function resolveSecretsFromNewHomeDetailed(env, apiKey, names) {
|
||||
const resolved = {};
|
||||
if (names.length === 0) return resolved;
|
||||
const refs = await getCredentialSecretRefs(env, apiKey);
|
||||
if (Object.keys(refs).length === 0) return resolved;
|
||||
if (names.length === 0) return { resolved, directoryError: null };
|
||||
const { refs, directoryError } = await getCredentialSecretRefsDetailed(env, apiKey);
|
||||
if (Object.keys(refs).length === 0) return { resolved, directoryError };
|
||||
const secretGet2 = createArcrunHostFunctions(env, apiKey).secret_get;
|
||||
if (!secretGet2) return resolved;
|
||||
if (!secretGet2) return { resolved, directoryError };
|
||||
const resolvedNames = [];
|
||||
for (const name of names) {
|
||||
const ref = refs[name];
|
||||
@@ -3807,7 +3809,11 @@ async function resolveSecretsFromNewHome(env, apiKey, names) {
|
||||
resolvedNames.push(name);
|
||||
}
|
||||
if (resolvedNames.length > 0) touchLastUsed(env, apiKey, resolvedNames);
|
||||
return resolved;
|
||||
return { resolved, directoryError };
|
||||
}
|
||||
function explainCredentialFailure(message, directoryError, names) {
|
||||
if (!directoryError) return message;
|
||||
return `credential \u76EE\u9304\u8B80\u4E0D\u5230\uFF08${directoryError}\uFF09\uFF0C${names.join("\u3001")} \u7121\u6CD5\u5F9E\u4FDD\u7BA1\u8655\u53D6\u7528\u2014\u2014\u9019\u4E0D\u4EE3\u8868 credential \u4E0D\u5B58\u5728\uFF0C\u662F\u77E5\u8B58\u5EAB\uFF08KBDB\uFF09\u9019\u4E00\u523B\u56DE\u932F\uFF0C\u8ACB\u5148\u78BA\u8A8D KBDB \u662F\u5426\u6B63\u5E38\u3002\u9000\u56DE\u820A\u8DEF\u5F91\u7684\u7D50\u679C\uFF1A${message}`;
|
||||
}
|
||||
async function tryAuthDispatch(componentId, input, env, apiKey, redactor) {
|
||||
if (AUTH_PRIMITIVE_IDS.has(componentId)) {
|
||||
@@ -3822,7 +3828,7 @@ async function tryAuthDispatch(componentId, input, env, apiKey, redactor) {
|
||||
if (!recipe) return null;
|
||||
if (!SUPPORTED_PRIMITIVES.has(recipe.primitive)) return null;
|
||||
const secretNames = recipe.required_secrets.filter((s) => !s.optional).map((s) => s.key);
|
||||
const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, secretNames);
|
||||
const { resolved: resolvedSecrets, directoryError } = await resolveSecretsFromNewHomeDetailed(env, apiKey, secretNames);
|
||||
redactor?.addRecord(resolvedSecrets, (name) => `credential:${name}`);
|
||||
const primitiveUrl = wasmWorkerUrl(`auth_${recipe.primitive}`, env.WORKER_SUBDOMAIN);
|
||||
const res = await fetch(primitiveUrl, {
|
||||
@@ -3839,13 +3845,17 @@ async function tryAuthDispatch(componentId, input, env, apiKey, redactor) {
|
||||
if (!res.ok) {
|
||||
const text = await res.text().catch(() => "");
|
||||
throw new Error(
|
||||
`auth primitive "${recipe.primitive}" \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}`
|
||||
explainCredentialFailure(
|
||||
`auth primitive "${recipe.primitive}" \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}`,
|
||||
directoryError,
|
||||
secretNames
|
||||
)
|
||||
);
|
||||
}
|
||||
const result = await res.json().catch(() => null);
|
||||
if (!result || result.success === false) {
|
||||
throw new Error(
|
||||
`auth primitive \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}`
|
||||
explainCredentialFailure(`auth primitive \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}`, directoryError, secretNames)
|
||||
);
|
||||
}
|
||||
redactor?.addRecord(result.auth_headers, (k) => `auth_header:${k}`);
|
||||
@@ -3891,7 +3901,7 @@ async function resolveCredentialRefs(data, env, apiKey, redactor) {
|
||||
collectCredentialNames(data, names);
|
||||
if (names.size === 0) return data;
|
||||
const nameList = [...names];
|
||||
const resolvedSecrets = await resolveSecretsFromNewHome(env, apiKey, nameList);
|
||||
const { resolved: resolvedSecrets, directoryError } = await resolveSecretsFromNewHomeDetailed(env, apiKey, nameList);
|
||||
redactor?.addRecord(resolvedSecrets, (name) => `credential:${name}`);
|
||||
if (nameList.every((n) => Object.prototype.hasOwnProperty.call(resolvedSecrets, n))) {
|
||||
return replaceCredentialRefs(data, resolvedSecrets);
|
||||
@@ -3909,11 +3919,15 @@ async function resolveCredentialRefs(data, env, apiKey, redactor) {
|
||||
});
|
||||
if (!res.ok) {
|
||||
const text = await res.text().catch(() => "");
|
||||
throw new Error(`credential resolve \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}`);
|
||||
throw new Error(
|
||||
explainCredentialFailure(`credential resolve \u56DE\u50B3 ${res.status}: ${text.slice(0, 200)}`, directoryError, nameList)
|
||||
);
|
||||
}
|
||||
const result = await res.json().catch(() => null);
|
||||
if (!result || result.success === false) {
|
||||
throw new Error(`credential resolve \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}`);
|
||||
throw new Error(
|
||||
explainCredentialFailure(`credential resolve \u5931\u6557: ${result?.error ?? "\u672A\u77E5\u932F\u8AA4"}`, directoryError, nameList)
|
||||
);
|
||||
}
|
||||
redactor?.addRecord(result.credentials, (name) => `credential:${name}`);
|
||||
return replaceCredentialRefs(data, result.credentials ?? {});
|
||||
@@ -8247,6 +8261,17 @@ var init_magic_vars = __esm({
|
||||
});
|
||||
|
||||
// cypher-executor/src/lib/telemetry.ts
|
||||
function recordNodeSteps(env, apiKey, workflowName, steps, ctx) {
|
||||
if (steps.length === 0) return;
|
||||
const failed = steps.filter((s) => !s.ok).length;
|
||||
recordTelemetry(env, apiKey, {
|
||||
event_type: "node_steps",
|
||||
workflow_name: workflowName,
|
||||
duration_ms: steps.reduce((sum, s) => sum + s.duration_ms, 0),
|
||||
...failed > 0 ? { error_code: "node_error" } : {},
|
||||
steps
|
||||
}, ctx);
|
||||
}
|
||||
async function hashApiKey(apiKey) {
|
||||
if (!apiKey) return "anon";
|
||||
const encoder = new TextEncoder();
|
||||
@@ -8537,6 +8562,9 @@ var init_graph_executor = __esm({
|
||||
// GET /executions/:task_id、POST /workflows/resume)+ 一個持久化端(paused KV)。
|
||||
// 遮在產地=六個出口一次補齊;遮在出口=下一個新出口又會漏。
|
||||
redactor = new TraceRedactor();
|
||||
// inkstone/arcrun-rag#196:本次執行的 step-level 遙測先收在這裡,執行結束寫成一筆。
|
||||
// 原本每個 Component 節點各打一次 fetch,佔掉免費層每次呼叫 50 子請求的額度。
|
||||
nodeSteps = [];
|
||||
constructor(loader, workflowLoader, env, apiKey) {
|
||||
this.loader = loader;
|
||||
this.workflowLoader = workflowLoader;
|
||||
@@ -8565,11 +8593,17 @@ var init_graph_executor = __esm({
|
||||
fanIn.set(node.id, { ctx: { ...ctxWithMagic }, remaining: inDeg });
|
||||
}
|
||||
}
|
||||
const results = await Promise.all(
|
||||
startNodes.map(
|
||||
(node) => this.executeNode(node, graph, ctxWithMagic, /* @__PURE__ */ new Set(), trace, fanIn, kvStore)
|
||||
)
|
||||
);
|
||||
this.nodeSteps = [];
|
||||
let results;
|
||||
try {
|
||||
results = await Promise.all(
|
||||
startNodes.map(
|
||||
(node) => this.executeNode(node, graph, ctxWithMagic, /* @__PURE__ */ new Set(), trace, fanIn, kvStore)
|
||||
)
|
||||
);
|
||||
} finally {
|
||||
this.flushNodeSteps(graph);
|
||||
}
|
||||
let mergedResult;
|
||||
if (results.length === 1) {
|
||||
mergedResult = results[0];
|
||||
@@ -8631,11 +8665,17 @@ var init_graph_executor = __esm({
|
||||
}
|
||||
const visited = /* @__PURE__ */ new Set([`${paused_node_id}:${JSON.stringify(paused_context).slice(0, 50)}`]);
|
||||
const downstreamNodes = downstreamEdges.map((e) => graph.nodes.find((n) => n.id === e.to)).filter((n) => !!n);
|
||||
const results = await Promise.all(
|
||||
downstreamNodes.map(
|
||||
(node) => this.executeNode(node, graph, mergedContext, visited, trace, fanIn, kvStore)
|
||||
)
|
||||
);
|
||||
this.nodeSteps = [];
|
||||
let results;
|
||||
try {
|
||||
results = await Promise.all(
|
||||
downstreamNodes.map(
|
||||
(node) => this.executeNode(node, graph, mergedContext, visited, trace, fanIn, kvStore)
|
||||
)
|
||||
);
|
||||
} finally {
|
||||
this.flushNodeSteps(graph);
|
||||
}
|
||||
let mergedResult;
|
||||
if (results.length === 1) {
|
||||
mergedResult = results[0];
|
||||
@@ -8650,6 +8690,12 @@ var init_graph_executor = __esm({
|
||||
}
|
||||
return { data: this.redactor.redact(mergedResult), trace };
|
||||
}
|
||||
/** 把本次收集的 step-level 遙測寫成一筆(成功、失敗、暫停都寫)。 */
|
||||
flushNodeSteps(graph) {
|
||||
const steps = this.nodeSteps;
|
||||
this.nodeSteps = [];
|
||||
if (this.env && steps.length > 0) recordNodeSteps(this.env, this.apiKey, graph.name, steps);
|
||||
}
|
||||
async executeNode(node, graph, context, visited, trace, fanIn, kvStore) {
|
||||
const nodeKey = `${node.id}:${JSON.stringify(context).slice(0, 50)}`;
|
||||
if (visited.has(nodeKey)) return context;
|
||||
@@ -8763,14 +8809,8 @@ var init_graph_executor = __esm({
|
||||
error: errMsg,
|
||||
duration_ms: duration_ms2
|
||||
});
|
||||
if (this.env && node.type === "Component") {
|
||||
recordTelemetry(this.env, this.apiKey, {
|
||||
event_type: "node_failure",
|
||||
workflow_name: graph.name,
|
||||
component_id: node.componentId,
|
||||
error_code: "node_error",
|
||||
duration_ms: duration_ms2
|
||||
});
|
||||
if (node.type === "Component") {
|
||||
this.nodeSteps.push({ component_id: node.componentId, duration_ms: duration_ms2, ok: false, error_code: "node_error" });
|
||||
}
|
||||
if (e instanceof ExecutionError) throw e;
|
||||
throw new ExecutionError(
|
||||
@@ -8789,13 +8829,8 @@ var init_graph_executor = __esm({
|
||||
output: this.redactor.redact(result),
|
||||
duration_ms
|
||||
});
|
||||
if (this.env && node.type === "Component") {
|
||||
recordTelemetry(this.env, this.apiKey, {
|
||||
event_type: "node_success",
|
||||
workflow_name: graph.name,
|
||||
component_id: node.componentId,
|
||||
duration_ms
|
||||
});
|
||||
if (node.type === "Component") {
|
||||
this.nodeSteps.push({ component_id: node.componentId, duration_ms, ok: true });
|
||||
}
|
||||
const outEdges = graph.edges.filter((e) => e.from === node.id);
|
||||
for (const edge of outEdges) {
|
||||
@@ -9002,6 +9037,17 @@ function componentVerdictsFromTrace(nodes, trace) {
|
||||
}
|
||||
return verdicts;
|
||||
}
|
||||
function aggregateVerdicts(verdicts) {
|
||||
const byId = /* @__PURE__ */ new Map();
|
||||
for (const v of verdicts) {
|
||||
const a = byId.get(v.component_id) ?? { component_id: v.component_id, runs: 0, success_runs: 0, duration_ms: 0 };
|
||||
a.runs += 1;
|
||||
a.success_runs += v.success ? 1 : 0;
|
||||
a.duration_ms += v.duration_ms;
|
||||
byId.set(v.component_id, a);
|
||||
}
|
||||
return [...byId.values()];
|
||||
}
|
||||
async function recordComponentStats(env, nodes, trace) {
|
||||
try {
|
||||
const base = (env.REGISTRY_BASE_URL ?? (env.WORKER_SUBDOMAIN ? wasmWorkerUrl("registry", env.WORKER_SUBDOMAIN) : void 0))?.replace(/\/$/, "");
|
||||
@@ -9009,14 +9055,17 @@ async function recordComponentStats(env, nodes, trace) {
|
||||
const verdicts = componentVerdictsFromTrace(nodes, trace);
|
||||
if (verdicts.length === 0) return;
|
||||
await Promise.all(
|
||||
verdicts.map(
|
||||
(v) => fetch(`${base}/analytics/record`, {
|
||||
aggregateVerdicts(verdicts).map(
|
||||
(a) => fetch(`${base}/analytics/record`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
canonical_id: v.component_id,
|
||||
success: v.success,
|
||||
duration_ms: v.duration_ms
|
||||
canonical_id: a.component_id,
|
||||
// 舊版 registry 不認 runs 時只會記 1 筆:給它「全部成功才算成功」的保守值
|
||||
success: a.success_runs === a.runs,
|
||||
duration_ms: a.duration_ms,
|
||||
runs: a.runs,
|
||||
success_runs: a.success_runs
|
||||
})
|
||||
}).catch(() => void 0)
|
||||
// 統計失敗不影響執行
|
||||
|
||||
+1167
-702
File diff suppressed because it is too large
Load Diff
@@ -32224,7 +32224,7 @@ async function buildLibraryMapInstructions(env, identity) {
|
||||
|
||||
// mcp/src/tools/kbdb_map.ts
|
||||
var RECOMPUTE_HINTS = [
|
||||
"\u5730\u5716\u6BCF\u6B21\u67E5\u8A62\u90FD\u6703\u81EA\u52D5\u6838\u5C0D\u5373\u6642\u4E09\u5143\u7D44\u6578\u4E26\u91CD\u7B97\u904E\u671F\u7684\u5EAB\uFF0C\u4E0D\u5FC5\u624B\u52D5\u8655\u7406",
|
||||
"\u5730\u5716\u5728\u5361\u7247\u8207\u4E09\u5143\u7D44\u5BEB\u5165\u6642\u5C31\u66F4\u65B0\u4E86\uFF08\u53EA\u52D5\u5BEB\u5165\u7684\u90A3\u4E00\u5EAB\uFF09\uFF0C\u8B80\u5730\u5716\u4E0D\u6703\u91CD\u7B97\uFF0C\u4E0D\u5FC5\u624B\u52D5\u8655\u7406",
|
||||
"\u5C11\u898B\u60C5\u6CC1\uFF08\u820A\u4E09\u5143\u7D44\u6C92\u6709 library \u6A19\u8A18\uFF09\u624D\u9700\u8981\u624B\u52D5\uFF1APOST /map/recompute?library=<\u5EAB\u540D>\uFF08\u53EF\u5E36 body {narrative, source_prefix}\uFF09"
|
||||
];
|
||||
function registerAllKbdbMapTools(server, env, identity) {
|
||||
|
||||
+27
-27
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"schema": 2,
|
||||
"built": "2026-09-13",
|
||||
"source": "Arcrun@63e3c6da1b38",
|
||||
"source": "Arcrun@b08a8cee44cd",
|
||||
"core": [
|
||||
{
|
||||
"name": "arcrun-array-ops",
|
||||
@@ -198,7 +198,7 @@
|
||||
"name": "arcrun-cypher-executor",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-cypher-executor/worker.mjs",
|
||||
"js_bytes": 718803,
|
||||
"js_bytes": 721657,
|
||||
"modules": [],
|
||||
"compat_date": "2025-02-19",
|
||||
"compat_flags": [
|
||||
@@ -239,10 +239,10 @@
|
||||
"stripped": {
|
||||
"services": 13
|
||||
},
|
||||
"source_commit": "5f96438d1211f4166f9cda9341b62d69af76c38e",
|
||||
"source_content_sha256": "e9176c297d93a9d621662e6f037999967751c0542a471b7302f93f06cceee7f1",
|
||||
"sha256": "e9176c297d93a9d621662e6f037999967751c0542a471b7302f93f06cceee7f1",
|
||||
"bytes": 718803
|
||||
"source_commit": "1eb26c98a3af2067303e7544ae9bca1a77867c32",
|
||||
"source_content_sha256": "2e61c3ebc75761463e79e1740da65971a9111aa1675442d8742a372816551591",
|
||||
"sha256": "2e61c3ebc75761463e79e1740da65971a9111aa1675442d8742a372816551591",
|
||||
"bytes": 721657
|
||||
},
|
||||
{
|
||||
"name": "arcrun-date-ops",
|
||||
@@ -396,7 +396,7 @@
|
||||
"name": "arcrun-kbdb",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-kbdb/worker.mjs",
|
||||
"js_bytes": 203823,
|
||||
"js_bytes": 221743,
|
||||
"modules": [],
|
||||
"compat_date": "2025-02-19",
|
||||
"compat_flags": [
|
||||
@@ -416,16 +416,16 @@
|
||||
"ENVIRONMENT": "production"
|
||||
}
|
||||
},
|
||||
"source_commit": "bed24fbbd5c3befed02c5690133d640f1d036e56",
|
||||
"source_content_sha256": "8df57bc74d8f9c828db40207fd0079ae060374be27c0dc9cab835959aee091b0",
|
||||
"sha256": "8df57bc74d8f9c828db40207fd0079ae060374be27c0dc9cab835959aee091b0",
|
||||
"bytes": 203823
|
||||
"source_commit": "b08a8cee44cd0b8b65abd1fa027484d5e99b9a3e",
|
||||
"source_content_sha256": "2650423d74a77ca878a8320686261497ccbd2f4e4d9b13d8f6e3636ce69a79a0",
|
||||
"sha256": "2650423d74a77ca878a8320686261497ccbd2f4e4d9b13d8f6e3636ce69a79a0",
|
||||
"bytes": 221743
|
||||
},
|
||||
{
|
||||
"name": "arcrun-mcp",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-mcp/worker.mjs",
|
||||
"js_bytes": 1215339,
|
||||
"js_bytes": 1215393,
|
||||
"modules": [],
|
||||
"compat_date": "2024-11-27",
|
||||
"compat_flags": [
|
||||
@@ -440,10 +440,10 @@
|
||||
"ai": false,
|
||||
"vars": {}
|
||||
},
|
||||
"source_commit": "5dd01c41cc58d84bd0d854af083c48b657f77bc0",
|
||||
"source_content_sha256": "e3190ad33e01abbe58de09a48d85af46129386bad1a52cf1eb9ce1aeb41b50af",
|
||||
"sha256": "e3190ad33e01abbe58de09a48d85af46129386bad1a52cf1eb9ce1aeb41b50af",
|
||||
"bytes": 1215339
|
||||
"source_commit": "b08a8cee44cd0b8b65abd1fa027484d5e99b9a3e",
|
||||
"source_content_sha256": "b8a27050c106631905092851a3dfdde8c4d5b6de90dc7e84fe616fd5b46291d0",
|
||||
"sha256": "b8a27050c106631905092851a3dfdde8c4d5b6de90dc7e84fe616fd5b46291d0",
|
||||
"bytes": 1215393
|
||||
},
|
||||
{
|
||||
"name": "arcrun-merge",
|
||||
@@ -698,12 +698,12 @@
|
||||
"bytes": 67697
|
||||
}
|
||||
],
|
||||
"release": "1.4.66",
|
||||
"release": "1.4.67",
|
||||
"built_for": "oauth-installer-lazy-load",
|
||||
"notes": [
|
||||
"rag_takedown_direct 用了 __CARDS_PREFIX__,但安裝器的代換表沒有它 ⇒ 這個佔位符會原封不動被推進使用者的工作流。"
|
||||
],
|
||||
"fingerprint": "65d88570080fc3018abdd5cb8f56b39e1af420ac8186c744924c1fbab9a4dbf0",
|
||||
"fingerprint": "b37493ffb1e5fc570bb49edb4f0a545ce1b1c05a249854e4dc47c6ca591f09cf",
|
||||
"library": [
|
||||
{
|
||||
"name": "arcrun-array-ops",
|
||||
@@ -888,7 +888,7 @@
|
||||
"name": "arcrun-cypher-executor",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-cypher-executor/worker.mjs",
|
||||
"js_bytes": 718803,
|
||||
"js_bytes": 721657,
|
||||
"modules": [],
|
||||
"compat_date": "2025-02-19",
|
||||
"compat_flags": [
|
||||
@@ -929,8 +929,8 @@
|
||||
"stripped": {
|
||||
"services": 13
|
||||
},
|
||||
"source_commit": "5f96438d1211f4166f9cda9341b62d69af76c38e",
|
||||
"source_content_sha256": "e9176c297d93a9d621662e6f037999967751c0542a471b7302f93f06cceee7f1",
|
||||
"source_commit": "1eb26c98a3af2067303e7544ae9bca1a77867c32",
|
||||
"source_content_sha256": "2e61c3ebc75761463e79e1740da65971a9111aa1675442d8742a372816551591",
|
||||
"first_install": true
|
||||
},
|
||||
{
|
||||
@@ -1075,7 +1075,7 @@
|
||||
"name": "arcrun-kbdb",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-kbdb/worker.mjs",
|
||||
"js_bytes": 203823,
|
||||
"js_bytes": 221743,
|
||||
"modules": [],
|
||||
"compat_date": "2025-02-19",
|
||||
"compat_flags": [
|
||||
@@ -1095,15 +1095,15 @@
|
||||
"ENVIRONMENT": "production"
|
||||
}
|
||||
},
|
||||
"source_commit": "bed24fbbd5c3befed02c5690133d640f1d036e56",
|
||||
"source_content_sha256": "8df57bc74d8f9c828db40207fd0079ae060374be27c0dc9cab835959aee091b0",
|
||||
"source_commit": "b08a8cee44cd0b8b65abd1fa027484d5e99b9a3e",
|
||||
"source_content_sha256": "2650423d74a77ca878a8320686261497ccbd2f4e4d9b13d8f6e3636ce69a79a0",
|
||||
"first_install": true
|
||||
},
|
||||
{
|
||||
"name": "arcrun-mcp",
|
||||
"main_module": "worker.mjs",
|
||||
"main_file": "arcrun-mcp/worker.mjs",
|
||||
"js_bytes": 1215339,
|
||||
"js_bytes": 1215393,
|
||||
"modules": [],
|
||||
"compat_date": "2024-11-27",
|
||||
"compat_flags": [
|
||||
@@ -1118,8 +1118,8 @@
|
||||
"ai": false,
|
||||
"vars": {}
|
||||
},
|
||||
"source_commit": "5dd01c41cc58d84bd0d854af083c48b657f77bc0",
|
||||
"source_content_sha256": "e3190ad33e01abbe58de09a48d85af46129386bad1a52cf1eb9ce1aeb41b50af",
|
||||
"source_commit": "b08a8cee44cd0b8b65abd1fa027484d5e99b9a3e",
|
||||
"source_content_sha256": "b8a27050c106631905092851a3dfdde8c4d5b6de90dc7e84fe616fd5b46291d0",
|
||||
"first_install": true
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user