deepline 0.3.55 → 0.3.56
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/bundling-sources/sdk/src/client.ts +232 -0
- package/dist/bundling-sources/sdk/src/index.ts +29 -0
- package/dist/bundling-sources/sdk/src/monitor-fleet-contract.ts +556 -0
- package/dist/bundling-sources/sdk/src/monitor-fleets.ts +31 -0
- package/dist/bundling-sources/sdk/src/play.ts +2 -8
- package/dist/bundling-sources/sdk/src/release.ts +1 -1
- package/dist/bundling-sources/shared_libs/monitors/monitor-fleet-limits.ts +14 -0
- package/dist/bundling-sources/shared_libs/monitors/org-monitor-limits.ts +102 -0
- package/dist/bundling-sources/shared_libs/monitors/validation.ts +244 -0
- package/dist/cli/index.js +1680 -354
- package/dist/cli/index.mjs +1616 -290
- package/dist/index.d.mts +220 -9
- package/dist/index.d.ts +220 -9
- package/dist/index.js +474 -14
- package/dist/index.mjs +464 -14
- package/dist/install-integrity.json +5 -0
- package/package.json +1 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -1060,7 +1060,7 @@ var SDK_RELEASE = {
|
|
|
1060
1060
|
// available at toolResponse.rawV2 while toolResponse.raw and all declared
|
|
1061
1061
|
// getters keep their established compatibility behavior.
|
|
1062
1062
|
// 0.3.1 deprecated the legacy `deepline enrich` command in favor of Plays.
|
|
1063
|
-
version: "0.3.
|
|
1063
|
+
version: "0.3.56",
|
|
1064
1064
|
updateSummary: "Automatic CLI updates are now enabled by default. To opt out, run `deepline settings autoupdate off`; use `deepline settings autoupdate on` to re-enable updates or `deepline settings autoupdate pin <version>` to hold an exact release. This release also adds raw-v2 tool responses at toolResponse.rawV2 while preserving existing toolResponse.raw and declared getters.",
|
|
1065
1065
|
packageCapabilities: {
|
|
1066
1066
|
updatePreferences: 1
|
|
@@ -2197,7 +2197,7 @@ function decodeSseFrame(frame) {
|
|
|
2197
2197
|
return parsed;
|
|
2198
2198
|
}
|
|
2199
2199
|
function sleep(ms) {
|
|
2200
|
-
return new Promise((
|
|
2200
|
+
return new Promise((resolve21) => setTimeout(resolve21, ms));
|
|
2201
2201
|
}
|
|
2202
2202
|
function withCoworkNetworkHint(message) {
|
|
2203
2203
|
if (!isCoworkLikeSandbox2() || message.includes(COWORK_NETWORK_HINT)) {
|
|
@@ -3100,9 +3100,9 @@ function nonEmptyString(value) {
|
|
|
3100
3100
|
}
|
|
3101
3101
|
function normalizeDatasetBornFrom(value) {
|
|
3102
3102
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
3103
|
-
const
|
|
3104
|
-
const table = nonEmptyString(
|
|
3105
|
-
const rowCountIn = finiteNonNegativeInteger2(
|
|
3103
|
+
const record2 = value;
|
|
3104
|
+
const table = nonEmptyString(record2.table);
|
|
3105
|
+
const rowCountIn = finiteNonNegativeInteger2(record2.rowCountIn);
|
|
3106
3106
|
if (!table || rowCountIn === null) return null;
|
|
3107
3107
|
return { table, rowCountIn };
|
|
3108
3108
|
}
|
|
@@ -3962,14 +3962,14 @@ async function* observeRunEvents(options) {
|
|
|
3962
3962
|
try {
|
|
3963
3963
|
for (; ; ) {
|
|
3964
3964
|
if (queue.length === 0) {
|
|
3965
|
-
const waitForItem = new Promise((
|
|
3966
|
-
wake =
|
|
3965
|
+
const waitForItem = new Promise((resolve21) => {
|
|
3966
|
+
wake = resolve21;
|
|
3967
3967
|
});
|
|
3968
3968
|
if (!sawFirstSnapshot) {
|
|
3969
3969
|
const timedOut = await Promise.race([
|
|
3970
3970
|
waitForItem.then(() => false),
|
|
3971
3971
|
new Promise(
|
|
3972
|
-
(
|
|
3972
|
+
(resolve21) => setTimeout(() => resolve21(true), OBSERVE_BOOTSTRAP_TIMEOUT_MS)
|
|
3973
3973
|
)
|
|
3974
3974
|
]);
|
|
3975
3975
|
if (timedOut && queue.length === 0) {
|
|
@@ -4162,21 +4162,21 @@ function normalizePlayRuntimeNamespace(value) {
|
|
|
4162
4162
|
}
|
|
4163
4163
|
function normalizePlayRuntimeSelection(value) {
|
|
4164
4164
|
if (!value || typeof value !== "object" || Array.isArray(value)) return null;
|
|
4165
|
-
const
|
|
4166
|
-
if (Object.keys(
|
|
4165
|
+
const record2 = value;
|
|
4166
|
+
if (Object.keys(record2).some(
|
|
4167
4167
|
(key) => key !== "environment" && key !== "namespace" && key !== "backend"
|
|
4168
|
-
) ||
|
|
4168
|
+
) || record2.environment !== "preview") {
|
|
4169
4169
|
return null;
|
|
4170
4170
|
}
|
|
4171
|
-
const namespace = normalizePlayRuntimeNamespace(
|
|
4171
|
+
const namespace = normalizePlayRuntimeNamespace(record2.namespace);
|
|
4172
4172
|
if (!namespace) return null;
|
|
4173
|
-
if (
|
|
4173
|
+
if (record2.backend === void 0) {
|
|
4174
4174
|
return { environment: "preview", namespace };
|
|
4175
4175
|
}
|
|
4176
|
-
if (
|
|
4176
|
+
if (record2.backend !== PLAY_RUNTIME_BACKENDS.daytona && record2.backend !== PLAY_RUNTIME_BACKENDS.modal) {
|
|
4177
4177
|
return null;
|
|
4178
4178
|
}
|
|
4179
|
-
return { environment: "preview", namespace, backend:
|
|
4179
|
+
return { environment: "preview", namespace, backend: record2.backend };
|
|
4180
4180
|
}
|
|
4181
4181
|
function normalizePlayRuntimeEnvironment(value) {
|
|
4182
4182
|
return typeof value === "string" && PLAY_RUNTIME_ENVIRONMENTS.includes(value) ? value : null;
|
|
@@ -4328,7 +4328,7 @@ function parseEnvTestPolicyOverrides() {
|
|
|
4328
4328
|
return normalizeTestPolicyOverrides(parsed, "DEEPLINE_TEST_POLICY_OVERRIDES");
|
|
4329
4329
|
}
|
|
4330
4330
|
function sleep2(ms) {
|
|
4331
|
-
return new Promise((
|
|
4331
|
+
return new Promise((resolve21) => setTimeout(resolve21, ms));
|
|
4332
4332
|
}
|
|
4333
4333
|
function isTransientCompileManifestError(error) {
|
|
4334
4334
|
if (error instanceof DeeplineError && typeof error.statusCode === "number") {
|
|
@@ -4760,7 +4760,14 @@ var DeeplineClient = class {
|
|
|
4760
4760
|
dependents: (key) => this.getMonitorDependents(key),
|
|
4761
4761
|
update: (key, patch) => this.updateMonitor(key, patch),
|
|
4762
4762
|
delete: (key, options2) => this.deleteMonitor(key, options2),
|
|
4763
|
-
reactivate: (key, options2) => this.reactivateMonitor(key, options2)
|
|
4763
|
+
reactivate: (key, options2) => this.reactivateMonitor(key, options2),
|
|
4764
|
+
fleets: {
|
|
4765
|
+
sync: (definitionOrId, options2) => this.syncMonitorFleet(definitionOrId, options2),
|
|
4766
|
+
get: (fleetId, options2) => fleetId === void 0 ? this.listMonitorFleets() : this.getMonitorFleet(fleetId, options2),
|
|
4767
|
+
list: () => this.listMonitorFleets(),
|
|
4768
|
+
deactivate: (fleetId, options2) => this.deactivateMonitorFleet(fleetId, options2),
|
|
4769
|
+
waitForConvergence: (fleetId, options2) => this.waitForMonitorFleetConvergence(fleetId, options2)
|
|
4770
|
+
}
|
|
4764
4771
|
};
|
|
4765
4772
|
}
|
|
4766
4773
|
/** The resolved base URL this client is targeting (e.g. `"http://localhost:3000"`). */
|
|
@@ -7068,6 +7075,104 @@ var DeeplineClient = class {
|
|
|
7068
7075
|
{ method: "POST", body: {} }
|
|
7069
7076
|
);
|
|
7070
7077
|
}
|
|
7078
|
+
// ——————————————————————————————————————————————————————————
|
|
7079
|
+
// Monitor Fleets
|
|
7080
|
+
// ——————————————————————————————————————————————————————————
|
|
7081
|
+
monitorFleetIdempotencyKey(operation) {
|
|
7082
|
+
const uuid = globalThis.crypto?.randomUUID?.();
|
|
7083
|
+
return `monitor-fleet-${operation}-${uuid ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;
|
|
7084
|
+
}
|
|
7085
|
+
monitorFleetHeaders(operation, idempotencyKey) {
|
|
7086
|
+
return {
|
|
7087
|
+
"Idempotency-Key": idempotencyKey?.trim() || this.monitorFleetIdempotencyKey(operation)
|
|
7088
|
+
};
|
|
7089
|
+
}
|
|
7090
|
+
monitorFleetPath(fleetId) {
|
|
7091
|
+
return `/api/v2/monitors/fleets/${encodeURIComponent(fleetId)}`;
|
|
7092
|
+
}
|
|
7093
|
+
/**
|
|
7094
|
+
* Create, update, or re-plan one fleet.
|
|
7095
|
+
*
|
|
7096
|
+
* The fleet id is always the resource path, so the same definition PUT twice
|
|
7097
|
+
* is the same operation and the server can answer `replayed: true` instead of
|
|
7098
|
+
* building a second set of monitors. Re-planning an existing fleet from its
|
|
7099
|
+
* stored definition sends an EMPTY body: there is no second definition to
|
|
7100
|
+
* send, and an empty body cannot be mistaken for "replace the definition with
|
|
7101
|
+
* nothing".
|
|
7102
|
+
*/
|
|
7103
|
+
async syncMonitorFleet(definitionOrId, options) {
|
|
7104
|
+
const fleetId = typeof definitionOrId === "string" ? definitionOrId : definitionOrId.id;
|
|
7105
|
+
const body = {
|
|
7106
|
+
...typeof definitionOrId === "string" ? {} : { definition: definitionOrId },
|
|
7107
|
+
...options?.dryRun ? { dry_run: true } : {},
|
|
7108
|
+
...options?.expectedGeneration !== void 0 ? { expected_generation: options.expectedGeneration } : {}
|
|
7109
|
+
};
|
|
7110
|
+
return this.http.request(
|
|
7111
|
+
this.monitorFleetPath(fleetId),
|
|
7112
|
+
{
|
|
7113
|
+
method: "PUT",
|
|
7114
|
+
body,
|
|
7115
|
+
headers: this.monitorFleetHeaders("sync", options?.idempotencyKey),
|
|
7116
|
+
maxRetries: 0,
|
|
7117
|
+
exactUrlOnly: true
|
|
7118
|
+
}
|
|
7119
|
+
);
|
|
7120
|
+
}
|
|
7121
|
+
async listMonitorFleets() {
|
|
7122
|
+
return this.http.request("/api/v2/monitors/fleets", {
|
|
7123
|
+
method: "GET"
|
|
7124
|
+
});
|
|
7125
|
+
}
|
|
7126
|
+
async getMonitorFleet(fleetId, options) {
|
|
7127
|
+
const params = new URLSearchParams();
|
|
7128
|
+
if (options?.drift) params.set("drift", "1");
|
|
7129
|
+
if (options?.limit !== void 0)
|
|
7130
|
+
params.set("limit", String(options.limit));
|
|
7131
|
+
const query = params.toString();
|
|
7132
|
+
return this.http.request(
|
|
7133
|
+
`${this.monitorFleetPath(fleetId)}${query ? `?${query}` : ""}`,
|
|
7134
|
+
{ method: "GET" }
|
|
7135
|
+
);
|
|
7136
|
+
}
|
|
7137
|
+
async deactivateMonitorFleet(fleetId, options) {
|
|
7138
|
+
return this.http.request(
|
|
7139
|
+
this.monitorFleetPath(fleetId),
|
|
7140
|
+
{
|
|
7141
|
+
method: "DELETE",
|
|
7142
|
+
body: options?.dryRun ? { dry_run: true } : {},
|
|
7143
|
+
headers: this.monitorFleetHeaders(
|
|
7144
|
+
"deactivate",
|
|
7145
|
+
options?.idempotencyKey
|
|
7146
|
+
),
|
|
7147
|
+
maxRetries: 0,
|
|
7148
|
+
exactUrlOnly: true
|
|
7149
|
+
}
|
|
7150
|
+
);
|
|
7151
|
+
}
|
|
7152
|
+
/**
|
|
7153
|
+
* Poll one fleet until the server reports a terminal status.
|
|
7154
|
+
*
|
|
7155
|
+
* Convergence is the server's verdict, read from `status`. The timeout is not
|
|
7156
|
+
* a failure and does not throw: a fleet still `converging` after ten minutes
|
|
7157
|
+
* is healthy and slow, not broken, so the caller gets the last snapshot and
|
|
7158
|
+
* decides what that means. Throwing here would have made "still working" look
|
|
7159
|
+
* identical to "the request failed".
|
|
7160
|
+
*/
|
|
7161
|
+
async waitForMonitorFleetConvergence(fleetId, options) {
|
|
7162
|
+
const timeoutMs = Math.max(1, options?.timeoutMs ?? 10 * 6e4);
|
|
7163
|
+
const pollIntervalMs = Math.max(1, options?.pollIntervalMs ?? 2e3);
|
|
7164
|
+
const terminal = options?.until === "deactivated" ? /* @__PURE__ */ new Set(["deactivated", "degraded"]) : /* @__PURE__ */ new Set(["converged", "degraded", "deactivated"]);
|
|
7165
|
+
const startedAt = Date.now();
|
|
7166
|
+
let latest = await this.getMonitorFleet(fleetId);
|
|
7167
|
+
while (true) {
|
|
7168
|
+
options?.onProgress?.(latest);
|
|
7169
|
+
const status = typeof latest.status === "string" ? latest.status : void 0;
|
|
7170
|
+
if (status && terminal.has(status)) return latest;
|
|
7171
|
+
if (Date.now() - startedAt >= timeoutMs) return latest;
|
|
7172
|
+
await sleep2(pollIntervalMs);
|
|
7173
|
+
latest = await this.getMonitorFleet(fleetId);
|
|
7174
|
+
}
|
|
7175
|
+
}
|
|
7071
7176
|
/**
|
|
7072
7177
|
* Check API connectivity and server health.
|
|
7073
7178
|
*
|
|
@@ -7746,30 +7851,30 @@ function flattenObjectColumns(row, options = {}) {
|
|
|
7746
7851
|
continue;
|
|
7747
7852
|
}
|
|
7748
7853
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
7749
|
-
const
|
|
7854
|
+
const record2 = value;
|
|
7750
7855
|
if (options.objectColumns === "json") {
|
|
7751
|
-
flattened[key] = csvSafeJsonString(
|
|
7856
|
+
flattened[key] = csvSafeJsonString(record2);
|
|
7752
7857
|
continue;
|
|
7753
7858
|
}
|
|
7754
|
-
const hasMatchedEnvelope = Object.prototype.hasOwnProperty.call(
|
|
7859
|
+
const hasMatchedEnvelope = Object.prototype.hasOwnProperty.call(record2, "matched_result") || Object.prototype.hasOwnProperty.call(record2, "matchedResult");
|
|
7755
7860
|
if (hasMatchedEnvelope) {
|
|
7756
|
-
flattened[key] = csvSafeJsonString(
|
|
7861
|
+
flattened[key] = csvSafeJsonString(record2);
|
|
7757
7862
|
continue;
|
|
7758
7863
|
}
|
|
7759
7864
|
if (parsedFromString && shouldPreserveJsonStringColumn(options.preserveJsonStringColumns, key)) {
|
|
7760
7865
|
flattened[key] = rawValue;
|
|
7761
7866
|
continue;
|
|
7762
7867
|
} else {
|
|
7763
|
-
const failureMessage = failureMessageFromRecord(
|
|
7868
|
+
const failureMessage = failureMessageFromRecord(record2);
|
|
7764
7869
|
if (failureMessage) {
|
|
7765
7870
|
flattened[key] = failureMessage;
|
|
7766
7871
|
continue;
|
|
7767
|
-
} else if (Object.prototype.hasOwnProperty.call(
|
|
7768
|
-
flattened[key] = csvSafeJsonString(
|
|
7872
|
+
} else if (Object.prototype.hasOwnProperty.call(record2, "result")) {
|
|
7873
|
+
flattened[key] = csvSafeJsonString(record2);
|
|
7769
7874
|
continue;
|
|
7770
7875
|
}
|
|
7771
7876
|
}
|
|
7772
|
-
for (const [nestedKey, nestedValue] of Object.entries(
|
|
7877
|
+
for (const [nestedKey, nestedValue] of Object.entries(record2)) {
|
|
7773
7878
|
flattened[`${key}.${nestedKey}`] = nestedValue && typeof nestedValue === "object" ? csvSafeJsonString(nestedValue) : nestedValue;
|
|
7774
7879
|
}
|
|
7775
7880
|
continue;
|
|
@@ -8158,7 +8263,7 @@ function buildCandidateUrls2(url) {
|
|
|
8158
8263
|
}
|
|
8159
8264
|
}
|
|
8160
8265
|
function sleep4(ms) {
|
|
8161
|
-
return new Promise((
|
|
8266
|
+
return new Promise((resolve21) => setTimeout(resolve21, ms));
|
|
8162
8267
|
}
|
|
8163
8268
|
function printDeeplineLogo() {
|
|
8164
8269
|
if (process.stdout.isTTY && (process.stdout.columns ?? 80) >= 70) {
|
|
@@ -10261,9 +10366,9 @@ function canonicalDatasetJsonValue(value, ancestors) {
|
|
|
10261
10366
|
}
|
|
10262
10367
|
if (ancestors.has(value)) return value;
|
|
10263
10368
|
ancestors.add(value);
|
|
10264
|
-
const
|
|
10369
|
+
const record2 = value;
|
|
10265
10370
|
const normalized = Object.fromEntries(
|
|
10266
|
-
Object.keys(
|
|
10371
|
+
Object.keys(record2).sort((left, right) => left.localeCompare(right)).map((key) => [key, canonicalDatasetJsonValue(record2[key], ancestors)])
|
|
10267
10372
|
);
|
|
10268
10373
|
ancestors.delete(value);
|
|
10269
10374
|
return normalized;
|
|
@@ -11430,16 +11535,16 @@ function collectErrorText(value) {
|
|
|
11430
11535
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
11431
11536
|
return errorMessage(value);
|
|
11432
11537
|
}
|
|
11433
|
-
const
|
|
11538
|
+
const record2 = value;
|
|
11434
11539
|
return [
|
|
11435
11540
|
errorMessage(value),
|
|
11436
|
-
typeof
|
|
11437
|
-
typeof
|
|
11438
|
-
typeof
|
|
11439
|
-
typeof
|
|
11440
|
-
typeof
|
|
11441
|
-
|
|
11442
|
-
|
|
11541
|
+
typeof record2.error === "string" ? record2.error : "",
|
|
11542
|
+
typeof record2.message === "string" ? record2.message : "",
|
|
11543
|
+
typeof record2.detail === "string" ? record2.detail : "",
|
|
11544
|
+
typeof record2.hint === "string" ? record2.hint : "",
|
|
11545
|
+
typeof record2.code === "string" ? record2.code : "",
|
|
11546
|
+
record2.response ? collectErrorText(record2.response) : "",
|
|
11547
|
+
record2.details ? collectErrorText(record2.details) : ""
|
|
11443
11548
|
].filter(Boolean).join("\n");
|
|
11444
11549
|
}
|
|
11445
11550
|
function formatDbQueryError(sql, error) {
|
|
@@ -12491,8 +12596,8 @@ function getterNamesFromTool(tool, kind) {
|
|
|
12491
12596
|
return extractionEntries(resultGuidance[key] ?? resultGuidance[snakeKey]).map((entry) => stringValue(entry.name)).filter(Boolean);
|
|
12492
12597
|
}
|
|
12493
12598
|
function targetGettersFromTool(tool) {
|
|
12494
|
-
const
|
|
12495
|
-
const raw =
|
|
12599
|
+
const record2 = isRecord9(tool) ? tool : {};
|
|
12600
|
+
const raw = record2.targetGetters ?? record2.target_getters;
|
|
12496
12601
|
if (!isRecord9(raw)) return {};
|
|
12497
12602
|
const entries = [];
|
|
12498
12603
|
for (const [target, value] of Object.entries(raw)) {
|
|
@@ -15370,11 +15475,11 @@ function staticStringFromExpression(node, context, seen = /* @__PURE__ */ new Se
|
|
|
15370
15475
|
if (!value?.trim()) return null;
|
|
15371
15476
|
return trimResult ? value.trim() : value;
|
|
15372
15477
|
}
|
|
15373
|
-
const
|
|
15374
|
-
if (!
|
|
15375
|
-
seen.add(
|
|
15478
|
+
const identifier2 = getIdentifierName2(expression);
|
|
15479
|
+
if (!identifier2 || seen.has(identifier2)) return null;
|
|
15480
|
+
seen.add(identifier2);
|
|
15376
15481
|
return staticStringFromExpression(
|
|
15377
|
-
context.declarations.get(
|
|
15482
|
+
context.declarations.get(identifier2),
|
|
15378
15483
|
context,
|
|
15379
15484
|
seen,
|
|
15380
15485
|
trimResult
|
|
@@ -15398,11 +15503,11 @@ function objectExpressionFromNode(node, context, seen = /* @__PURE__ */ new Set(
|
|
|
15398
15503
|
const expression = unwrapStaticExpression2(node);
|
|
15399
15504
|
if (!expression) return null;
|
|
15400
15505
|
if (expression.type === "ObjectExpression") return expression;
|
|
15401
|
-
const
|
|
15402
|
-
if (!
|
|
15403
|
-
seen.add(
|
|
15506
|
+
const identifier2 = getIdentifierName2(expression);
|
|
15507
|
+
if (!identifier2 || seen.has(identifier2)) return null;
|
|
15508
|
+
seen.add(identifier2);
|
|
15404
15509
|
return objectExpressionFromNode(
|
|
15405
|
-
context.declarations.get(
|
|
15510
|
+
context.declarations.get(identifier2),
|
|
15406
15511
|
context,
|
|
15407
15512
|
seen
|
|
15408
15513
|
);
|
|
@@ -15470,11 +15575,11 @@ function staticNumberFromExpression(node, context, seen = /* @__PURE__ */ new Se
|
|
|
15470
15575
|
if (expression.type === "Literal" && typeof expression.value === "number") {
|
|
15471
15576
|
return expression.value;
|
|
15472
15577
|
}
|
|
15473
|
-
const
|
|
15474
|
-
if (!
|
|
15475
|
-
seen.add(
|
|
15578
|
+
const identifier2 = getIdentifierName2(expression);
|
|
15579
|
+
if (!identifier2 || seen.has(identifier2)) return null;
|
|
15580
|
+
seen.add(identifier2);
|
|
15476
15581
|
return staticNumberFromExpression(
|
|
15477
|
-
context.declarations.get(
|
|
15582
|
+
context.declarations.get(identifier2),
|
|
15478
15583
|
context,
|
|
15479
15584
|
seen
|
|
15480
15585
|
);
|
|
@@ -16546,13 +16651,13 @@ function validateFixtureBehavior(value) {
|
|
|
16546
16651
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
16547
16652
|
return { ok: false, error: "fixtureBehavior must be a JSON object." };
|
|
16548
16653
|
}
|
|
16549
|
-
const
|
|
16550
|
-
const supportedKeys =
|
|
16654
|
+
const record2 = value;
|
|
16655
|
+
const supportedKeys = record2.version === FIXTURE_BEHAVIOR_RESPONSE_VERSION || record2.version === FIXTURE_BEHAVIOR_REPLAY_VERSION ? /* @__PURE__ */ new Set([
|
|
16551
16656
|
"version",
|
|
16552
16657
|
"responseSamples",
|
|
16553
|
-
...
|
|
16658
|
+
...record2.version === FIXTURE_BEHAVIOR_REPLAY_VERSION ? ["replayBundle"] : []
|
|
16554
16659
|
]) : /* @__PURE__ */ new Set(["version", "responseDelaySamplesMs"]);
|
|
16555
|
-
const unknownKeys = Object.keys(
|
|
16660
|
+
const unknownKeys = Object.keys(record2).filter(
|
|
16556
16661
|
(key) => !supportedKeys.has(key)
|
|
16557
16662
|
);
|
|
16558
16663
|
if (unknownKeys.length > 0) {
|
|
@@ -16561,22 +16666,22 @@ function validateFixtureBehavior(value) {
|
|
|
16561
16666
|
error: `Unsupported fixtureBehavior field "${unknownKeys[0]}".`
|
|
16562
16667
|
};
|
|
16563
16668
|
}
|
|
16564
|
-
if (
|
|
16669
|
+
if (record2.version !== FIXTURE_BEHAVIOR_VERSION && record2.version !== FIXTURE_BEHAVIOR_RESPONSE_VERSION && record2.version !== FIXTURE_BEHAVIOR_REPLAY_VERSION) {
|
|
16565
16670
|
return {
|
|
16566
16671
|
ok: false,
|
|
16567
16672
|
error: `fixtureBehavior.version must be ${FIXTURE_BEHAVIOR_VERSION} or ${FIXTURE_BEHAVIOR_RESPONSE_VERSION}, or ${FIXTURE_BEHAVIOR_REPLAY_VERSION}.`
|
|
16568
16673
|
};
|
|
16569
16674
|
}
|
|
16570
|
-
if (
|
|
16571
|
-
if (!Array.isArray(
|
|
16675
|
+
if (record2.version === FIXTURE_BEHAVIOR_RESPONSE_VERSION || record2.version === FIXTURE_BEHAVIOR_REPLAY_VERSION) {
|
|
16676
|
+
if (!Array.isArray(record2.responseSamples) || record2.responseSamples.length === 0 || record2.responseSamples.length > MAX_FIXTURE_RESPONSE_DELAY_SAMPLES) {
|
|
16572
16677
|
return {
|
|
16573
16678
|
ok: false,
|
|
16574
16679
|
error: `fixtureBehavior.responseSamples must contain between 1 and ${MAX_FIXTURE_RESPONSE_DELAY_SAMPLES} values.`
|
|
16575
16680
|
};
|
|
16576
16681
|
}
|
|
16577
16682
|
const samples2 = [];
|
|
16578
|
-
for (let index = 0; index <
|
|
16579
|
-
const value2 =
|
|
16683
|
+
for (let index = 0; index < record2.responseSamples.length; index += 1) {
|
|
16684
|
+
const value2 = record2.responseSamples[index];
|
|
16580
16685
|
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) {
|
|
16581
16686
|
return {
|
|
16582
16687
|
ok: false,
|
|
@@ -16675,14 +16780,14 @@ function validateFixtureBehavior(value) {
|
|
|
16675
16780
|
});
|
|
16676
16781
|
}
|
|
16677
16782
|
let replayBundle;
|
|
16678
|
-
if (
|
|
16679
|
-
if (!
|
|
16783
|
+
if (record2.version === FIXTURE_BEHAVIOR_REPLAY_VERSION) {
|
|
16784
|
+
if (!record2.replayBundle || typeof record2.replayBundle !== "object" || Array.isArray(record2.replayBundle)) {
|
|
16680
16785
|
return {
|
|
16681
16786
|
ok: false,
|
|
16682
16787
|
error: "fixtureBehavior.replayBundle must be an object."
|
|
16683
16788
|
};
|
|
16684
16789
|
}
|
|
16685
|
-
const replay =
|
|
16790
|
+
const replay = record2.replayBundle;
|
|
16686
16791
|
const replayUnknownKeys = Object.keys(replay).filter(
|
|
16687
16792
|
(key) => key !== "bundleId" && key !== "manifestSha256" && key !== "syntheticFallbackToolIds"
|
|
16688
16793
|
);
|
|
@@ -16730,7 +16835,7 @@ function validateFixtureBehavior(value) {
|
|
|
16730
16835
|
...syntheticFallbackToolIds ? { syntheticFallbackToolIds } : {}
|
|
16731
16836
|
};
|
|
16732
16837
|
}
|
|
16733
|
-
if (
|
|
16838
|
+
if (record2.version === FIXTURE_BEHAVIOR_REPLAY_VERSION) {
|
|
16734
16839
|
return {
|
|
16735
16840
|
ok: true,
|
|
16736
16841
|
behavior: {
|
|
@@ -16748,15 +16853,15 @@ function validateFixtureBehavior(value) {
|
|
|
16748
16853
|
}
|
|
16749
16854
|
};
|
|
16750
16855
|
}
|
|
16751
|
-
if (!Array.isArray(
|
|
16856
|
+
if (!Array.isArray(record2.responseDelaySamplesMs) || record2.responseDelaySamplesMs.length === 0 || record2.responseDelaySamplesMs.length > MAX_FIXTURE_RESPONSE_DELAY_SAMPLES) {
|
|
16752
16857
|
return {
|
|
16753
16858
|
ok: false,
|
|
16754
16859
|
error: `fixtureBehavior.responseDelaySamplesMs must contain between 1 and ${MAX_FIXTURE_RESPONSE_DELAY_SAMPLES} values.`
|
|
16755
16860
|
};
|
|
16756
16861
|
}
|
|
16757
16862
|
const samples = [];
|
|
16758
|
-
for (let index = 0; index <
|
|
16759
|
-
const value2 =
|
|
16863
|
+
for (let index = 0; index < record2.responseDelaySamplesMs.length; index += 1) {
|
|
16864
|
+
const value2 = record2.responseDelaySamplesMs[index];
|
|
16760
16865
|
if (typeof value2 !== "number" || !Number.isSafeInteger(value2) || value2 < 0 || value2 > MAX_FIXTURE_RESPONSE_DELAY_MS) {
|
|
16761
16866
|
return {
|
|
16762
16867
|
ok: false,
|
|
@@ -16965,7 +17070,7 @@ function traceCliSync(phase, fields, run) {
|
|
|
16965
17070
|
}
|
|
16966
17071
|
}
|
|
16967
17072
|
function sleep5(ms) {
|
|
16968
|
-
return new Promise((
|
|
17073
|
+
return new Promise((resolve21) => setTimeout(resolve21, ms));
|
|
16969
17074
|
}
|
|
16970
17075
|
function parseReferencedPlayTarget2(target) {
|
|
16971
17076
|
const trimmed = target.trim();
|
|
@@ -17498,8 +17603,8 @@ function looksLikeStagedFileRef(value) {
|
|
|
17498
17603
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
17499
17604
|
return false;
|
|
17500
17605
|
}
|
|
17501
|
-
const
|
|
17502
|
-
return typeof
|
|
17606
|
+
const record2 = value;
|
|
17607
|
+
return typeof record2.contentHash === "string" || typeof record2.contentBase64 === "string" || typeof record2.logicalPath === "string" && typeof record2.bytes === "number";
|
|
17503
17608
|
}
|
|
17504
17609
|
var CSV_DATA_INPUT_KEY = "csv";
|
|
17505
17610
|
function collectLocalFileInputRefs(value, inputPath, key, out) {
|
|
@@ -18000,8 +18105,8 @@ function readLiveRunField(event, field) {
|
|
|
18000
18105
|
const records = [payload, payload.progress, run, run?.progress].filter(
|
|
18001
18106
|
(value) => Boolean(value && typeof value === "object" && !Array.isArray(value))
|
|
18002
18107
|
);
|
|
18003
|
-
for (const
|
|
18004
|
-
if (
|
|
18108
|
+
for (const record2 of records) {
|
|
18109
|
+
if (record2[field] !== void 0) return record2[field];
|
|
18005
18110
|
}
|
|
18006
18111
|
return void 0;
|
|
18007
18112
|
}
|
|
@@ -18303,8 +18408,8 @@ function getProgressLinesFromLiveEvent(event) {
|
|
|
18303
18408
|
if (!state || typeof state !== "object" || Array.isArray(state)) {
|
|
18304
18409
|
continue;
|
|
18305
18410
|
}
|
|
18306
|
-
const
|
|
18307
|
-
const progress =
|
|
18411
|
+
const record2 = state;
|
|
18412
|
+
const progress = record2.progress && typeof record2.progress === "object" && !Array.isArray(record2.progress) ? record2.progress : null;
|
|
18308
18413
|
if (!progress) {
|
|
18309
18414
|
continue;
|
|
18310
18415
|
}
|
|
@@ -18321,7 +18426,7 @@ function getProgressLinesFromLiveEvent(event) {
|
|
|
18321
18426
|
completed: progress.completed
|
|
18322
18427
|
});
|
|
18323
18428
|
lines.push(
|
|
18324
|
-
`progress ${formatProgressLabel(
|
|
18429
|
+
`progress ${formatProgressLabel(record2.nodeId ?? progress.artifactTableNamespace)}: ${counts}${messageSuffix}`
|
|
18325
18430
|
);
|
|
18326
18431
|
}
|
|
18327
18432
|
return lines;
|
|
@@ -19150,17 +19255,17 @@ function collectDatasetHandleLines(value, path = "result") {
|
|
|
19150
19255
|
return [];
|
|
19151
19256
|
}
|
|
19152
19257
|
if (isDatasetHandle(value)) {
|
|
19153
|
-
const
|
|
19154
|
-
const count = typeof
|
|
19155
|
-
const preview = Array.isArray(
|
|
19258
|
+
const record2 = value;
|
|
19259
|
+
const count = typeof record2.count === "number" ? record2.count : typeof record2.rowCount === "number" ? record2.rowCount : null;
|
|
19260
|
+
const preview = Array.isArray(record2.preview) ? record2.preview : [];
|
|
19156
19261
|
const lines2 = [
|
|
19157
|
-
` dataset ${typeof
|
|
19262
|
+
` dataset ${typeof record2.path === "string" ? record2.path : path}: rows=${count === null ? "-" : formatInteger(count)} preview=${formatInteger(preview.length)}`
|
|
19158
19263
|
];
|
|
19159
|
-
if (typeof
|
|
19160
|
-
lines2.push(` query dataset: ${
|
|
19264
|
+
if (typeof record2.queryDatasetCommand === "string") {
|
|
19265
|
+
lines2.push(` query dataset: ${record2.queryDatasetCommand}`);
|
|
19161
19266
|
}
|
|
19162
|
-
if (typeof
|
|
19163
|
-
lines2.push(` export CSV: ${
|
|
19267
|
+
if (typeof record2.slowExportAsCsvCommand === "string") {
|
|
19268
|
+
lines2.push(` export CSV: ${record2.slowExportAsCsvCommand}`);
|
|
19164
19269
|
}
|
|
19165
19270
|
return lines2;
|
|
19166
19271
|
}
|
|
@@ -19557,8 +19662,8 @@ function withTerminalPlayIdentity(status, playName) {
|
|
|
19557
19662
|
if (!playName.trim() || getPlayRunPackage(status)) {
|
|
19558
19663
|
return status;
|
|
19559
19664
|
}
|
|
19560
|
-
const
|
|
19561
|
-
const hasIdentity = typeof
|
|
19665
|
+
const record2 = status;
|
|
19666
|
+
const hasIdentity = typeof record2.playName === "string" && record2.playName.trim().length > 0 || typeof record2.name === "string" && record2.name.trim().length > 0 || Boolean(getStringField(record2.run, "playName"));
|
|
19562
19667
|
if (hasIdentity) {
|
|
19563
19668
|
return status;
|
|
19564
19669
|
}
|
|
@@ -19671,9 +19776,9 @@ function formatSummaryScalar(value) {
|
|
|
19671
19776
|
}
|
|
19672
19777
|
return null;
|
|
19673
19778
|
}
|
|
19674
|
-
function formatSummaryScalarParts(
|
|
19779
|
+
function formatSummaryScalarParts(record2, skipKeys = /* @__PURE__ */ new Set()) {
|
|
19675
19780
|
const parts = [];
|
|
19676
|
-
for (const [key, value] of Object.entries(
|
|
19781
|
+
for (const [key, value] of Object.entries(record2)) {
|
|
19677
19782
|
if (skipKeys.has(key)) {
|
|
19678
19783
|
continue;
|
|
19679
19784
|
}
|
|
@@ -19700,13 +19805,13 @@ function formatTopValuesPart(value) {
|
|
|
19700
19805
|
return `top_values=${entries.map(([topValue, count]) => `${topValue}=${String(count)}`).join(", ")}`;
|
|
19701
19806
|
}
|
|
19702
19807
|
function formatPackageDatasetSummaryLines(summary, indent2 = " ") {
|
|
19703
|
-
const
|
|
19704
|
-
const columnStats = readRecord(
|
|
19705
|
-
if (!
|
|
19808
|
+
const record2 = readRecord(summary);
|
|
19809
|
+
const columnStats = readRecord(record2?.columnStats);
|
|
19810
|
+
if (!record2 || !columnStats) {
|
|
19706
19811
|
return [];
|
|
19707
19812
|
}
|
|
19708
19813
|
const lines = [];
|
|
19709
|
-
const rowCounts = readRecord(
|
|
19814
|
+
const rowCounts = readRecord(record2.rowCounts);
|
|
19710
19815
|
if (rowCounts) {
|
|
19711
19816
|
const persisted = readNonNegativeInteger(rowCounts.persisted);
|
|
19712
19817
|
const succeeded = readNonNegativeInteger(rowCounts.succeeded);
|
|
@@ -19722,7 +19827,7 @@ function formatPackageDatasetSummaryLines(summary, indent2 = " ") {
|
|
|
19722
19827
|
}
|
|
19723
19828
|
}
|
|
19724
19829
|
const parts = formatSummaryScalarParts(
|
|
19725
|
-
|
|
19830
|
+
record2,
|
|
19726
19831
|
/* @__PURE__ */ new Set(["columnStats", "rowCounts"])
|
|
19727
19832
|
);
|
|
19728
19833
|
if (parts.length > 0) {
|
|
@@ -19752,35 +19857,35 @@ function actionToCommand(action) {
|
|
|
19752
19857
|
if (!action || typeof action !== "object" || Array.isArray(action)) {
|
|
19753
19858
|
return null;
|
|
19754
19859
|
}
|
|
19755
|
-
const
|
|
19756
|
-
if (typeof
|
|
19757
|
-
return
|
|
19860
|
+
const record2 = action;
|
|
19861
|
+
if (typeof record2.command === "string" && record2.command.trim()) {
|
|
19862
|
+
return record2.command.trim();
|
|
19758
19863
|
}
|
|
19759
|
-
if (
|
|
19760
|
-
return `deepline runs get ${
|
|
19864
|
+
if (record2.kind === "deepline_run_inspect" && typeof record2.runId === "string") {
|
|
19865
|
+
return `deepline runs get ${record2.runId} --json`;
|
|
19761
19866
|
}
|
|
19762
|
-
if (
|
|
19763
|
-
return `deepline runs get ${
|
|
19867
|
+
if (record2.kind === "deepline_run_full" && typeof record2.runId === "string") {
|
|
19868
|
+
return `deepline runs get ${record2.runId} --full --json`;
|
|
19764
19869
|
}
|
|
19765
|
-
if (
|
|
19766
|
-
return `deepline runs get ${
|
|
19870
|
+
if (record2.kind === "deepline_run_billing" && typeof record2.runId === "string") {
|
|
19871
|
+
return `deepline runs get ${record2.runId} --full --json | jq '.billing'`;
|
|
19767
19872
|
}
|
|
19768
|
-
if (
|
|
19769
|
-
return `deepline runs export ${
|
|
19770
|
-
|
|
19771
|
-
)} --out ${shellSingleQuote(`${
|
|
19873
|
+
if (record2.kind === "deepline_run_export" && typeof record2.runId === "string" && typeof record2.datasetPath === "string") {
|
|
19874
|
+
return `deepline runs export ${record2.runId} --dataset ${shellSingleQuote(
|
|
19875
|
+
record2.datasetPath
|
|
19876
|
+
)} --out ${shellSingleQuote(`${record2.datasetPath.split(".").pop() || "dataset"}.csv`)}`;
|
|
19772
19877
|
}
|
|
19773
|
-
if (
|
|
19774
|
-
if (typeof
|
|
19775
|
-
return
|
|
19878
|
+
if (record2.kind === "deepline_run_logs") {
|
|
19879
|
+
if (typeof record2.command === "string" && record2.command.trim()) {
|
|
19880
|
+
return record2.command;
|
|
19776
19881
|
}
|
|
19777
|
-
if (typeof
|
|
19778
|
-
return
|
|
19882
|
+
if (typeof record2.runId === "string") {
|
|
19883
|
+
return record2.view === "failed" ? `deepline runs get ${record2.runId} --log-failed --json` : `deepline runs logs ${record2.runId} --json`;
|
|
19779
19884
|
}
|
|
19780
19885
|
}
|
|
19781
|
-
if (
|
|
19782
|
-
const maxRows = typeof
|
|
19783
|
-
return `deepline db query --sql ${shellSingleQuote(
|
|
19886
|
+
if (record2.kind === "deepline_db_query" && typeof record2.sql === "string") {
|
|
19887
|
+
const maxRows = typeof record2.maxRows === "number" && Number.isFinite(record2.maxRows) ? Math.trunc(record2.maxRows) : 20;
|
|
19888
|
+
return `deepline db query --sql ${shellSingleQuote(record2.sql)} --max-rows ${maxRows} --json`;
|
|
19784
19889
|
}
|
|
19785
19890
|
return null;
|
|
19786
19891
|
}
|
|
@@ -20185,12 +20290,12 @@ function exportableSheetRow(row) {
|
|
|
20185
20290
|
if (!row || typeof row !== "object" || Array.isArray(row)) {
|
|
20186
20291
|
return null;
|
|
20187
20292
|
}
|
|
20188
|
-
const
|
|
20189
|
-
const data =
|
|
20293
|
+
const record2 = row;
|
|
20294
|
+
const data = record2.data;
|
|
20190
20295
|
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
20191
20296
|
return data;
|
|
20192
20297
|
}
|
|
20193
|
-
const fallback = { ...
|
|
20298
|
+
const fallback = { ...record2 };
|
|
20194
20299
|
for (const key of [
|
|
20195
20300
|
"key",
|
|
20196
20301
|
"status",
|
|
@@ -20542,8 +20647,8 @@ var PLAY_SYNTAX_MIGRATION_ERROR_MARKERS = [
|
|
|
20542
20647
|
"ctx.map(...) has been replaced by ctx.dataset(...)",
|
|
20543
20648
|
"Dataset .step(...) has been replaced by .withColumn(...)"
|
|
20544
20649
|
];
|
|
20545
|
-
function stringArrayField(
|
|
20546
|
-
const value =
|
|
20650
|
+
function stringArrayField(record2, key) {
|
|
20651
|
+
const value = record2[key];
|
|
20547
20652
|
if (!Array.isArray(value)) return [];
|
|
20548
20653
|
return value.filter((entry) => typeof entry === "string");
|
|
20549
20654
|
}
|
|
@@ -26315,7 +26420,7 @@ function emitEnrichDebug(message) {
|
|
|
26315
26420
|
);
|
|
26316
26421
|
}
|
|
26317
26422
|
function sleep6(ms) {
|
|
26318
|
-
return new Promise((
|
|
26423
|
+
return new Promise((resolve21) => setTimeout(resolve21, ms));
|
|
26319
26424
|
}
|
|
26320
26425
|
function enrichExportBackingRowsWaitMs() {
|
|
26321
26426
|
const raw = process.env.DEEPLINE_ENRICH_EXPORT_BACKING_ROWS_WAIT_MS?.trim();
|
|
@@ -26424,9 +26529,9 @@ async function expandCompiledConfigAtFiles(value) {
|
|
|
26424
26529
|
if (!value || typeof value !== "object") {
|
|
26425
26530
|
return value;
|
|
26426
26531
|
}
|
|
26427
|
-
const
|
|
26532
|
+
const record2 = value;
|
|
26428
26533
|
const expanded = {};
|
|
26429
|
-
for (const [key, entry] of Object.entries(
|
|
26534
|
+
for (const [key, entry] of Object.entries(record2)) {
|
|
26430
26535
|
expanded[key] = await expandCompiledConfigAtFiles(entry);
|
|
26431
26536
|
}
|
|
26432
26537
|
for (const field of ["extract_js", "run_if_js"]) {
|
|
@@ -27224,26 +27329,26 @@ function readFirstEnrichDatasetActions(value) {
|
|
|
27224
27329
|
}
|
|
27225
27330
|
return null;
|
|
27226
27331
|
}
|
|
27227
|
-
const
|
|
27228
|
-
const actions = isRecord11(
|
|
27332
|
+
const record2 = candidate;
|
|
27333
|
+
const actions = isRecord11(record2.actions) ? record2.actions : null;
|
|
27229
27334
|
const currentQuery = isRecord11(actions?.queryCurrentTable) ? actions.queryCurrentTable : null;
|
|
27230
27335
|
const legacyQuery = isRecord11(actions?.query) ? actions.query : null;
|
|
27231
27336
|
const query = currentQuery?.kind === "deepline_db_query" ? currentQuery : legacyQuery?.kind === "deepline_db_query" ? legacyQuery : null;
|
|
27232
27337
|
if (query?.kind === "deepline_db_query") {
|
|
27233
27338
|
return {
|
|
27234
|
-
dataset:
|
|
27339
|
+
dataset: record2,
|
|
27235
27340
|
query,
|
|
27236
27341
|
...isRecord11(actions?.exportCsv) ? { exportCsv: actions.exportCsv } : {}
|
|
27237
27342
|
};
|
|
27238
27343
|
}
|
|
27239
|
-
if (options.allowLegacy &&
|
|
27344
|
+
if (options.allowLegacy && record2.kind === "dataset" && typeof record2.queryDatasetCommand === "string" && record2.queryDatasetCommand.trim()) {
|
|
27240
27345
|
return {
|
|
27241
|
-
dataset:
|
|
27242
|
-
queryDatasetCommand:
|
|
27243
|
-
...typeof
|
|
27346
|
+
dataset: record2,
|
|
27347
|
+
queryDatasetCommand: record2.queryDatasetCommand.trim(),
|
|
27348
|
+
...typeof record2.slowExportAsCsvCommand === "string" && record2.slowExportAsCsvCommand.trim() ? { slowExportAsCsvCommand: record2.slowExportAsCsvCommand.trim() } : {}
|
|
27244
27349
|
};
|
|
27245
27350
|
}
|
|
27246
|
-
for (const [key, entry] of Object.entries(
|
|
27351
|
+
for (const [key, entry] of Object.entries(record2)) {
|
|
27247
27352
|
if (key === "preview") {
|
|
27248
27353
|
continue;
|
|
27249
27354
|
}
|
|
@@ -27259,8 +27364,8 @@ function readFirstEnrichDatasetActions(value) {
|
|
|
27259
27364
|
seen.clear();
|
|
27260
27365
|
return walk(value, { allowLegacy: true });
|
|
27261
27366
|
}
|
|
27262
|
-
function actionStringField(
|
|
27263
|
-
const value =
|
|
27367
|
+
function actionStringField(record2, key) {
|
|
27368
|
+
const value = record2[key];
|
|
27264
27369
|
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
27265
27370
|
}
|
|
27266
27371
|
function parseSqlFromDbQueryCommand(command) {
|
|
@@ -27604,12 +27709,12 @@ function collectStringFields(value, key, output2, depth = 0) {
|
|
|
27604
27709
|
}
|
|
27605
27710
|
return;
|
|
27606
27711
|
}
|
|
27607
|
-
const
|
|
27608
|
-
const direct =
|
|
27712
|
+
const record2 = value;
|
|
27713
|
+
const direct = record2[key];
|
|
27609
27714
|
if (typeof direct === "string" && direct.trim()) {
|
|
27610
27715
|
output2.add(direct.trim());
|
|
27611
27716
|
}
|
|
27612
|
-
for (const child of Object.values(
|
|
27717
|
+
for (const child of Object.values(record2)) {
|
|
27613
27718
|
collectStringFields(child, key, output2, depth + 1);
|
|
27614
27719
|
}
|
|
27615
27720
|
}
|
|
@@ -27795,23 +27900,23 @@ function exportableSheetRow2(row, sourceRowStart = 0) {
|
|
|
27795
27900
|
if (!row || typeof row !== "object" || Array.isArray(row)) {
|
|
27796
27901
|
return null;
|
|
27797
27902
|
}
|
|
27798
|
-
const
|
|
27799
|
-
const data =
|
|
27903
|
+
const record2 = row;
|
|
27904
|
+
const data = record2.data;
|
|
27800
27905
|
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
27801
27906
|
const exported = { ...data };
|
|
27802
27907
|
applyFailureCellMeta(exported, exported[ENRICH_CELL_META_FIELD], {
|
|
27803
|
-
rowError:
|
|
27908
|
+
rowError: record2.error
|
|
27804
27909
|
});
|
|
27805
|
-
applyFailureCellMeta(exported,
|
|
27806
|
-
applyFailureCellMeta(exported,
|
|
27807
|
-
rowError:
|
|
27910
|
+
applyFailureCellMeta(exported, record2.cellMeta, { rowError: record2.error });
|
|
27911
|
+
applyFailureCellMeta(exported, record2.cellMetaPatch, {
|
|
27912
|
+
rowError: record2.error
|
|
27808
27913
|
});
|
|
27809
|
-
applyFailureCellMeta(exported,
|
|
27810
|
-
rowError:
|
|
27914
|
+
applyFailureCellMeta(exported, record2[ENRICH_CELL_META_PATCH_FIELD], {
|
|
27915
|
+
rowError: record2.error
|
|
27811
27916
|
});
|
|
27812
27917
|
delete exported[ENRICH_CELL_META_FIELD];
|
|
27813
27918
|
delete exported[ENRICH_CELL_META_PATCH_FIELD];
|
|
27814
|
-
const inputIndex = typeof
|
|
27919
|
+
const inputIndex = typeof record2.inputIndex === "number" ? record2.inputIndex : typeof record2.inputIndex === "string" && record2.inputIndex.trim() ? Number(record2.inputIndex) : Number.NaN;
|
|
27815
27920
|
if (Number.isInteger(inputIndex) && inputIndex >= 0) {
|
|
27816
27921
|
if (ENRICH_SOURCE_ROW_INDEX_COLUMN in exported) {
|
|
27817
27922
|
exported[ENRICH_ORIGINAL_SOURCE_ROW_INDEX_COLUMN] = exported[ENRICH_SOURCE_ROW_INDEX_COLUMN];
|
|
@@ -27820,18 +27925,18 @@ function exportableSheetRow2(row, sourceRowStart = 0) {
|
|
|
27820
27925
|
}
|
|
27821
27926
|
return exported;
|
|
27822
27927
|
}
|
|
27823
|
-
const fallback = { ...
|
|
27928
|
+
const fallback = { ...record2 };
|
|
27824
27929
|
applyFailureCellMeta(fallback, fallback[ENRICH_CELL_META_FIELD], {
|
|
27825
|
-
rowError:
|
|
27930
|
+
rowError: record2.error
|
|
27826
27931
|
});
|
|
27827
|
-
applyFailureCellMeta(fallback,
|
|
27828
|
-
rowError:
|
|
27932
|
+
applyFailureCellMeta(fallback, record2.cellMeta, {
|
|
27933
|
+
rowError: record2.error
|
|
27829
27934
|
});
|
|
27830
|
-
applyFailureCellMeta(fallback,
|
|
27831
|
-
rowError:
|
|
27935
|
+
applyFailureCellMeta(fallback, record2.cellMetaPatch, {
|
|
27936
|
+
rowError: record2.error
|
|
27832
27937
|
});
|
|
27833
27938
|
applyFailureCellMeta(fallback, fallback[ENRICH_CELL_META_PATCH_FIELD], {
|
|
27834
|
-
rowError:
|
|
27939
|
+
rowError: record2.error
|
|
27835
27940
|
});
|
|
27836
27941
|
for (const key of [
|
|
27837
27942
|
"key",
|
|
@@ -28050,16 +28155,16 @@ function isWaterfallResultMeaningful(value) {
|
|
|
28050
28155
|
return value.some(isWaterfallResultMeaningful);
|
|
28051
28156
|
}
|
|
28052
28157
|
if (value && typeof value === "object") {
|
|
28053
|
-
const
|
|
28054
|
-
const status = typeof
|
|
28158
|
+
const record2 = value;
|
|
28159
|
+
const status = typeof record2.status === "string" ? record2.status.trim().toLowerCase() : "";
|
|
28055
28160
|
if (status === "error" || status === "failed") {
|
|
28056
28161
|
return false;
|
|
28057
28162
|
}
|
|
28058
|
-
if (typeof
|
|
28163
|
+
if (typeof record2.error === "string" && record2.error.trim()) {
|
|
28059
28164
|
return false;
|
|
28060
28165
|
}
|
|
28061
|
-
if (Object.prototype.hasOwnProperty.call(
|
|
28062
|
-
return isWaterfallResultMeaningful(
|
|
28166
|
+
if (Object.prototype.hasOwnProperty.call(record2, "matched_result")) {
|
|
28167
|
+
return isWaterfallResultMeaningful(record2.matched_result);
|
|
28063
28168
|
}
|
|
28064
28169
|
for (const key of [
|
|
28065
28170
|
"value",
|
|
@@ -28074,11 +28179,11 @@ function isWaterfallResultMeaningful(value) {
|
|
|
28074
28179
|
"result",
|
|
28075
28180
|
"data"
|
|
28076
28181
|
]) {
|
|
28077
|
-
if (isWaterfallResultMeaningful(
|
|
28182
|
+
if (isWaterfallResultMeaningful(record2[key])) {
|
|
28078
28183
|
return true;
|
|
28079
28184
|
}
|
|
28080
28185
|
}
|
|
28081
|
-
return Object.entries(
|
|
28186
|
+
return Object.entries(record2).some(
|
|
28082
28187
|
([key, entry]) => !ENRICH_FLATTENED_CONTROL_FIELDS.has(key) && isWaterfallResultMeaningful(entry)
|
|
28083
28188
|
);
|
|
28084
28189
|
}
|
|
@@ -28094,8 +28199,8 @@ function stableRowSnapshot(value) {
|
|
|
28094
28199
|
return `[${value.map(stableRowSnapshot).join(",")}]`;
|
|
28095
28200
|
}
|
|
28096
28201
|
if (value && typeof value === "object") {
|
|
28097
|
-
const
|
|
28098
|
-
return `{${Object.keys(
|
|
28202
|
+
const record2 = value;
|
|
28203
|
+
return `{${Object.keys(record2).sort().map((key) => `${JSON.stringify(key)}:${stableRowSnapshot(record2[key])}`).join(",")}}`;
|
|
28099
28204
|
}
|
|
28100
28205
|
return JSON.stringify(value);
|
|
28101
28206
|
}
|
|
@@ -28682,8 +28787,8 @@ function addEnrichFollowUpCommand(commands, seen, command) {
|
|
|
28682
28787
|
seen.add(normalized);
|
|
28683
28788
|
commands.push({ ...command, command: normalized });
|
|
28684
28789
|
}
|
|
28685
|
-
function datasetSelectorForEnrichCommand(
|
|
28686
|
-
const candidates = [
|
|
28790
|
+
function datasetSelectorForEnrichCommand(record2, fallbackPath) {
|
|
28791
|
+
const candidates = [record2.path, record2.tableNamespace, fallbackPath];
|
|
28687
28792
|
for (const candidate of candidates) {
|
|
28688
28793
|
if (typeof candidate === "string" && candidate.trim()) {
|
|
28689
28794
|
return candidate.trim();
|
|
@@ -28745,19 +28850,19 @@ function collectDatasetFollowUpCommands(value, state) {
|
|
|
28745
28850
|
);
|
|
28746
28851
|
return;
|
|
28747
28852
|
}
|
|
28748
|
-
const
|
|
28749
|
-
const isDataset =
|
|
28853
|
+
const record2 = value;
|
|
28854
|
+
const isDataset = record2.kind === "dataset";
|
|
28750
28855
|
if (isDataset) {
|
|
28751
|
-
const selector = datasetSelectorForEnrichCommand(
|
|
28752
|
-
const labelPath = typeof
|
|
28753
|
-
if (typeof
|
|
28856
|
+
const selector = datasetSelectorForEnrichCommand(record2, state.path);
|
|
28857
|
+
const labelPath = typeof record2.path === "string" && record2.path.trim() ? record2.path.trim() : selector ?? state.path;
|
|
28858
|
+
if (typeof record2.queryDatasetCommand === "string") {
|
|
28754
28859
|
addEnrichFollowUpCommand(state.commands, state.seen, {
|
|
28755
28860
|
label: `query ${labelPath}`,
|
|
28756
28861
|
path: labelPath,
|
|
28757
|
-
command:
|
|
28862
|
+
command: record2.queryDatasetCommand
|
|
28758
28863
|
});
|
|
28759
28864
|
}
|
|
28760
|
-
const exportCommand = typeof
|
|
28865
|
+
const exportCommand = typeof record2.slowExportAsCsvCommand === "string" ? record2.slowExportAsCsvCommand : typeof record2.fullExportCommand === "string" ? record2.fullExportCommand : null;
|
|
28761
28866
|
if (exportCommand) {
|
|
28762
28867
|
addEnrichFollowUpCommand(state.commands, state.seen, {
|
|
28763
28868
|
label: `export ${labelPath}`,
|
|
@@ -28774,7 +28879,7 @@ function collectDatasetFollowUpCommands(value, state) {
|
|
|
28774
28879
|
});
|
|
28775
28880
|
}
|
|
28776
28881
|
}
|
|
28777
|
-
for (const [key, child] of Object.entries(
|
|
28882
|
+
for (const [key, child] of Object.entries(record2)) {
|
|
28778
28883
|
if (key === "preview" || key === "access") {
|
|
28779
28884
|
continue;
|
|
28780
28885
|
}
|
|
@@ -30206,9 +30311,9 @@ function readCodexSessionId(filePath) {
|
|
|
30206
30311
|
)) {
|
|
30207
30312
|
const parsed = parseJsonLine(line);
|
|
30208
30313
|
if (!parsed || typeof parsed !== "object") continue;
|
|
30209
|
-
const
|
|
30210
|
-
const payload =
|
|
30211
|
-
const id =
|
|
30314
|
+
const record2 = parsed;
|
|
30315
|
+
const payload = record2.payload && typeof record2.payload === "object" ? record2.payload : null;
|
|
30316
|
+
const id = record2.type === "session_meta" && typeof payload?.id === "string" ? payload.id : null;
|
|
30212
30317
|
if (id && UUID_RE.test(id)) return id;
|
|
30213
30318
|
}
|
|
30214
30319
|
} catch {
|
|
@@ -30307,15 +30412,15 @@ function messageContentKey(value) {
|
|
|
30307
30412
|
if (!Array.isArray(content)) return null;
|
|
30308
30413
|
return content.map((block) => {
|
|
30309
30414
|
if (!block || typeof block !== "object") return String(block);
|
|
30310
|
-
const
|
|
30311
|
-
const type = String(
|
|
30415
|
+
const record2 = block;
|
|
30416
|
+
const type = String(record2.type ?? "");
|
|
30312
30417
|
if (type === "tool_use") {
|
|
30313
|
-
return `tool_use:${String(
|
|
30418
|
+
return `tool_use:${String(record2.name ?? "")}:${String(record2.id ?? "")}`;
|
|
30314
30419
|
}
|
|
30315
30420
|
if (type === "tool_result") {
|
|
30316
|
-
return `tool_result:${String(
|
|
30421
|
+
return `tool_result:${String(record2.tool_use_id ?? "")}`;
|
|
30317
30422
|
}
|
|
30318
|
-
return String(
|
|
30423
|
+
return String(record2.text ?? type);
|
|
30319
30424
|
}).join("\n");
|
|
30320
30425
|
}
|
|
30321
30426
|
function dedupConsecutiveEvents(raw) {
|
|
@@ -30330,9 +30435,9 @@ function dedupConsecutiveEvents(raw) {
|
|
|
30330
30435
|
index += 1;
|
|
30331
30436
|
continue;
|
|
30332
30437
|
}
|
|
30333
|
-
const
|
|
30334
|
-
const eventType = String(
|
|
30335
|
-
const eventKey = messageContentKey(
|
|
30438
|
+
const record2 = event;
|
|
30439
|
+
const eventType = String(record2.type ?? "");
|
|
30440
|
+
const eventKey = messageContentKey(record2);
|
|
30336
30441
|
if (!["user", "assistant"].includes(eventType) || !eventKey) {
|
|
30337
30442
|
output2.push(rawLines[index] ?? "");
|
|
30338
30443
|
index += 1;
|
|
@@ -30351,9 +30456,9 @@ function dedupConsecutiveEvents(raw) {
|
|
|
30351
30456
|
cursor += 1;
|
|
30352
30457
|
}
|
|
30353
30458
|
if (runCount > 1) {
|
|
30354
|
-
|
|
30355
|
-
|
|
30356
|
-
output2.push(JSON.stringify(
|
|
30459
|
+
record2._repeat_count = runCount;
|
|
30460
|
+
record2._repeat_summary = `${runCount} consecutive identical ${eventType} messages collapsed`;
|
|
30461
|
+
output2.push(JSON.stringify(record2));
|
|
30357
30462
|
index = cursor;
|
|
30358
30463
|
continue;
|
|
30359
30464
|
}
|
|
@@ -30398,9 +30503,9 @@ function selectiveCompactToolResults(raw) {
|
|
|
30398
30503
|
lines.push(line);
|
|
30399
30504
|
continue;
|
|
30400
30505
|
}
|
|
30401
|
-
const
|
|
30402
|
-
if (
|
|
30403
|
-
const message =
|
|
30506
|
+
const record2 = parsed;
|
|
30507
|
+
if (record2.type === "user") {
|
|
30508
|
+
const message = record2.message;
|
|
30404
30509
|
const content = message && typeof message === "object" ? message.content : null;
|
|
30405
30510
|
if (Array.isArray(content)) {
|
|
30406
30511
|
message.content = content.map(
|
|
@@ -30408,7 +30513,7 @@ function selectiveCompactToolResults(raw) {
|
|
|
30408
30513
|
);
|
|
30409
30514
|
}
|
|
30410
30515
|
}
|
|
30411
|
-
lines.push(JSON.stringify(
|
|
30516
|
+
lines.push(JSON.stringify(record2));
|
|
30412
30517
|
}
|
|
30413
30518
|
return Buffer.from(lines.length > 0 ? `${lines.join("\n")}
|
|
30414
30519
|
` : "", "utf8");
|
|
@@ -30434,15 +30539,15 @@ function compactCodexEvents(raw) {
|
|
|
30434
30539
|
lines.push(rawLines[index] ?? "");
|
|
30435
30540
|
return;
|
|
30436
30541
|
}
|
|
30437
|
-
const
|
|
30438
|
-
if (
|
|
30439
|
-
const payload =
|
|
30542
|
+
const record2 = event;
|
|
30543
|
+
if (record2.type === "world_state") return;
|
|
30544
|
+
const payload = record2.payload;
|
|
30440
30545
|
const payloadType = payload && typeof payload === "object" ? String(payload.type ?? "") : "";
|
|
30441
30546
|
if (payloadType === "token_count" && index !== lastTokenCountIndex) return;
|
|
30442
30547
|
if (payloadType === "custom_tool_call_output" || payloadType === "function_call_output" || payloadType === "tool_search_output") {
|
|
30443
30548
|
const record_payload = payload;
|
|
30444
30549
|
record_payload.output = compactEventValue(record_payload.output);
|
|
30445
|
-
lines.push(JSON.stringify(
|
|
30550
|
+
lines.push(JSON.stringify(record2));
|
|
30446
30551
|
return;
|
|
30447
30552
|
}
|
|
30448
30553
|
lines.push(rawLines[index] ?? "");
|
|
@@ -30905,8 +31010,325 @@ Examples:
|
|
|
30905
31010
|
}
|
|
30906
31011
|
|
|
30907
31012
|
// src/cli/commands/monitors.ts
|
|
30908
|
-
import {
|
|
31013
|
+
import { randomUUID as randomUUID5 } from "crypto";
|
|
31014
|
+
import { readFileSync as readFileSync10, writeFileSync as writeFileSync12 } from "fs";
|
|
31015
|
+
import { resolve as resolve14 } from "path";
|
|
30909
31016
|
import { createInterface } from "readline/promises";
|
|
31017
|
+
|
|
31018
|
+
// src/monitor-fleet-contract.ts
|
|
31019
|
+
var MONITOR_FLEET_MAX_MEMBERS = 1e3;
|
|
31020
|
+
var MONITOR_FLEET_AUTHORING_CONTRACT_EDITION = 1;
|
|
31021
|
+
var SUPPORTED_MONITOR_FLEET_AUTHORING_CONTRACT_EDITIONS = [
|
|
31022
|
+
MONITOR_FLEET_AUTHORING_CONTRACT_EDITION
|
|
31023
|
+
];
|
|
31024
|
+
var MONITOR_FLEET_REMOVAL_GRACE_MS = 7 * 24 * 60 * 6e4;
|
|
31025
|
+
var MONITOR_FLEET_DOCUMENTATION = {
|
|
31026
|
+
summary: "A Monitor Fleet keeps one bounded, sticky set of ordinary monitors aligned with Customer DB rows.",
|
|
31027
|
+
authoredFields: {
|
|
31028
|
+
id: "Stable lowercase fleet id used by sync, pause, resume, and deactivate.",
|
|
31029
|
+
source: "Customer DB table, unique row key, and optional equality filters that select candidate rows.",
|
|
31030
|
+
member: "Ordinary monitor tool, stable key template, and payload evaluated for each selected source row.",
|
|
31031
|
+
selection: "Deterministic ranking and an active-member limit between 1 and 1,000."
|
|
31032
|
+
},
|
|
31033
|
+
fixedPolicy: {
|
|
31034
|
+
cadence: "daily",
|
|
31035
|
+
membership: "sticky",
|
|
31036
|
+
removalGrace: "7d",
|
|
31037
|
+
onRemoved: "deactivate",
|
|
31038
|
+
ownership: "A Fleet may adopt a same-tool ordinary monitor with its deterministic member key. The first Fleet claim wins; another Fleet or a different tool receives a conflict.",
|
|
31039
|
+
billing: "No Fleet fee, permit, or renewal. Dry-run reports ordinary monitor lifecycle charges due now."
|
|
31040
|
+
},
|
|
31041
|
+
stickyMembership: "Ranking fills vacancies but never replaces a current member merely because another row ranks higher.",
|
|
31042
|
+
columnExpression: 'Use { "$fleet": "column", "name": "column_name" } in a member key or payload to read a value from each source row.'
|
|
31043
|
+
};
|
|
31044
|
+
function record(value) {
|
|
31045
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
31046
|
+
}
|
|
31047
|
+
function identifier(value) {
|
|
31048
|
+
return typeof value === "string" && /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
31049
|
+
}
|
|
31050
|
+
function exactKeys(input2, keys, path, issues) {
|
|
31051
|
+
if (!input2) return;
|
|
31052
|
+
for (const key of Object.keys(input2)) {
|
|
31053
|
+
if (keys.includes(key)) continue;
|
|
31054
|
+
issues.push({
|
|
31055
|
+
path: path ? `${path}.${key}` : key,
|
|
31056
|
+
code: "unknown_fleet_field",
|
|
31057
|
+
message: `${path || "Fleet"} does not accept '${key}'.`
|
|
31058
|
+
});
|
|
31059
|
+
}
|
|
31060
|
+
}
|
|
31061
|
+
function jsonValue(value, path, issues) {
|
|
31062
|
+
if (value === null || typeof value === "string" || typeof value === "boolean" || typeof value === "number" && Number.isFinite(value)) {
|
|
31063
|
+
return;
|
|
31064
|
+
}
|
|
31065
|
+
if (Array.isArray(value)) {
|
|
31066
|
+
value.forEach((item, index) => jsonValue(item, `${path}.${index}`, issues));
|
|
31067
|
+
return;
|
|
31068
|
+
}
|
|
31069
|
+
const input2 = record(value);
|
|
31070
|
+
if (!input2) {
|
|
31071
|
+
issues.push({
|
|
31072
|
+
path,
|
|
31073
|
+
code: "invalid_fleet_json_value",
|
|
31074
|
+
message: "Fleet payload values must be JSON values."
|
|
31075
|
+
});
|
|
31076
|
+
return;
|
|
31077
|
+
}
|
|
31078
|
+
for (const [key, item] of Object.entries(input2)) {
|
|
31079
|
+
jsonValue(item, `${path}.${key}`, issues);
|
|
31080
|
+
}
|
|
31081
|
+
}
|
|
31082
|
+
function validateExpression(value, path, issues) {
|
|
31083
|
+
const input2 = record(value);
|
|
31084
|
+
if (!input2 || input2.$fleet !== "column" || !identifier(input2.name)) {
|
|
31085
|
+
issues.push({
|
|
31086
|
+
path,
|
|
31087
|
+
code: "invalid_fleet_expression",
|
|
31088
|
+
message: "Fleet expressions must be an exact tagged column reference."
|
|
31089
|
+
});
|
|
31090
|
+
return;
|
|
31091
|
+
}
|
|
31092
|
+
exactKeys(input2, ["$fleet", "name"], path, issues);
|
|
31093
|
+
}
|
|
31094
|
+
function walkPayload(value, path, issues) {
|
|
31095
|
+
if (Array.isArray(value)) {
|
|
31096
|
+
value.forEach(
|
|
31097
|
+
(item, index) => walkPayload(item, `${path}.${index}`, issues)
|
|
31098
|
+
);
|
|
31099
|
+
return;
|
|
31100
|
+
}
|
|
31101
|
+
const input2 = record(value);
|
|
31102
|
+
if (!input2) return;
|
|
31103
|
+
if ("$fleet" in input2) {
|
|
31104
|
+
validateExpression(input2, path, issues);
|
|
31105
|
+
return;
|
|
31106
|
+
}
|
|
31107
|
+
for (const [key, item] of Object.entries(input2)) {
|
|
31108
|
+
walkPayload(item, `${path}.${key}`, issues);
|
|
31109
|
+
}
|
|
31110
|
+
}
|
|
31111
|
+
function validateMonitorFleetDefinition(value) {
|
|
31112
|
+
const issues = [];
|
|
31113
|
+
const input2 = record(value);
|
|
31114
|
+
if (!input2) {
|
|
31115
|
+
return {
|
|
31116
|
+
valid: false,
|
|
31117
|
+
issues: [
|
|
31118
|
+
{
|
|
31119
|
+
path: "",
|
|
31120
|
+
code: "invalid_fleet",
|
|
31121
|
+
message: "Fleet must be an object."
|
|
31122
|
+
}
|
|
31123
|
+
]
|
|
31124
|
+
};
|
|
31125
|
+
}
|
|
31126
|
+
exactKeys(input2, ["id", "source", "member", "selection"], "", issues);
|
|
31127
|
+
if (typeof input2.id !== "string" || !/^[a-z][a-z0-9-]{0,199}$/.test(input2.id)) {
|
|
31128
|
+
issues.push({
|
|
31129
|
+
path: "id",
|
|
31130
|
+
code: "invalid_fleet_id",
|
|
31131
|
+
message: "Fleet id must be lowercase kebab-case."
|
|
31132
|
+
});
|
|
31133
|
+
}
|
|
31134
|
+
const source = record(input2.source);
|
|
31135
|
+
exactKeys(
|
|
31136
|
+
source,
|
|
31137
|
+
["kind", "schema", "table", "key", "where"],
|
|
31138
|
+
"source",
|
|
31139
|
+
issues
|
|
31140
|
+
);
|
|
31141
|
+
if (!source || source.kind !== "customer_db_table") {
|
|
31142
|
+
issues.push({
|
|
31143
|
+
path: "source.kind",
|
|
31144
|
+
code: "invalid_fleet_source",
|
|
31145
|
+
message: "Beta fleets require customer_db_table."
|
|
31146
|
+
});
|
|
31147
|
+
}
|
|
31148
|
+
if (!identifier(source?.schema) || !identifier(source?.table)) {
|
|
31149
|
+
issues.push({
|
|
31150
|
+
path: "source",
|
|
31151
|
+
code: "invalid_fleet_table",
|
|
31152
|
+
message: "Source schema and table must be SQL identifiers."
|
|
31153
|
+
});
|
|
31154
|
+
}
|
|
31155
|
+
const sourceKey = record(source?.key);
|
|
31156
|
+
exactKeys(sourceKey, ["column", "type"], "source.key", issues);
|
|
31157
|
+
if (!sourceKey || !identifier(sourceKey.column) || !["text", "uuid", "int4", "int8"].includes(String(sourceKey.type))) {
|
|
31158
|
+
issues.push({
|
|
31159
|
+
path: "source.key",
|
|
31160
|
+
code: "invalid_fleet_source_key",
|
|
31161
|
+
message: "Source key must name a supported typed column."
|
|
31162
|
+
});
|
|
31163
|
+
}
|
|
31164
|
+
if (source?.where !== void 0) {
|
|
31165
|
+
const where = record(source.where);
|
|
31166
|
+
if (!where) {
|
|
31167
|
+
issues.push({
|
|
31168
|
+
path: "source.where",
|
|
31169
|
+
code: "invalid_fleet_where",
|
|
31170
|
+
message: "source.where must be an object of equality values."
|
|
31171
|
+
});
|
|
31172
|
+
} else {
|
|
31173
|
+
for (const [column, expected] of Object.entries(where)) {
|
|
31174
|
+
if (!identifier(column)) {
|
|
31175
|
+
issues.push({
|
|
31176
|
+
path: `source.where.${column}`,
|
|
31177
|
+
code: "invalid_fleet_where_column",
|
|
31178
|
+
message: "source.where keys must be SQL identifiers."
|
|
31179
|
+
});
|
|
31180
|
+
}
|
|
31181
|
+
if (expected !== null && typeof expected !== "string" && typeof expected !== "boolean" && !(typeof expected === "number" && Number.isFinite(expected))) {
|
|
31182
|
+
issues.push({
|
|
31183
|
+
path: `source.where.${column}`,
|
|
31184
|
+
code: "invalid_fleet_where_value",
|
|
31185
|
+
message: "source.where values must be finite JSON scalars or null."
|
|
31186
|
+
});
|
|
31187
|
+
}
|
|
31188
|
+
}
|
|
31189
|
+
}
|
|
31190
|
+
}
|
|
31191
|
+
const member = record(input2.member);
|
|
31192
|
+
exactKeys(member, ["tool", "key", "payload"], "member", issues);
|
|
31193
|
+
const key = record(member?.key);
|
|
31194
|
+
if (!member || typeof member.tool !== "string" || !member.tool.trim()) {
|
|
31195
|
+
issues.push({
|
|
31196
|
+
path: "member.tool",
|
|
31197
|
+
code: "invalid_fleet_tool",
|
|
31198
|
+
message: "Member tool is required."
|
|
31199
|
+
});
|
|
31200
|
+
}
|
|
31201
|
+
if (!key || key.$fleet !== "template" || !Array.isArray(key.parts) || key.parts.length === 0) {
|
|
31202
|
+
issues.push({
|
|
31203
|
+
path: "member.key",
|
|
31204
|
+
code: "invalid_fleet_key",
|
|
31205
|
+
message: "Member key must be a tagged fleet template."
|
|
31206
|
+
});
|
|
31207
|
+
} else {
|
|
31208
|
+
exactKeys(key, ["$fleet", "parts"], "member.key", issues);
|
|
31209
|
+
for (const [index, part] of key.parts.entries()) {
|
|
31210
|
+
if (typeof part !== "string")
|
|
31211
|
+
validateExpression(part, `member.key.parts.${index}`, issues);
|
|
31212
|
+
}
|
|
31213
|
+
if (sourceKey && !key.parts.some(
|
|
31214
|
+
(part) => record(part)?.$fleet === "column" && record(part)?.name === sourceKey.column
|
|
31215
|
+
)) {
|
|
31216
|
+
issues.push({
|
|
31217
|
+
path: "member.key.parts",
|
|
31218
|
+
code: "fleet_key_missing_source_key",
|
|
31219
|
+
message: "Member key must include the source key column."
|
|
31220
|
+
});
|
|
31221
|
+
}
|
|
31222
|
+
}
|
|
31223
|
+
if (!member || !("payload" in member)) {
|
|
31224
|
+
issues.push({
|
|
31225
|
+
path: "member.payload",
|
|
31226
|
+
code: "invalid_fleet_payload",
|
|
31227
|
+
message: "Member payload is required."
|
|
31228
|
+
});
|
|
31229
|
+
} else {
|
|
31230
|
+
jsonValue(member.payload, "member.payload", issues);
|
|
31231
|
+
}
|
|
31232
|
+
walkPayload(member?.payload, "member.payload", issues);
|
|
31233
|
+
const selection = record(input2.selection);
|
|
31234
|
+
exactKeys(selection, ["limit", "orderBy", "membership"], "selection", issues);
|
|
31235
|
+
if (!selection || !Number.isSafeInteger(selection.limit) || Number(selection.limit) < 1 || Number(selection.limit) > MONITOR_FLEET_MAX_MEMBERS) {
|
|
31236
|
+
issues.push({
|
|
31237
|
+
path: "selection.limit",
|
|
31238
|
+
code: "MONITOR_FLEET_LIMIT_EXCEEDED",
|
|
31239
|
+
message: "selection.limit must be between 1 and 1,000."
|
|
31240
|
+
});
|
|
31241
|
+
}
|
|
31242
|
+
if (selection?.membership !== "sticky") {
|
|
31243
|
+
issues.push({
|
|
31244
|
+
path: "selection.membership",
|
|
31245
|
+
code: "invalid_fleet_membership",
|
|
31246
|
+
message: `Fleet membership is fixed to ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.membership}. ${MONITOR_FLEET_DOCUMENTATION.stickyMembership}`
|
|
31247
|
+
});
|
|
31248
|
+
}
|
|
31249
|
+
const orderBy = selection?.orderBy;
|
|
31250
|
+
if (!Array.isArray(orderBy) || orderBy.length === 0) {
|
|
31251
|
+
issues.push({
|
|
31252
|
+
path: "selection.orderBy",
|
|
31253
|
+
code: "invalid_fleet_order",
|
|
31254
|
+
message: "At least one deterministic order field is required."
|
|
31255
|
+
});
|
|
31256
|
+
} else {
|
|
31257
|
+
const orderColumns = /* @__PURE__ */ new Set();
|
|
31258
|
+
for (const [index, order] of orderBy.entries()) {
|
|
31259
|
+
const item = record(order);
|
|
31260
|
+
exactKeys(
|
|
31261
|
+
item,
|
|
31262
|
+
["column", "direction"],
|
|
31263
|
+
`selection.orderBy.${index}`,
|
|
31264
|
+
issues
|
|
31265
|
+
);
|
|
31266
|
+
if (!item || !identifier(item.column) || !["asc", "desc"].includes(String(item.direction))) {
|
|
31267
|
+
issues.push({
|
|
31268
|
+
path: `selection.orderBy.${index}`,
|
|
31269
|
+
code: "invalid_fleet_order",
|
|
31270
|
+
message: "Order fields need a column and asc/desc direction."
|
|
31271
|
+
});
|
|
31272
|
+
} else if (orderColumns.has(item.column)) {
|
|
31273
|
+
issues.push({
|
|
31274
|
+
path: `selection.orderBy.${index}.column`,
|
|
31275
|
+
code: "duplicate_fleet_order_column",
|
|
31276
|
+
message: "Each selection order column may appear only once."
|
|
31277
|
+
});
|
|
31278
|
+
} else {
|
|
31279
|
+
orderColumns.add(item.column);
|
|
31280
|
+
}
|
|
31281
|
+
}
|
|
31282
|
+
if (sourceKey && record(orderBy.at(-1))?.column !== sourceKey.column) {
|
|
31283
|
+
issues.push({
|
|
31284
|
+
path: "selection.orderBy",
|
|
31285
|
+
code: "fleet_order_missing_key",
|
|
31286
|
+
message: "The final order field must be the source key."
|
|
31287
|
+
});
|
|
31288
|
+
}
|
|
31289
|
+
}
|
|
31290
|
+
for (const removedOption of ["spendLimits", "lifecycle", "reconciliation"]) {
|
|
31291
|
+
if (removedOption in input2) {
|
|
31292
|
+
issues.push({
|
|
31293
|
+
path: removedOption,
|
|
31294
|
+
code: "unsupported_fleet_option",
|
|
31295
|
+
message: `${removedOption} is fixed by Monitor Fleets and must be omitted. Fleets sync ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.cadence} and ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.onRemoved} members after ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.removalGrace} absent from the source.`
|
|
31296
|
+
});
|
|
31297
|
+
}
|
|
31298
|
+
}
|
|
31299
|
+
return issues.length === 0 ? { valid: true, definition: value, issues } : { valid: false, issues };
|
|
31300
|
+
}
|
|
31301
|
+
function admitMonitorFleetAuthoringContract(value, edition = MONITOR_FLEET_AUTHORING_CONTRACT_EDITION) {
|
|
31302
|
+
if (!SUPPORTED_MONITOR_FLEET_AUTHORING_CONTRACT_EDITIONS.includes(
|
|
31303
|
+
edition
|
|
31304
|
+
)) {
|
|
31305
|
+
return {
|
|
31306
|
+
valid: false,
|
|
31307
|
+
issues: [
|
|
31308
|
+
{
|
|
31309
|
+
path: "authoring_contract_edition",
|
|
31310
|
+
code: "unsupported_fleet_authoring_contract_edition",
|
|
31311
|
+
message: `Monitor Fleet authoring contract edition ${edition} is not supported.`
|
|
31312
|
+
}
|
|
31313
|
+
]
|
|
31314
|
+
};
|
|
31315
|
+
}
|
|
31316
|
+
const result = validateMonitorFleetDefinition(value);
|
|
31317
|
+
return result.valid && result.definition ? {
|
|
31318
|
+
valid: true,
|
|
31319
|
+
contract: {
|
|
31320
|
+
edition,
|
|
31321
|
+
// JSON cloning prevents later caller mutation from changing the
|
|
31322
|
+
// admitted snapshot.
|
|
31323
|
+
definition: JSON.parse(
|
|
31324
|
+
JSON.stringify(result.definition)
|
|
31325
|
+
)
|
|
31326
|
+
},
|
|
31327
|
+
issues: []
|
|
31328
|
+
} : { valid: false, issues: result.issues };
|
|
31329
|
+
}
|
|
31330
|
+
|
|
31331
|
+
// src/cli/commands/monitors.ts
|
|
30910
31332
|
var JSON_OPTION_DESCRIPTION = "Emit JSON output. Also automatic when stdout is piped";
|
|
30911
31333
|
function withJsonOption(command) {
|
|
30912
31334
|
return command.option("--json", JSON_OPTION_DESCRIPTION);
|
|
@@ -30928,6 +31350,7 @@ var MonitorDryRunUnsupportedError = class extends Error {
|
|
|
30928
31350
|
};
|
|
30929
31351
|
function monitorsErrorExitCode(error) {
|
|
30930
31352
|
if (error instanceof MonitorsUsageError) return 2;
|
|
31353
|
+
if (error instanceof MonitorFleetStateError) return 6;
|
|
30931
31354
|
if (error instanceof AuthError) return 3;
|
|
30932
31355
|
if (error instanceof DeeplineError) {
|
|
30933
31356
|
const status = error.statusCode;
|
|
@@ -30938,12 +31361,14 @@ function monitorsErrorExitCode(error) {
|
|
|
30938
31361
|
}
|
|
30939
31362
|
return 5;
|
|
30940
31363
|
}
|
|
30941
|
-
function monitorsFailureNextCommand(error, exitCode) {
|
|
31364
|
+
function monitorsFailureNextCommand(error, exitCode, options) {
|
|
31365
|
+
if (error instanceof MonitorFleetStateError) return error.next;
|
|
30942
31366
|
if (error instanceof DeeplineError) {
|
|
30943
31367
|
const response = asRecord2(asRecord2(error.details)?.response);
|
|
30944
|
-
const
|
|
30945
|
-
if (
|
|
31368
|
+
const serverNext = asString(response?.next) ?? asString(response?.next_action);
|
|
31369
|
+
if (serverNext) return serverNext;
|
|
30946
31370
|
}
|
|
31371
|
+
if (exitCode === 5 && options?.retryCommand) return options.retryCommand;
|
|
30947
31372
|
if (error instanceof DeeplineError && error.code === "monitor_access_required") {
|
|
30948
31373
|
return "deepline monitors status";
|
|
30949
31374
|
}
|
|
@@ -30969,9 +31394,10 @@ function readValidationIssues(error) {
|
|
|
30969
31394
|
];
|
|
30970
31395
|
});
|
|
30971
31396
|
}
|
|
30972
|
-
function reportMonitorsFailure(error) {
|
|
31397
|
+
function reportMonitorsFailure(error, options) {
|
|
30973
31398
|
const exitCode = monitorsErrorExitCode(error);
|
|
30974
|
-
const next = monitorsFailureNextCommand(error, exitCode);
|
|
31399
|
+
const next = monitorsFailureNextCommand(error, exitCode, options);
|
|
31400
|
+
const retrySafe = exitCode === 5 && options?.retryCommand !== void 0;
|
|
30975
31401
|
const wantsJson = shouldEmitJson(process.argv.includes("--json"));
|
|
30976
31402
|
if (wantsJson) {
|
|
30977
31403
|
const payload = errorToJsonPayload(error);
|
|
@@ -30979,10 +31405,15 @@ function reportMonitorsFailure(error) {
|
|
|
30979
31405
|
ok: false,
|
|
30980
31406
|
exitCode,
|
|
30981
31407
|
...next ? { next } : {},
|
|
30982
|
-
|
|
31408
|
+
...retrySafe ? { retry_safe: true } : {},
|
|
31409
|
+
error: retrySafe ? {
|
|
31410
|
+
...payload.error,
|
|
31411
|
+
message: `${payload.error.message} ${FLEET_RETRY_SAFE_NOTE}`
|
|
31412
|
+
} : payload.error
|
|
30983
31413
|
});
|
|
30984
31414
|
} else {
|
|
30985
|
-
const
|
|
31415
|
+
const base = error instanceof Error ? error.message : String(error);
|
|
31416
|
+
const message = retrySafe ? `${base} ${FLEET_RETRY_SAFE_NOTE}` : base;
|
|
30986
31417
|
process.stderr.write(`Error: ${message}
|
|
30987
31418
|
`);
|
|
30988
31419
|
for (const issue of readValidationIssues(error)) {
|
|
@@ -31533,6 +31964,724 @@ async function handleMonitorsDeploy(definition, options) {
|
|
|
31533
31964
|
text: renderMonitorDeployCompletion(payload)
|
|
31534
31965
|
});
|
|
31535
31966
|
}
|
|
31967
|
+
function fleetIntegerOption(raw, flag) {
|
|
31968
|
+
if (raw === void 0) return void 0;
|
|
31969
|
+
const value = Number(raw);
|
|
31970
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
31971
|
+
throw new MonitorsUsageError(`${flag} must be a non-negative integer.`);
|
|
31972
|
+
}
|
|
31973
|
+
return value;
|
|
31974
|
+
}
|
|
31975
|
+
function fleetIdempotencyKey(operation, supplied) {
|
|
31976
|
+
const normalized = supplied?.trim();
|
|
31977
|
+
if (supplied !== void 0 && !normalized) {
|
|
31978
|
+
throw new MonitorsUsageError("--idempotency-key must not be empty.");
|
|
31979
|
+
}
|
|
31980
|
+
return normalized ?? `monitor-fleet-${operation}-${randomUUID5()}`;
|
|
31981
|
+
}
|
|
31982
|
+
var FLEET_COUNT_KEYS = [
|
|
31983
|
+
"pending",
|
|
31984
|
+
"submitting",
|
|
31985
|
+
"rate_limited",
|
|
31986
|
+
"settled",
|
|
31987
|
+
"blocked",
|
|
31988
|
+
"failed"
|
|
31989
|
+
];
|
|
31990
|
+
var FLEET_DEFAULT_WAIT_MS = 10 * 6e4;
|
|
31991
|
+
var FLEET_POLL_INTERVAL_MS = 2e3;
|
|
31992
|
+
var FLEET_PLAIN_PROGRESS_INTERVAL_MS = 15e3;
|
|
31993
|
+
var FLEET_RETRY_SAFE_NOTE = "Safe to retry \u2014 every fleet command is idempotent.";
|
|
31994
|
+
var MONITOR_FLEET_LIFECYCLE = [
|
|
31995
|
+
{
|
|
31996
|
+
step: 1,
|
|
31997
|
+
what: "Write a definition file you can read and edit.",
|
|
31998
|
+
command: "deepline monitors fleets init <fleet-id> --source public.accounts --key account_id --tool <tool> --payload '<json>' --out fleet.json"
|
|
31999
|
+
},
|
|
32000
|
+
{
|
|
32001
|
+
step: 2,
|
|
32002
|
+
what: "See the plan and the credits before anything changes.",
|
|
32003
|
+
command: "deepline monitors fleets sync --file fleet.json --dry-run"
|
|
32004
|
+
},
|
|
32005
|
+
{
|
|
32006
|
+
step: 3,
|
|
32007
|
+
what: "Apply it and wait for the server to call it converged.",
|
|
32008
|
+
command: "deepline monitors fleets sync --file fleet.json --wait"
|
|
32009
|
+
},
|
|
32010
|
+
{
|
|
32011
|
+
step: 4,
|
|
32012
|
+
what: "Read live state; add --drift to see what has not settled.",
|
|
32013
|
+
command: "deepline monitors fleets get <fleet-id>"
|
|
32014
|
+
}
|
|
32015
|
+
];
|
|
32016
|
+
var MONITOR_FLEET_COMMANDS = [
|
|
32017
|
+
{ name: "init", summary: "Write a Fleet definition JSON file." },
|
|
32018
|
+
{
|
|
32019
|
+
name: "sync",
|
|
32020
|
+
summary: "Create or re-plan a fleet from a definition file or its stored config."
|
|
32021
|
+
},
|
|
32022
|
+
{
|
|
32023
|
+
name: "get",
|
|
32024
|
+
summary: "Read one fleet, list every fleet, or inspect drift."
|
|
32025
|
+
},
|
|
32026
|
+
{
|
|
32027
|
+
name: "deactivate",
|
|
32028
|
+
summary: "Deactivate a fleet and the monitors it owns."
|
|
32029
|
+
}
|
|
32030
|
+
];
|
|
32031
|
+
var MONITOR_FLEET_AGENT_NOTES = [
|
|
32032
|
+
"Add --json for stable output; stdout is always exactly one JSON object.",
|
|
32033
|
+
"Every error includes a runnable `next` command \u2014 run it, do not guess.",
|
|
32034
|
+
"Exit 5 = retry the same command; 6 = inspect counts with `get --drift`; 7 = change the request."
|
|
32035
|
+
];
|
|
32036
|
+
var MONITOR_FLEET_HELP_EPILOG = `
|
|
32037
|
+
Agent notes:
|
|
32038
|
+
${MONITOR_FLEET_AGENT_NOTES.join("\n ")}
|
|
32039
|
+
`;
|
|
32040
|
+
var MonitorFleetStateError = class extends Error {
|
|
32041
|
+
code;
|
|
32042
|
+
next;
|
|
32043
|
+
constructor(input2) {
|
|
32044
|
+
super(input2.message);
|
|
32045
|
+
this.name = "MonitorFleetStateError";
|
|
32046
|
+
this.code = input2.code;
|
|
32047
|
+
this.next = input2.next;
|
|
32048
|
+
}
|
|
32049
|
+
};
|
|
32050
|
+
function fleetCounts(payload) {
|
|
32051
|
+
const raw = asRecord2(payload.counts) ?? {};
|
|
32052
|
+
const counts = {};
|
|
32053
|
+
for (const key of FLEET_COUNT_KEYS) {
|
|
32054
|
+
counts[key] = asFiniteNumber(raw[key]) ?? 0;
|
|
32055
|
+
}
|
|
32056
|
+
return counts;
|
|
32057
|
+
}
|
|
32058
|
+
function fleetShellArg(value) {
|
|
32059
|
+
return /^[A-Za-z0-9._/@:=-]+$/.test(value) ? value : `'${value.replaceAll("'", `'\\''`)}'`;
|
|
32060
|
+
}
|
|
32061
|
+
function fleetJsonFlag(options) {
|
|
32062
|
+
return options.json ? ["--json"] : [];
|
|
32063
|
+
}
|
|
32064
|
+
function fleetTimeoutMs(raw) {
|
|
32065
|
+
if (raw === void 0) return FLEET_DEFAULT_WAIT_MS;
|
|
32066
|
+
const match = /^(\d+)(ms|s|m|h)?$/.exec(raw.trim());
|
|
32067
|
+
if (!match) {
|
|
32068
|
+
throw new MonitorsUsageError(
|
|
32069
|
+
"--timeout must be a duration like 500ms, 90s, 10m, or 1h (a bare number is seconds)."
|
|
32070
|
+
);
|
|
32071
|
+
}
|
|
32072
|
+
const value = Number(match[1]);
|
|
32073
|
+
if (!value) {
|
|
32074
|
+
throw new MonitorsUsageError("--timeout must be greater than zero.");
|
|
32075
|
+
}
|
|
32076
|
+
const unit = match[2] ?? "s";
|
|
32077
|
+
const factor = unit === "ms" ? 1 : unit === "s" ? 1e3 : unit === "m" ? 6e4 : 36e5;
|
|
32078
|
+
return value * factor;
|
|
32079
|
+
}
|
|
32080
|
+
function fleetServerNext(payload) {
|
|
32081
|
+
return asString(payload.next) ?? asString(payload.next_action);
|
|
32082
|
+
}
|
|
32083
|
+
function fleetStatus(payload) {
|
|
32084
|
+
return asString(payload.status);
|
|
32085
|
+
}
|
|
32086
|
+
function fleetProgressReporter() {
|
|
32087
|
+
const interactive = process.stderr.isTTY === true;
|
|
32088
|
+
let wrote = false;
|
|
32089
|
+
let lastPlainAt = 0;
|
|
32090
|
+
return {
|
|
32091
|
+
report: (payload) => {
|
|
32092
|
+
const counts = fleetCounts(payload);
|
|
32093
|
+
const expected = asFiniteNumber(payload.expected) ?? FLEET_COUNT_KEYS.reduce((sum, key) => sum + counts[key], 0);
|
|
32094
|
+
const line = `settled ${counts.settled}/${expected} \xB7 rate_limited ${counts.rate_limited} \xB7 blocked ${counts.blocked}`;
|
|
32095
|
+
if (interactive) {
|
|
32096
|
+
process.stderr.write(`\r\x1B[2K${line}`);
|
|
32097
|
+
wrote = true;
|
|
32098
|
+
return;
|
|
32099
|
+
}
|
|
32100
|
+
const now = Date.now();
|
|
32101
|
+
if (wrote && now - lastPlainAt < FLEET_PLAIN_PROGRESS_INTERVAL_MS) return;
|
|
32102
|
+
lastPlainAt = now;
|
|
32103
|
+
wrote = true;
|
|
32104
|
+
process.stderr.write(`${line}
|
|
32105
|
+
`);
|
|
32106
|
+
},
|
|
32107
|
+
finish: () => {
|
|
32108
|
+
if (interactive && wrote) process.stderr.write("\n");
|
|
32109
|
+
}
|
|
32110
|
+
};
|
|
32111
|
+
}
|
|
32112
|
+
function fleetPlanLine(payload) {
|
|
32113
|
+
const plan = asRecord2(payload.plan) ?? {};
|
|
32114
|
+
const blocked = asRecord2(plan.blocked) ?? {};
|
|
32115
|
+
const entries = Object.entries(blocked).flatMap(([limitId, raw]) => {
|
|
32116
|
+
const count = asFiniteNumber(raw);
|
|
32117
|
+
return count === void 0 ? [] : [[limitId, count]];
|
|
32118
|
+
}).sort(([left], [right]) => left.localeCompare(right));
|
|
32119
|
+
const blockedTotal = entries.reduce((sum, [, count]) => sum + count, 0);
|
|
32120
|
+
const detail = entries.length === 0 ? "" : entries.length === 1 ? ` (${entries[0][0]})` : ` (${entries.map(([id, count]) => `${id}: ${count}`).join(", ")})`;
|
|
32121
|
+
return [
|
|
32122
|
+
`creates ${asFiniteNumber(plan.creates) ?? 0}`,
|
|
32123
|
+
`updates ${asFiniteNumber(plan.updates) ?? 0}`,
|
|
32124
|
+
`removes ${asFiniteNumber(plan.removes) ?? 0}`,
|
|
32125
|
+
`blocked ${blockedTotal}${detail}`
|
|
32126
|
+
].join(" \xB7 ");
|
|
32127
|
+
}
|
|
32128
|
+
function fleetCountsLine(payload) {
|
|
32129
|
+
const counts = fleetCounts(payload);
|
|
32130
|
+
return FLEET_COUNT_KEYS.map((key) => `${key} ${counts[key]}`).join(" \xB7 ");
|
|
32131
|
+
}
|
|
32132
|
+
function renderFleetSync(payload, input2) {
|
|
32133
|
+
const lines = [
|
|
32134
|
+
input2.dryRun ? `Fleet ${input2.fleetId} \u2014 plan only, nothing changed` : `Fleet ${input2.fleetId} \u2014 accepted`,
|
|
32135
|
+
` plan ${fleetPlanLine(payload)}`
|
|
32136
|
+
];
|
|
32137
|
+
const credits = asFiniteNumber(payload.credits_due_now);
|
|
32138
|
+
lines.push(` credits due now ${credits ?? 0}`);
|
|
32139
|
+
lines.push(
|
|
32140
|
+
` generation ${asFiniteNumber(payload.generation) ?? "unknown"} \xB7 replayed ${yesNo(
|
|
32141
|
+
payload.replayed
|
|
32142
|
+
)} \xB7 idempotency key ${input2.idempotencyKey}`
|
|
32143
|
+
);
|
|
32144
|
+
const next = fleetServerNext(payload);
|
|
32145
|
+
if (next) lines.push(`Next: ${next}`);
|
|
32146
|
+
return `${lines.join("\n")}
|
|
32147
|
+
`;
|
|
32148
|
+
}
|
|
32149
|
+
function renderFleetGet(payload) {
|
|
32150
|
+
const id = asString(payload.id) ?? "unknown";
|
|
32151
|
+
const status = fleetStatus(payload) ?? "unknown";
|
|
32152
|
+
const lines = [
|
|
32153
|
+
`Fleet ${id} \u2014 ${status}`,
|
|
32154
|
+
` monitors ${asFiniteNumber(payload.live) ?? 0} live / ${asFiniteNumber(payload.expected) ?? 0} expected`,
|
|
32155
|
+
` counts ${fleetCountsLine(payload)}`,
|
|
32156
|
+
` generation ${asFiniteNumber(payload.generation) ?? "unknown"} \xB7 converged generation ${asFiniteNumber(payload.converged_generation) ?? "none"}`
|
|
32157
|
+
];
|
|
32158
|
+
lines.push(...renderFleetDriftRows(payload));
|
|
32159
|
+
const next = fleetServerNext(payload) ?? (status === "degraded" ? `deepline monitors fleets get ${fleetShellArg(id)} --drift` : void 0);
|
|
32160
|
+
if (next) lines.push(`Next: ${next}`);
|
|
32161
|
+
return `${lines.join("\n")}
|
|
32162
|
+
`;
|
|
32163
|
+
}
|
|
32164
|
+
function renderFleetDriftRows(payload) {
|
|
32165
|
+
const drift = Array.isArray(payload.drift) ? payload.drift : void 0;
|
|
32166
|
+
if (!drift) return [];
|
|
32167
|
+
const rows = drift.flatMap((raw) => {
|
|
32168
|
+
const row = asRecord2(raw);
|
|
32169
|
+
return row ? [row] : [];
|
|
32170
|
+
}).map((row) => ({
|
|
32171
|
+
monitorKey: asString(row.monitor_key) ?? "-",
|
|
32172
|
+
entityKey: asString(row.entity_key) ?? "-",
|
|
32173
|
+
convergence: asString(row.convergence) ?? "-",
|
|
32174
|
+
since: asString(row.since) ?? "-",
|
|
32175
|
+
detail: asString(row.error) ?? (asString(row.blocked_by) ? `blocked_by ${asString(row.blocked_by)}` : asString(row.next_attempt_at) ? `next_attempt_at ${asString(row.next_attempt_at)}` : "")
|
|
32176
|
+
})).sort(
|
|
32177
|
+
(left, right) => left.monitorKey.localeCompare(right.monitorKey) || left.entityKey.localeCompare(right.entityKey)
|
|
32178
|
+
);
|
|
32179
|
+
if (rows.length === 0) {
|
|
32180
|
+
return [` drift none${payload.truncated === true ? " (truncated)" : ""}`];
|
|
32181
|
+
}
|
|
32182
|
+
const width = (values) => values.reduce((max, value) => Math.max(max, value.length), 0);
|
|
32183
|
+
const monitorWidth = width(rows.map((row) => row.monitorKey));
|
|
32184
|
+
const entityWidth = width(rows.map((row) => row.entityKey));
|
|
32185
|
+
const convergenceWidth = width(rows.map((row) => row.convergence));
|
|
32186
|
+
const lines = [
|
|
32187
|
+
` drift (${rows.length}${payload.truncated === true ? ", truncated" : ""})`
|
|
32188
|
+
];
|
|
32189
|
+
for (const row of rows) {
|
|
32190
|
+
lines.push(
|
|
32191
|
+
` ${row.monitorKey.padEnd(monitorWidth)} ${row.entityKey.padEnd(
|
|
32192
|
+
entityWidth
|
|
32193
|
+
)} ${row.convergence.padEnd(convergenceWidth)} ${row.since}${row.detail ? ` ${row.detail}` : ""}`
|
|
32194
|
+
);
|
|
32195
|
+
}
|
|
32196
|
+
return lines;
|
|
32197
|
+
}
|
|
32198
|
+
function renderFleetList(payload) {
|
|
32199
|
+
const fleets = (Array.isArray(payload.fleets) ? payload.fleets : []).flatMap((raw) => {
|
|
32200
|
+
const fleet = asRecord2(raw);
|
|
32201
|
+
return fleet ? [fleet] : [];
|
|
32202
|
+
}).sort(
|
|
32203
|
+
(left, right) => (asString(left.id) ?? "").localeCompare(asString(right.id) ?? "")
|
|
32204
|
+
);
|
|
32205
|
+
if (fleets.length === 0) {
|
|
32206
|
+
return "No Monitor Fleets in this workspace.\nNext: deepline monitors fleets init <fleet-id> --help\n";
|
|
32207
|
+
}
|
|
32208
|
+
const idWidth = fleets.reduce(
|
|
32209
|
+
(max, fleet) => Math.max(max, (asString(fleet.id) ?? "").length),
|
|
32210
|
+
0
|
|
32211
|
+
);
|
|
32212
|
+
const statusWidth = fleets.reduce(
|
|
32213
|
+
(max, fleet) => Math.max(max, (fleetStatus(fleet) ?? "unknown").length),
|
|
32214
|
+
0
|
|
32215
|
+
);
|
|
32216
|
+
const lines = [`Fleets (${fleets.length})`];
|
|
32217
|
+
for (const fleet of fleets) {
|
|
32218
|
+
const counts = fleetCounts(fleet);
|
|
32219
|
+
const trouble = [
|
|
32220
|
+
counts.blocked ? `blocked ${counts.blocked}` : "",
|
|
32221
|
+
counts.failed ? `failed ${counts.failed}` : ""
|
|
32222
|
+
].filter(Boolean);
|
|
32223
|
+
lines.push(
|
|
32224
|
+
` ${(asString(fleet.id) ?? "-").padEnd(idWidth)} ${(fleetStatus(fleet) ?? "unknown").padEnd(statusWidth)} ${asFiniteNumber(fleet.live) ?? 0}/${asFiniteNumber(fleet.expected) ?? 0}${trouble.length ? ` ${trouble.join(" \xB7 ")}` : ""}`
|
|
32225
|
+
);
|
|
32226
|
+
}
|
|
32227
|
+
return `${lines.join("\n")}
|
|
32228
|
+
`;
|
|
32229
|
+
}
|
|
32230
|
+
function renderFleetDeactivatePlan(payload, fleetId) {
|
|
32231
|
+
const radius = asRecord2(payload.would_deactivate) ?? {};
|
|
32232
|
+
const lines = [
|
|
32233
|
+
`Deactivate fleet ${fleetId} \u2014 plan only, nothing changed`,
|
|
32234
|
+
` would deactivate ${asFiniteNumber(radius.monitors) ?? 0} monitors \xB7 ${asFiniteNumber(radius.accounts) ?? 0} accounts`
|
|
32235
|
+
];
|
|
32236
|
+
const note = asString(payload.note);
|
|
32237
|
+
if (note) lines.push(` ${note}`);
|
|
32238
|
+
lines.push(
|
|
32239
|
+
`Next: ${fleetServerNext(payload) ?? `deepline monitors fleets deactivate ${fleetShellArg(fleetId)} --yes`}`
|
|
32240
|
+
);
|
|
32241
|
+
return `${lines.join("\n")}
|
|
32242
|
+
`;
|
|
32243
|
+
}
|
|
32244
|
+
function reportFleetState(payload, error, options) {
|
|
32245
|
+
printCommandEnvelope(
|
|
32246
|
+
{
|
|
32247
|
+
...payload,
|
|
32248
|
+
code: error.code,
|
|
32249
|
+
message: error.message,
|
|
32250
|
+
next: error.next
|
|
32251
|
+
},
|
|
32252
|
+
{
|
|
32253
|
+
json: options.json,
|
|
32254
|
+
text: `${options.text}${error.message}
|
|
32255
|
+
Next: ${error.next}
|
|
32256
|
+
`
|
|
32257
|
+
}
|
|
32258
|
+
);
|
|
32259
|
+
process.exitCode = monitorsErrorExitCode(error);
|
|
32260
|
+
}
|
|
32261
|
+
function fleetSourceTable(value) {
|
|
32262
|
+
const [schema, table, extra] = value?.trim().split(".") ?? [];
|
|
32263
|
+
if (!schema || !table || extra || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(schema) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(table)) {
|
|
32264
|
+
throw new MonitorsUsageError(
|
|
32265
|
+
"--source must be a Customer DB table in schema.table form."
|
|
32266
|
+
);
|
|
32267
|
+
}
|
|
32268
|
+
return { schema, table };
|
|
32269
|
+
}
|
|
32270
|
+
function fleetColumnName(value, flag) {
|
|
32271
|
+
const name = value?.trim();
|
|
32272
|
+
if (!name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {
|
|
32273
|
+
throw new MonitorsUsageError(`${flag} must be a SQL column identifier.`);
|
|
32274
|
+
}
|
|
32275
|
+
return name;
|
|
32276
|
+
}
|
|
32277
|
+
function fleetMemberLimit(value) {
|
|
32278
|
+
if (value === void 0) return 1e3;
|
|
32279
|
+
const limit = fleetIntegerOption(value, "--limit");
|
|
32280
|
+
if (!limit || limit > 1e3) {
|
|
32281
|
+
throw new MonitorsUsageError("--limit must be between 1 and 1,000.");
|
|
32282
|
+
}
|
|
32283
|
+
return limit;
|
|
32284
|
+
}
|
|
32285
|
+
function fleetOrderBy(values, sourceKey) {
|
|
32286
|
+
const parsed = (values ?? []).map((value) => {
|
|
32287
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*):(asc|desc)$/.exec(value.trim());
|
|
32288
|
+
if (!match) {
|
|
32289
|
+
throw new MonitorsUsageError(
|
|
32290
|
+
"--order-by must use column:asc or column:desc."
|
|
32291
|
+
);
|
|
32292
|
+
}
|
|
32293
|
+
return { column: match[1], direction: match[2] };
|
|
32294
|
+
});
|
|
32295
|
+
const seen = /* @__PURE__ */ new Set();
|
|
32296
|
+
for (const order of parsed) {
|
|
32297
|
+
if (seen.has(order.column)) {
|
|
32298
|
+
throw new MonitorsUsageError(
|
|
32299
|
+
`--order-by repeats '${order.column}'. Each column may appear once.`
|
|
32300
|
+
);
|
|
32301
|
+
}
|
|
32302
|
+
seen.add(order.column);
|
|
32303
|
+
}
|
|
32304
|
+
const sourceOrder = parsed.find((order) => order.column === sourceKey);
|
|
32305
|
+
return [
|
|
32306
|
+
...parsed.filter((order) => order.column !== sourceKey),
|
|
32307
|
+
sourceOrder ?? { column: sourceKey, direction: "asc" }
|
|
32308
|
+
];
|
|
32309
|
+
}
|
|
32310
|
+
async function handleMonitorFleetsInit(fleetId, options) {
|
|
32311
|
+
if (!/^[a-z][a-z0-9-]{0,199}$/.test(fleetId)) {
|
|
32312
|
+
throw new MonitorsUsageError("<fleet-id> must be lowercase kebab-case.");
|
|
32313
|
+
}
|
|
32314
|
+
const source = fleetSourceTable(options.source);
|
|
32315
|
+
const key = fleetColumnName(options.key, "--key");
|
|
32316
|
+
const keyType = options.keyType?.trim() ?? "text";
|
|
32317
|
+
if (!["text", "uuid", "int4", "int8"].includes(keyType)) {
|
|
32318
|
+
throw new MonitorsUsageError(
|
|
32319
|
+
"--key-type must be text, uuid, int4, or int8."
|
|
32320
|
+
);
|
|
32321
|
+
}
|
|
32322
|
+
const tool = options.tool?.trim();
|
|
32323
|
+
if (!tool) throw new MonitorsUsageError("--tool is required.");
|
|
32324
|
+
if (!options.payload) {
|
|
32325
|
+
throw new MonitorsUsageError(
|
|
32326
|
+
"--payload is required and must be the monitor payload JSON for --tool."
|
|
32327
|
+
);
|
|
32328
|
+
}
|
|
32329
|
+
const payload = parseJsonObjectArg(options.payload, "--payload");
|
|
32330
|
+
const where = options.where ? parseJsonObjectArg(options.where, "--where") : void 0;
|
|
32331
|
+
const out = options.out?.trim();
|
|
32332
|
+
if (!out) throw new MonitorsUsageError("--out is required.");
|
|
32333
|
+
const authoredDefinition = {
|
|
32334
|
+
id: fleetId,
|
|
32335
|
+
source: {
|
|
32336
|
+
kind: "customer_db_table",
|
|
32337
|
+
schema: source.schema,
|
|
32338
|
+
table: source.table,
|
|
32339
|
+
key: { column: key, type: keyType },
|
|
32340
|
+
...where ? { where } : {}
|
|
32341
|
+
},
|
|
32342
|
+
member: {
|
|
32343
|
+
tool,
|
|
32344
|
+
key: {
|
|
32345
|
+
$fleet: "template",
|
|
32346
|
+
parts: [`${fleetId}-`, { $fleet: "column", name: key }]
|
|
32347
|
+
},
|
|
32348
|
+
payload
|
|
32349
|
+
},
|
|
32350
|
+
selection: {
|
|
32351
|
+
limit: fleetMemberLimit(options.limit),
|
|
32352
|
+
orderBy: fleetOrderBy(options.orderBy, key),
|
|
32353
|
+
membership: "sticky"
|
|
32354
|
+
}
|
|
32355
|
+
};
|
|
32356
|
+
const definition = requireCompiledFleetDefinition(authoredDefinition);
|
|
32357
|
+
const file = resolve14(out);
|
|
32358
|
+
writeFileSync12(file, `${JSON.stringify(definition, null, 2)}
|
|
32359
|
+
`, "utf8");
|
|
32360
|
+
const next = `deepline monitors fleets sync --file ${fleetShellArg(file)} --dry-run --json`;
|
|
32361
|
+
printCommandEnvelope(
|
|
32362
|
+
{ schemaVersion: 1, file, definition, next },
|
|
32363
|
+
{
|
|
32364
|
+
json: options.json,
|
|
32365
|
+
text: `Wrote ${file}
|
|
32366
|
+
Next: ${next}
|
|
32367
|
+
`
|
|
32368
|
+
}
|
|
32369
|
+
);
|
|
32370
|
+
}
|
|
32371
|
+
function requireCompiledFleetDefinition(definition) {
|
|
32372
|
+
const result = admitMonitorFleetAuthoringContract(definition);
|
|
32373
|
+
if (result.valid && result.contract) return result.contract.definition;
|
|
32374
|
+
const messages = result.issues.map((issue) => `${issue.path || "definition"}: ${issue.message}`).join("; ");
|
|
32375
|
+
throw new MonitorsUsageError(
|
|
32376
|
+
`Monitor Fleet definition failed local contract check. ${messages}
|
|
32377
|
+
Fix the file, then re-run: deepline monitors fleets sync --file <fleet.json> --dry-run`
|
|
32378
|
+
);
|
|
32379
|
+
}
|
|
32380
|
+
function fleetSyncCommandLine(target, options) {
|
|
32381
|
+
const parts = ["deepline monitors fleets sync"];
|
|
32382
|
+
if (options.file) parts.push(`--file ${fleetShellArg(options.file)}`);
|
|
32383
|
+
else if (target) parts.push(fleetShellArg(target));
|
|
32384
|
+
if (options.dryRun) parts.push("--dry-run");
|
|
32385
|
+
if (options.wait) parts.push("--wait");
|
|
32386
|
+
if (options.timeout)
|
|
32387
|
+
parts.push(`--timeout ${fleetShellArg(options.timeout)}`);
|
|
32388
|
+
if (options.expectedGeneration !== void 0) {
|
|
32389
|
+
parts.push(
|
|
32390
|
+
`--expected-generation ${fleetShellArg(options.expectedGeneration)}`
|
|
32391
|
+
);
|
|
32392
|
+
}
|
|
32393
|
+
if (options.idempotencyKey) {
|
|
32394
|
+
parts.push(`--idempotency-key ${fleetShellArg(options.idempotencyKey)}`);
|
|
32395
|
+
}
|
|
32396
|
+
parts.push(...fleetJsonFlag(options));
|
|
32397
|
+
return parts.join(" ");
|
|
32398
|
+
}
|
|
32399
|
+
async function handleMonitorFleetsSync(target, options, idempotencyKey) {
|
|
32400
|
+
const usesDefinition = options.file !== void 0 || target?.trim().startsWith("{") === true;
|
|
32401
|
+
if (!usesDefinition && !target?.trim()) {
|
|
32402
|
+
throw new MonitorsUsageError(
|
|
32403
|
+
"sync needs a fleet: pass --file fleet.json to apply a definition, or <fleet-id> to re-plan the stored one.\n deepline monitors fleets sync --file fleet.json --dry-run\n deepline monitors fleets sync <fleet-id> --dry-run"
|
|
32404
|
+
);
|
|
32405
|
+
}
|
|
32406
|
+
const definition = usesDefinition ? requireCompiledFleetDefinition(
|
|
32407
|
+
resolveMonitorJsonBody({
|
|
32408
|
+
positional: target,
|
|
32409
|
+
file: options.file,
|
|
32410
|
+
argLabel: "<definition>",
|
|
32411
|
+
command: "deepline monitors fleets sync"
|
|
32412
|
+
})
|
|
32413
|
+
) : void 0;
|
|
32414
|
+
const fleetId = definition ? asString(definition.id) ?? "" : target.trim();
|
|
32415
|
+
if (!fleetId) {
|
|
32416
|
+
throw new MonitorsUsageError(
|
|
32417
|
+
'The Fleet definition has no id. Add a top-level "id" and re-run.'
|
|
32418
|
+
);
|
|
32419
|
+
}
|
|
32420
|
+
const client2 = new DeeplineClient();
|
|
32421
|
+
const payload = await client2.monitors.fleets.sync(
|
|
32422
|
+
definition ?? fleetId,
|
|
32423
|
+
{
|
|
32424
|
+
...options.dryRun ? { dryRun: true } : {},
|
|
32425
|
+
...options.expectedGeneration !== void 0 ? {
|
|
32426
|
+
expectedGeneration: fleetIntegerOption(
|
|
32427
|
+
options.expectedGeneration,
|
|
32428
|
+
"--expected-generation"
|
|
32429
|
+
)
|
|
32430
|
+
} : {},
|
|
32431
|
+
idempotencyKey
|
|
32432
|
+
}
|
|
32433
|
+
);
|
|
32434
|
+
if (options.dryRun) {
|
|
32435
|
+
assertMonitorDryRunAcknowledged(payload, {
|
|
32436
|
+
command: "deepline monitors fleets sync",
|
|
32437
|
+
mutation: "fleet sync"
|
|
32438
|
+
});
|
|
32439
|
+
}
|
|
32440
|
+
const accepted = { ...payload, idempotency_key: idempotencyKey };
|
|
32441
|
+
if (!options.wait || options.dryRun) {
|
|
32442
|
+
printCommandEnvelope(accepted, {
|
|
32443
|
+
json: options.json,
|
|
32444
|
+
text: renderFleetSync(payload, {
|
|
32445
|
+
fleetId,
|
|
32446
|
+
dryRun: options.dryRun === true,
|
|
32447
|
+
idempotencyKey
|
|
32448
|
+
})
|
|
32449
|
+
});
|
|
32450
|
+
return;
|
|
32451
|
+
}
|
|
32452
|
+
const timeoutMs = fleetTimeoutMs(options.timeout);
|
|
32453
|
+
const progress = fleetProgressReporter();
|
|
32454
|
+
let final;
|
|
32455
|
+
try {
|
|
32456
|
+
final = await client2.monitors.fleets.waitForConvergence(fleetId, {
|
|
32457
|
+
timeoutMs,
|
|
32458
|
+
pollIntervalMs: FLEET_POLL_INTERVAL_MS,
|
|
32459
|
+
onProgress: progress.report
|
|
32460
|
+
});
|
|
32461
|
+
} finally {
|
|
32462
|
+
progress.finish();
|
|
32463
|
+
}
|
|
32464
|
+
const envelope = { ...accepted, ...final };
|
|
32465
|
+
const status = fleetStatus(final);
|
|
32466
|
+
const summary = renderFleetGet(final);
|
|
32467
|
+
if (status === "converged") {
|
|
32468
|
+
printCommandEnvelope(envelope, { json: options.json, text: summary });
|
|
32469
|
+
return;
|
|
32470
|
+
}
|
|
32471
|
+
const driftCommand = `deepline monitors fleets get ${fleetShellArg(fleetId)} --drift --json`;
|
|
32472
|
+
if (status === "degraded") {
|
|
32473
|
+
reportFleetState(
|
|
32474
|
+
envelope,
|
|
32475
|
+
new MonitorFleetStateError({
|
|
32476
|
+
code: "MONITOR_FLEET_DEGRADED",
|
|
32477
|
+
message: `Fleet ${fleetId} is degraded: some members will not converge without a change. Retrying sync will not fix it.`,
|
|
32478
|
+
next: fleetServerNext(final) ?? driftCommand
|
|
32479
|
+
}),
|
|
32480
|
+
{ json: options.json, text: summary }
|
|
32481
|
+
);
|
|
32482
|
+
return;
|
|
32483
|
+
}
|
|
32484
|
+
reportFleetState(
|
|
32485
|
+
envelope,
|
|
32486
|
+
new MonitorFleetStateError({
|
|
32487
|
+
code: "MONITOR_FLEET_WAIT_TIMEOUT",
|
|
32488
|
+
message: `Stopped waiting after ${timeoutMs}ms. Nothing is broken and nothing was lost \u2014 fleet ${fleetId} is still ${status ?? "working"} on the server.`,
|
|
32489
|
+
next: fleetServerNext(final) ?? driftCommand
|
|
32490
|
+
}),
|
|
32491
|
+
{ json: options.json, text: summary }
|
|
32492
|
+
);
|
|
32493
|
+
}
|
|
32494
|
+
async function handleMonitorFleetsGet(fleetId, options) {
|
|
32495
|
+
if (options.drift && !fleetId) {
|
|
32496
|
+
throw new MonitorsUsageError(
|
|
32497
|
+
"--drift needs a fleet id: deepline monitors fleets get <fleet-id> --drift"
|
|
32498
|
+
);
|
|
32499
|
+
}
|
|
32500
|
+
const limit = options.limit === void 0 ? void 0 : fleetIntegerOption(options.limit, "--limit");
|
|
32501
|
+
const client2 = new DeeplineClient();
|
|
32502
|
+
const payload = await client2.monitors.fleets.get(fleetId, {
|
|
32503
|
+
...options.drift ? { drift: true } : {},
|
|
32504
|
+
...limit !== void 0 ? { limit } : {}
|
|
32505
|
+
});
|
|
32506
|
+
const text = fleetId ? renderFleetGet(payload) : renderFleetList(payload);
|
|
32507
|
+
if (!options.check) {
|
|
32508
|
+
printCommandEnvelope(payload, { json: options.json, text });
|
|
32509
|
+
return;
|
|
32510
|
+
}
|
|
32511
|
+
const statuses = fleetId ? [fleetStatus(payload)] : (Array.isArray(payload.fleets) ? payload.fleets : []).map(
|
|
32512
|
+
(raw) => fleetStatus(asRecord2(raw) ?? {})
|
|
32513
|
+
);
|
|
32514
|
+
const unconverged = statuses.filter((status) => status !== "converged");
|
|
32515
|
+
if (unconverged.length === 0) {
|
|
32516
|
+
printCommandEnvelope(payload, { json: options.json, text });
|
|
32517
|
+
return;
|
|
32518
|
+
}
|
|
32519
|
+
const target = fleetId ?? "<fleet-id>";
|
|
32520
|
+
const degraded = unconverged.includes("degraded");
|
|
32521
|
+
reportFleetState(
|
|
32522
|
+
payload,
|
|
32523
|
+
new MonitorFleetStateError({
|
|
32524
|
+
code: degraded ? "MONITOR_FLEET_DEGRADED" : "MONITOR_FLEET_NOT_CONVERGED",
|
|
32525
|
+
message: degraded ? `Fleet ${target} is degraded: members are stuck and retrying will not move them.` : `Fleet ${target} has not converged yet.`,
|
|
32526
|
+
next: fleetServerNext(payload) ?? `deepline monitors fleets get ${fleetShellArg(target)} --drift --json`
|
|
32527
|
+
}),
|
|
32528
|
+
{ json: options.json, text }
|
|
32529
|
+
);
|
|
32530
|
+
}
|
|
32531
|
+
function fleetDeactivateCommandLine(fleetId, options) {
|
|
32532
|
+
const parts = [
|
|
32533
|
+
"deepline monitors fleets deactivate",
|
|
32534
|
+
fleetShellArg(fleetId),
|
|
32535
|
+
"--yes"
|
|
32536
|
+
];
|
|
32537
|
+
if (options.dryRun) parts.push("--dry-run");
|
|
32538
|
+
if (options.wait) parts.push("--wait");
|
|
32539
|
+
if (options.timeout)
|
|
32540
|
+
parts.push(`--timeout ${fleetShellArg(options.timeout)}`);
|
|
32541
|
+
if (options.idempotencyKey) {
|
|
32542
|
+
parts.push(`--idempotency-key ${fleetShellArg(options.idempotencyKey)}`);
|
|
32543
|
+
}
|
|
32544
|
+
parts.push(...fleetJsonFlag(options));
|
|
32545
|
+
return parts.join(" ");
|
|
32546
|
+
}
|
|
32547
|
+
async function confirmFleetDeactivate(fleetId, plan) {
|
|
32548
|
+
process.stderr.write(renderFleetDeactivatePlan(plan, fleetId));
|
|
32549
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
32550
|
+
try {
|
|
32551
|
+
const answer = await rl.question(
|
|
32552
|
+
`Deactivate fleet "${fleetId}" and the monitors it owns? [y/N] `
|
|
32553
|
+
);
|
|
32554
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
32555
|
+
} finally {
|
|
32556
|
+
rl.close();
|
|
32557
|
+
}
|
|
32558
|
+
}
|
|
32559
|
+
async function handleMonitorFleetsDeactivate(fleetId, options, idempotencyKey) {
|
|
32560
|
+
const client2 = new DeeplineClient();
|
|
32561
|
+
if (options.dryRun) {
|
|
32562
|
+
const plan = await client2.monitors.fleets.deactivate(fleetId, {
|
|
32563
|
+
dryRun: true,
|
|
32564
|
+
idempotencyKey
|
|
32565
|
+
});
|
|
32566
|
+
assertMonitorDryRunAcknowledged(plan, {
|
|
32567
|
+
command: "deepline monitors fleets deactivate",
|
|
32568
|
+
mutation: "fleet deactivate"
|
|
32569
|
+
});
|
|
32570
|
+
printCommandEnvelope(plan, {
|
|
32571
|
+
json: options.json,
|
|
32572
|
+
text: renderFleetDeactivatePlan(plan, fleetId)
|
|
32573
|
+
});
|
|
32574
|
+
return;
|
|
32575
|
+
}
|
|
32576
|
+
if (!options.yes) {
|
|
32577
|
+
const interactive = process.stdout.isTTY === true && process.stdin.isTTY === true;
|
|
32578
|
+
if (!interactive) {
|
|
32579
|
+
throw new MonitorsUsageError(
|
|
32580
|
+
`deactivate is destructive: it deactivates fleet "${fleetId}" and every monitor it owns. Non-interactive runs must confirm with --yes:
|
|
32581
|
+
${fleetDeactivateCommandLine(fleetId, options)}
|
|
32582
|
+
Preview the blast radius first:
|
|
32583
|
+
deepline monitors fleets deactivate ${fleetShellArg(fleetId)} --dry-run`
|
|
32584
|
+
);
|
|
32585
|
+
}
|
|
32586
|
+
const plan = await client2.monitors.fleets.deactivate(fleetId, {
|
|
32587
|
+
dryRun: true,
|
|
32588
|
+
idempotencyKey: `${idempotencyKey}-plan`
|
|
32589
|
+
});
|
|
32590
|
+
assertMonitorDryRunAcknowledged(plan, {
|
|
32591
|
+
command: "deepline monitors fleets deactivate",
|
|
32592
|
+
mutation: "fleet deactivate"
|
|
32593
|
+
});
|
|
32594
|
+
if (!await confirmFleetDeactivate(fleetId, plan)) {
|
|
32595
|
+
process.stderr.write(
|
|
32596
|
+
`Aborted. Fleet "${fleetId}" was not deactivated.
|
|
32597
|
+
`
|
|
32598
|
+
);
|
|
32599
|
+
process.exitCode = 2;
|
|
32600
|
+
return;
|
|
32601
|
+
}
|
|
32602
|
+
}
|
|
32603
|
+
const payload = await client2.monitors.fleets.deactivate(fleetId, {
|
|
32604
|
+
idempotencyKey
|
|
32605
|
+
});
|
|
32606
|
+
const accepted = { ...payload, idempotency_key: idempotencyKey };
|
|
32607
|
+
if (payload.already === true) {
|
|
32608
|
+
printCommandEnvelope(accepted, {
|
|
32609
|
+
json: options.json,
|
|
32610
|
+
text: `Fleet ${fleetId} is already deactivated.
|
|
32611
|
+
`
|
|
32612
|
+
});
|
|
32613
|
+
return;
|
|
32614
|
+
}
|
|
32615
|
+
const acceptedText = `Fleet ${fleetId} \u2014 ${asString(payload.status) ?? "deactivating"}
|
|
32616
|
+
idempotency key ${idempotencyKey}
|
|
32617
|
+
` + (fleetServerNext(payload) ? `Next: ${fleetServerNext(payload)}
|
|
32618
|
+
` : "");
|
|
32619
|
+
if (!options.wait) {
|
|
32620
|
+
printCommandEnvelope(accepted, {
|
|
32621
|
+
json: options.json,
|
|
32622
|
+
text: acceptedText
|
|
32623
|
+
});
|
|
32624
|
+
return;
|
|
32625
|
+
}
|
|
32626
|
+
const timeoutMs = fleetTimeoutMs(options.timeout);
|
|
32627
|
+
const progress = fleetProgressReporter();
|
|
32628
|
+
let final;
|
|
32629
|
+
try {
|
|
32630
|
+
final = await client2.monitors.fleets.waitForConvergence(fleetId, {
|
|
32631
|
+
timeoutMs,
|
|
32632
|
+
pollIntervalMs: FLEET_POLL_INTERVAL_MS,
|
|
32633
|
+
onProgress: progress.report,
|
|
32634
|
+
until: "deactivated"
|
|
32635
|
+
});
|
|
32636
|
+
} finally {
|
|
32637
|
+
progress.finish();
|
|
32638
|
+
}
|
|
32639
|
+
const envelope = { ...accepted, ...final };
|
|
32640
|
+
const summary = renderFleetGet(final);
|
|
32641
|
+
if (fleetStatus(final) === "deactivated") {
|
|
32642
|
+
printCommandEnvelope(envelope, { json: options.json, text: summary });
|
|
32643
|
+
return;
|
|
32644
|
+
}
|
|
32645
|
+
reportFleetState(
|
|
32646
|
+
envelope,
|
|
32647
|
+
new MonitorFleetStateError({
|
|
32648
|
+
code: "MONITOR_FLEET_WAIT_TIMEOUT",
|
|
32649
|
+
message: `Stopped waiting after ${timeoutMs}ms. Deactivation of fleet ${fleetId} is still in progress on the server; nothing was lost.`,
|
|
32650
|
+
next: fleetServerNext(final) ?? `deepline monitors fleets get ${fleetShellArg(fleetId)} --json`
|
|
32651
|
+
}),
|
|
32652
|
+
{ json: options.json, text: summary }
|
|
32653
|
+
);
|
|
32654
|
+
}
|
|
32655
|
+
function handleMonitorFleetsOverview(options) {
|
|
32656
|
+
const lines = [
|
|
32657
|
+
"Monitor Fleets \u2014 one Customer DB table row, one ordinary monitor.",
|
|
32658
|
+
"",
|
|
32659
|
+
"Lifecycle:",
|
|
32660
|
+
...MONITOR_FLEET_LIFECYCLE.flatMap((entry) => [
|
|
32661
|
+
` ${entry.step}. ${entry.what}`,
|
|
32662
|
+
` ${entry.command}`
|
|
32663
|
+
]),
|
|
32664
|
+
"",
|
|
32665
|
+
"Commands:",
|
|
32666
|
+
...MONITOR_FLEET_COMMANDS.map(
|
|
32667
|
+
(command) => ` ${command.name.padEnd(12)}${command.summary}`
|
|
32668
|
+
),
|
|
32669
|
+
"",
|
|
32670
|
+
"Agent notes:",
|
|
32671
|
+
...MONITOR_FLEET_AGENT_NOTES.map((note) => ` ${note}`)
|
|
32672
|
+
];
|
|
32673
|
+
printCommandEnvelope(
|
|
32674
|
+
{
|
|
32675
|
+
schemaVersion: 1,
|
|
32676
|
+
lifecycle: MONITOR_FLEET_LIFECYCLE,
|
|
32677
|
+
commands: MONITOR_FLEET_COMMANDS,
|
|
32678
|
+
agent_notes: MONITOR_FLEET_AGENT_NOTES,
|
|
32679
|
+
next: MONITOR_FLEET_LIFECYCLE[0].command
|
|
32680
|
+
},
|
|
32681
|
+
{ json: options.json, text: `${lines.join("\n")}
|
|
32682
|
+
` }
|
|
32683
|
+
);
|
|
32684
|
+
}
|
|
31536
32685
|
function renderMonitorGet(payload) {
|
|
31537
32686
|
const key = asString(payload.key);
|
|
31538
32687
|
const tool = asString(payload.tool);
|
|
@@ -31782,7 +32931,9 @@ Notes:
|
|
|
31782
32931
|
|
|
31783
32932
|
Exit codes:
|
|
31784
32933
|
0 success; 2 usage/local input; 3 auth or permission; 4 not found;
|
|
31785
|
-
5 server failure;
|
|
32934
|
+
5 server failure (retry the same command); 6 not at the desired state
|
|
32935
|
+
(fleets: degraded, or --wait/--check stopped while healthy \u2014 retrying
|
|
32936
|
+
changes nothing); 7 refused, change the request.
|
|
31786
32937
|
\`monitors status\` exits 1 when you lack monitor access (documented contract).
|
|
31787
32938
|
|
|
31788
32939
|
Examples:
|
|
@@ -32053,6 +33204,181 @@ Examples:
|
|
|
32053
33204
|
`
|
|
32054
33205
|
).option("--dry-run", "Show the reactivation cost without reactivating")
|
|
32055
33206
|
).action(monitorsAction(handleMonitorsReactivate));
|
|
33207
|
+
const fleets = monitors.command("fleets").description("Define and reconcile table-backed Monitor Fleets.").addHelpText(
|
|
33208
|
+
"after",
|
|
33209
|
+
`
|
|
33210
|
+
Notes:
|
|
33211
|
+
A Monitor Fleet maps eligible rows in one Customer DB table to ordinary
|
|
33212
|
+
monitors. Fleet definitions are canonical JSON, and \`sync\` is the only verb
|
|
33213
|
+
that changes one: applying the same definition twice is the same operation,
|
|
33214
|
+
so the server answers \`replayed: true\` instead of building a second fleet.
|
|
33215
|
+
The fleet's status is computed by Deepline; this CLI reports it and never
|
|
33216
|
+
recomputes a verdict from the counts.
|
|
33217
|
+
|
|
33218
|
+
Exit codes:
|
|
33219
|
+
0 converged or done; 2 usage or local validation; 3 auth; 4 not found;
|
|
33220
|
+
5 server failure (retry the same command); 6 not at the desired state
|
|
33221
|
+
(degraded, or --wait/--check stopped while healthy); 7 refused (change the
|
|
33222
|
+
request).
|
|
33223
|
+
|
|
33224
|
+
Lifecycle:
|
|
33225
|
+
${MONITOR_FLEET_LIFECYCLE.map(
|
|
33226
|
+
(entry) => ` ${entry.step}. ${entry.command}`
|
|
33227
|
+
).join("\n")}
|
|
33228
|
+
${MONITOR_FLEET_HELP_EPILOG}`
|
|
33229
|
+
).action(
|
|
33230
|
+
monitorsAction(async (options) => {
|
|
33231
|
+
handleMonitorFleetsOverview(options);
|
|
33232
|
+
})
|
|
33233
|
+
);
|
|
33234
|
+
withJsonOption(fleets);
|
|
33235
|
+
withJsonOption(
|
|
33236
|
+
fleets.command("init <fleet-id>").description("Write an opinionated Fleet definition JSON file.").addHelpText(
|
|
33237
|
+
"after",
|
|
33238
|
+
`
|
|
33239
|
+
Creates a ready-to-review JSON definition. Fleets always sync ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.cadence} and retain
|
|
33240
|
+
a missing member for ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.removalGrace} before it is ${MONITOR_FLEET_DOCUMENTATION.fixedPolicy.onRemoved}d; those
|
|
33241
|
+
policies are not authored in the file. ${MONITOR_FLEET_DOCUMENTATION.stickyMembership} The payload remains the actual monitor payload for the chosen tool, so use
|
|
33242
|
+
\`deepline monitors available\` to discover a tool first.
|
|
33243
|
+
|
|
33244
|
+
Example:
|
|
33245
|
+
deepline monitors fleets init account-job-openings \\
|
|
33246
|
+
--source public.accounts --key account_id --key-type uuid \\
|
|
33247
|
+
--tool deepline_native.company_radar \\
|
|
33248
|
+
--payload '{"domain":{"$fleet":"column","name":"domain"},"radar_type":"company_job_openings"}' \\
|
|
33249
|
+
--order-by intent_score:desc \\
|
|
33250
|
+
--out fleet.json
|
|
33251
|
+
`
|
|
33252
|
+
).requiredOption("--source <schema.table>", "Customer DB source table").requiredOption("--key <column>", "Unique source-row key column").option("--key-type <type>", "text, uuid, int4, or int8 (default text)").requiredOption("--tool <tool>", "Monitor tool to create per source row").requiredOption(
|
|
33253
|
+
"--payload <json>",
|
|
33254
|
+
"Monitor payload JSON for --tool; use $fleet column tags for row values"
|
|
33255
|
+
).option(
|
|
33256
|
+
"--where <json>",
|
|
33257
|
+
"Optional source-row equality filter JSON; not arbitrary SQL"
|
|
33258
|
+
).option(
|
|
33259
|
+
"--order-by <column:direction>",
|
|
33260
|
+
"Rank candidates; repeatable, with the source key appended for stability",
|
|
33261
|
+
(value, previous = []) => [...previous, value],
|
|
33262
|
+
[]
|
|
33263
|
+
).option(
|
|
33264
|
+
"--limit <n>",
|
|
33265
|
+
"Maximum active members; ranking changes do not churn sticky members (default 1,000)"
|
|
33266
|
+
).requiredOption("--out <path>", "Write the definition JSON to this path")
|
|
33267
|
+
).action(monitorsAction(handleMonitorFleetsInit));
|
|
33268
|
+
withJsonOption(
|
|
33269
|
+
fleets.command("sync [fleet-id]").description(
|
|
33270
|
+
"Apply a Fleet definition, or re-plan an existing fleet from its stored one."
|
|
33271
|
+
).addHelpText(
|
|
33272
|
+
"after",
|
|
33273
|
+
`
|
|
33274
|
+
Notes:
|
|
33275
|
+
--file (or an inline definition, or --file - for stdin) is compiled locally
|
|
33276
|
+
BEFORE any network call: a definition that fails the contract exits 2 and
|
|
33277
|
+
never becomes a request. A bare <fleet-id> re-plans the stored definition.
|
|
33278
|
+
The plan always shows blocked members; they are never hidden.
|
|
33279
|
+
--wait polls until Deepline reports a terminal status: converged exits 0,
|
|
33280
|
+
degraded exits 6, and a timeout exits 6 without implying anything broke.
|
|
33281
|
+
Progress goes to stderr, so stdout stays exactly one JSON object.
|
|
33282
|
+
|
|
33283
|
+
Examples:
|
|
33284
|
+
deepline monitors fleets sync --file fleet.json --dry-run
|
|
33285
|
+
deepline monitors fleets sync --file fleet.json --wait --timeout 20m
|
|
33286
|
+
deepline monitors fleets sync account-job-openings --wait --json
|
|
33287
|
+
cat fleet.json | deepline monitors fleets sync --file - --dry-run --json
|
|
33288
|
+
`
|
|
33289
|
+
).option(
|
|
33290
|
+
"-f, --file <path>",
|
|
33291
|
+
"Apply definition JSON from a file, or - for stdin"
|
|
33292
|
+
).option(
|
|
33293
|
+
"--dry-run",
|
|
33294
|
+
"Show the plan and the credits due without changing state"
|
|
33295
|
+
).option("--wait", "Poll until the fleet reaches a terminal status").option(
|
|
33296
|
+
"--timeout <duration>",
|
|
33297
|
+
"How long --wait may poll: 500ms, 90s, 10m, 1h (default 10m)"
|
|
33298
|
+
).option(
|
|
33299
|
+
"--expected-generation <generation>",
|
|
33300
|
+
"Refuse the write unless the fleet is at this generation"
|
|
33301
|
+
).option(
|
|
33302
|
+
"--idempotency-key <key>",
|
|
33303
|
+
"Stable retry key (generated and returned when omitted)"
|
|
33304
|
+
)
|
|
33305
|
+
).action(async (target, options) => {
|
|
33306
|
+
let retryCommand = fleetSyncCommandLine(target, options);
|
|
33307
|
+
try {
|
|
33308
|
+
const idempotencyKey = fleetIdempotencyKey(
|
|
33309
|
+
"sync",
|
|
33310
|
+
options.idempotencyKey
|
|
33311
|
+
);
|
|
33312
|
+
retryCommand = fleetSyncCommandLine(target, {
|
|
33313
|
+
...options,
|
|
33314
|
+
idempotencyKey
|
|
33315
|
+
});
|
|
33316
|
+
await handleMonitorFleetsSync(target, options, idempotencyKey);
|
|
33317
|
+
} catch (error) {
|
|
33318
|
+
reportMonitorsFailure(error, { retryCommand });
|
|
33319
|
+
}
|
|
33320
|
+
});
|
|
33321
|
+
withJsonOption(
|
|
33322
|
+
fleets.command("get [fleet-id]").description(
|
|
33323
|
+
"Read one fleet, or list every fleet when the id is omitted."
|
|
33324
|
+
).addHelpText(
|
|
33325
|
+
"after",
|
|
33326
|
+
`
|
|
33327
|
+
Notes:
|
|
33328
|
+
Status is the server's verdict. --check turns it into an exit code so a
|
|
33329
|
+
script can branch without parsing output: 0 converged, 6 anything else.
|
|
33330
|
+
--drift lists the members that have not settled and why.
|
|
33331
|
+
|
|
33332
|
+
Examples:
|
|
33333
|
+
deepline monitors fleets get --json
|
|
33334
|
+
deepline monitors fleets get account-job-openings --json
|
|
33335
|
+
deepline monitors fleets get account-job-openings --drift --limit 50 --json
|
|
33336
|
+
deepline monitors fleets get account-job-openings --check
|
|
33337
|
+
`
|
|
33338
|
+
).option("--drift", "Include the members that have not settled, and why").option("--limit <n>", "Maximum drift rows to return").option(
|
|
33339
|
+
"--check",
|
|
33340
|
+
"Exit 0 when converged and 6 otherwise, for scripts and agents"
|
|
33341
|
+
)
|
|
33342
|
+
).action(monitorsAction(handleMonitorFleetsGet));
|
|
33343
|
+
withJsonOption(
|
|
33344
|
+
fleets.command("deactivate <fleet-id>").description("Deactivate a fleet and the monitors it owns.").addHelpText(
|
|
33345
|
+
"after",
|
|
33346
|
+
`
|
|
33347
|
+
Notes:
|
|
33348
|
+
Destructive. --dry-run shows the blast radius without changing anything.
|
|
33349
|
+
An interactive terminal is shown that blast radius and asked to confirm;
|
|
33350
|
+
a non-interactive run must pass --yes. Re-running after a failure is safe.
|
|
33351
|
+
|
|
33352
|
+
Examples:
|
|
33353
|
+
deepline monitors fleets deactivate account-job-openings --dry-run
|
|
33354
|
+
deepline monitors fleets deactivate account-job-openings --yes --wait --json
|
|
33355
|
+
`
|
|
33356
|
+
).option("--dry-run", "Show the blast radius without deactivating").option("--wait", "Poll until the fleet reports deactivated").option(
|
|
33357
|
+
"--timeout <duration>",
|
|
33358
|
+
"How long --wait may poll: 500ms, 90s, 10m, 1h (default 10m)"
|
|
33359
|
+
).option(
|
|
33360
|
+
"--yes",
|
|
33361
|
+
"Skip the confirmation prompt (required non-interactively)"
|
|
33362
|
+
).option(
|
|
33363
|
+
"--idempotency-key <key>",
|
|
33364
|
+
"Stable retry key (generated and returned when omitted)"
|
|
33365
|
+
)
|
|
33366
|
+
).action(async (fleetId, options) => {
|
|
33367
|
+
let retryCommand = fleetDeactivateCommandLine(fleetId, options);
|
|
33368
|
+
try {
|
|
33369
|
+
const idempotencyKey = fleetIdempotencyKey(
|
|
33370
|
+
"deactivate",
|
|
33371
|
+
options.idempotencyKey
|
|
33372
|
+
);
|
|
33373
|
+
retryCommand = fleetDeactivateCommandLine(fleetId, {
|
|
33374
|
+
...options,
|
|
33375
|
+
idempotencyKey
|
|
33376
|
+
});
|
|
33377
|
+
await handleMonitorFleetsDeactivate(fleetId, options, idempotencyKey);
|
|
33378
|
+
} catch (error) {
|
|
33379
|
+
reportMonitorsFailure(error, { retryCommand });
|
|
33380
|
+
}
|
|
33381
|
+
});
|
|
32056
33382
|
const deployed = withJsonOption(
|
|
32057
33383
|
monitors.command("deployed", { hidden: true }).description("Alias of `monitors list` (plus get/update/delete aliases).").option(
|
|
32058
33384
|
"--status <status>",
|
|
@@ -32755,7 +34081,7 @@ async function readHiddenLine(prompt, streams = {}) {
|
|
|
32755
34081
|
}
|
|
32756
34082
|
let value = "";
|
|
32757
34083
|
inputStream.resume();
|
|
32758
|
-
return await new Promise((
|
|
34084
|
+
return await new Promise((resolve21, reject) => {
|
|
32759
34085
|
let settled = false;
|
|
32760
34086
|
const cleanup = () => {
|
|
32761
34087
|
inputStream.off("data", onData);
|
|
@@ -32773,7 +34099,7 @@ async function readHiddenLine(prompt, streams = {}) {
|
|
|
32773
34099
|
settled = true;
|
|
32774
34100
|
outputStream.write("\n");
|
|
32775
34101
|
cleanup();
|
|
32776
|
-
|
|
34102
|
+
resolve21(line);
|
|
32777
34103
|
};
|
|
32778
34104
|
const fail = (error) => {
|
|
32779
34105
|
if (settled) return;
|
|
@@ -32951,10 +34277,10 @@ import {
|
|
|
32951
34277
|
mkdirSync as mkdirSync11,
|
|
32952
34278
|
readFileSync as readFileSync14,
|
|
32953
34279
|
realpathSync as realpathSync4,
|
|
32954
|
-
writeFileSync as
|
|
34280
|
+
writeFileSync as writeFileSync15
|
|
32955
34281
|
} from "fs";
|
|
32956
34282
|
import { homedir as homedir9 } from "os";
|
|
32957
|
-
import { dirname as dirname16, join as join16, resolve as
|
|
34283
|
+
import { dirname as dirname16, join as join16, resolve as resolve16 } from "path";
|
|
32958
34284
|
|
|
32959
34285
|
// src/cli/installation-lifecycle.ts
|
|
32960
34286
|
import {
|
|
@@ -32964,7 +34290,7 @@ import {
|
|
|
32964
34290
|
realpathSync as realpathSync3,
|
|
32965
34291
|
rmSync as rmSync4
|
|
32966
34292
|
} from "fs";
|
|
32967
|
-
import { basename as basename6, dirname as dirname13, join as join13, relative as relative5, resolve as
|
|
34293
|
+
import { basename as basename6, dirname as dirname13, join as join13, relative as relative5, resolve as resolve15 } from "path";
|
|
32968
34294
|
var nodeFileSystem = {
|
|
32969
34295
|
exists: existsSync11,
|
|
32970
34296
|
isSymbolicLink(path) {
|
|
@@ -33079,14 +34405,14 @@ function isOwnedInstallerCommandPath(input2) {
|
|
|
33079
34405
|
if (!input2.commandPath || basename6(input2.commandPath) !== "deepline") {
|
|
33080
34406
|
return false;
|
|
33081
34407
|
}
|
|
33082
|
-
const commandPath =
|
|
33083
|
-
const fromHost = relative5(
|
|
34408
|
+
const commandPath = resolve15(input2.commandPath);
|
|
34409
|
+
const fromHost = relative5(resolve15(input2.hostDir), commandPath);
|
|
33084
34410
|
return fromHost !== "" && fromHost !== ".." && !fromHost.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`);
|
|
33085
34411
|
}
|
|
33086
34412
|
|
|
33087
34413
|
// src/cli/commands/skills.ts
|
|
33088
34414
|
import { spawn as spawn3 } from "child_process";
|
|
33089
|
-
import { existsSync as existsSync13, mkdirSync as mkdirSync10, readFileSync as readFileSync13, writeFileSync as
|
|
34415
|
+
import { existsSync as existsSync13, mkdirSync as mkdirSync10, readFileSync as readFileSync13, writeFileSync as writeFileSync14 } from "fs";
|
|
33090
34416
|
import { homedir as homedir8 } from "os";
|
|
33091
34417
|
import { dirname as dirname15, join as join15 } from "path";
|
|
33092
34418
|
|
|
@@ -33203,7 +34529,7 @@ import {
|
|
|
33203
34529
|
mkdirSync as mkdirSync9,
|
|
33204
34530
|
readFileSync as readFileSync12,
|
|
33205
34531
|
unlinkSync,
|
|
33206
|
-
writeFileSync as
|
|
34532
|
+
writeFileSync as writeFileSync13
|
|
33207
34533
|
} from "fs";
|
|
33208
34534
|
import { dirname as dirname14, join as join14 } from "path";
|
|
33209
34535
|
|
|
@@ -33261,7 +34587,7 @@ function readMarkedSkillsSyncVersion(path) {
|
|
|
33261
34587
|
function writeMarkedSkillsSyncVersion(path, version) {
|
|
33262
34588
|
try {
|
|
33263
34589
|
mkdirSync9(dirname14(path), { recursive: true });
|
|
33264
|
-
|
|
34590
|
+
writeFileSync13(path, `${version}
|
|
33265
34591
|
`, "utf-8");
|
|
33266
34592
|
} catch {
|
|
33267
34593
|
}
|
|
@@ -33414,7 +34740,7 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
|
|
|
33414
34740
|
return commands;
|
|
33415
34741
|
}
|
|
33416
34742
|
function runOneSkillsInstall(install) {
|
|
33417
|
-
return new Promise((
|
|
34743
|
+
return new Promise((resolve21) => {
|
|
33418
34744
|
const plan = resolveSkillsInstallSpawn(install);
|
|
33419
34745
|
const child = spawn2(plan.command, plan.args, {
|
|
33420
34746
|
stdio: ["ignore", "ignore", "pipe"],
|
|
@@ -33426,7 +34752,7 @@ function runOneSkillsInstall(install) {
|
|
|
33426
34752
|
stderr += chunk.toString("utf-8");
|
|
33427
34753
|
});
|
|
33428
34754
|
child.on("error", (error) => {
|
|
33429
|
-
|
|
34755
|
+
resolve21({
|
|
33430
34756
|
ok: false,
|
|
33431
34757
|
detail: `failed to start ${install.command}: ${error.message}`,
|
|
33432
34758
|
manualCommand: install.manualCommand
|
|
@@ -33434,11 +34760,11 @@ function runOneSkillsInstall(install) {
|
|
|
33434
34760
|
});
|
|
33435
34761
|
child.on("close", (code) => {
|
|
33436
34762
|
if (code === 0) {
|
|
33437
|
-
|
|
34763
|
+
resolve21({ ok: true, detail: "", manualCommand: install.manualCommand });
|
|
33438
34764
|
return;
|
|
33439
34765
|
}
|
|
33440
34766
|
const detail = stderr.trim();
|
|
33441
|
-
|
|
34767
|
+
resolve21({
|
|
33442
34768
|
ok: false,
|
|
33443
34769
|
detail: detail ? `${install.command}: ${detail}` : `${install.command} exited ${code}`,
|
|
33444
34770
|
manualCommand: install.manualCommand
|
|
@@ -33720,7 +35046,7 @@ function readSkillsInstallState(path) {
|
|
|
33720
35046
|
}
|
|
33721
35047
|
}
|
|
33722
35048
|
function runProcess(command, args, cwd) {
|
|
33723
|
-
return new Promise((
|
|
35049
|
+
return new Promise((resolve21, reject) => {
|
|
33724
35050
|
const plan = resolveShellSpawn(command, args);
|
|
33725
35051
|
const child = spawn3(plan.command, plan.args, {
|
|
33726
35052
|
cwd,
|
|
@@ -33739,7 +35065,7 @@ function runProcess(command, args, cwd) {
|
|
|
33739
35065
|
process.stderr.write(`${SKILLS_NPX_PACKAGE} exited ${code}.
|
|
33740
35066
|
`);
|
|
33741
35067
|
}
|
|
33742
|
-
|
|
35068
|
+
resolve21(code ?? 1);
|
|
33743
35069
|
});
|
|
33744
35070
|
});
|
|
33745
35071
|
}
|
|
@@ -33867,7 +35193,7 @@ async function runSkillsCommand(options, dependencies = {}) {
|
|
|
33867
35193
|
);
|
|
33868
35194
|
}
|
|
33869
35195
|
mkdirSync10(dirname15(plan.statePath), { recursive: true });
|
|
33870
|
-
|
|
35196
|
+
writeFileSync14(
|
|
33871
35197
|
plan.statePath,
|
|
33872
35198
|
`${JSON.stringify(
|
|
33873
35199
|
{
|
|
@@ -33962,26 +35288,26 @@ function parseSetupPhases(value) {
|
|
|
33962
35288
|
if (!phase || typeof phase !== "object" || Array.isArray(phase)) {
|
|
33963
35289
|
return null;
|
|
33964
35290
|
}
|
|
33965
|
-
const
|
|
33966
|
-
if (!isSetupPhaseStatus(
|
|
33967
|
-
switch (
|
|
35291
|
+
const record2 = phase;
|
|
35292
|
+
if (!isSetupPhaseStatus(record2.status)) return null;
|
|
35293
|
+
switch (record2.status) {
|
|
33968
35294
|
case "pending":
|
|
33969
35295
|
case "in_progress":
|
|
33970
|
-
phases[name] = { status:
|
|
35296
|
+
phases[name] = { status: record2.status };
|
|
33971
35297
|
break;
|
|
33972
35298
|
case "complete":
|
|
33973
35299
|
phases[name] = {
|
|
33974
35300
|
status: "complete",
|
|
33975
|
-
...typeof
|
|
35301
|
+
...typeof record2.outcome === "string" ? { outcome: record2.outcome } : {}
|
|
33976
35302
|
};
|
|
33977
35303
|
break;
|
|
33978
35304
|
case "waiting":
|
|
33979
|
-
if (typeof
|
|
33980
|
-
phases[name] = { status: "waiting", outcome:
|
|
35305
|
+
if (typeof record2.outcome !== "string") return null;
|
|
35306
|
+
phases[name] = { status: "waiting", outcome: record2.outcome };
|
|
33981
35307
|
break;
|
|
33982
35308
|
case "failed":
|
|
33983
|
-
if (typeof
|
|
33984
|
-
phases[name] = { status: "failed", code:
|
|
35309
|
+
if (typeof record2.code !== "string") return null;
|
|
35310
|
+
phases[name] = { status: "failed", code: record2.code };
|
|
33985
35311
|
break;
|
|
33986
35312
|
}
|
|
33987
35313
|
}
|
|
@@ -34129,7 +35455,7 @@ function resolvePathCommands(command) {
|
|
|
34129
35455
|
);
|
|
34130
35456
|
return [
|
|
34131
35457
|
...new Set(
|
|
34132
|
-
String(lookup.stdout ?? "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((path) =>
|
|
35458
|
+
String(lookup.stdout ?? "").split(/\r?\n/).map((line) => line.trim()).filter(Boolean).map((path) => resolve16(path))
|
|
34133
35459
|
)
|
|
34134
35460
|
];
|
|
34135
35461
|
}
|
|
@@ -34177,11 +35503,11 @@ function pathsResolveToSameFile(left, right) {
|
|
|
34177
35503
|
try {
|
|
34178
35504
|
return realpathSync4(left) === realpathSync4(right);
|
|
34179
35505
|
} catch {
|
|
34180
|
-
return
|
|
35506
|
+
return resolve16(left) === resolve16(right);
|
|
34181
35507
|
}
|
|
34182
35508
|
}
|
|
34183
35509
|
function isKnownDeeplineCommand(path) {
|
|
34184
|
-
const entrypoint = process.argv[1] ?
|
|
35510
|
+
const entrypoint = process.argv[1] ? resolve16(process.argv[1]) : "";
|
|
34185
35511
|
let resolvedPath = path;
|
|
34186
35512
|
try {
|
|
34187
35513
|
resolvedPath = realpathSync4(path);
|
|
@@ -34207,7 +35533,7 @@ function inspectPathConflict() {
|
|
|
34207
35533
|
function writeSetupState(input2) {
|
|
34208
35534
|
const path = setupStatePath(input2.baseUrl, input2.scope, input2.root);
|
|
34209
35535
|
mkdirSync11(dirname16(path), { recursive: true });
|
|
34210
|
-
|
|
35536
|
+
writeFileSync15(
|
|
34211
35537
|
path,
|
|
34212
35538
|
`${JSON.stringify(
|
|
34213
35539
|
{
|
|
@@ -34334,7 +35660,7 @@ function buildDoctorAssessment(input2) {
|
|
|
34334
35660
|
const connected = input2.authStatus.payload?.connected === true;
|
|
34335
35661
|
const authScopeOk = input2.scope === "local" ? Boolean(projectAuth) : Boolean(apiKey && !projectAuth);
|
|
34336
35662
|
const skillsOk = skillsState?.scope === input2.scope && typeof skillsState.skillsVersion === "string" && Array.isArray(skillsState.agents) && skillsState.agents.length > 0;
|
|
34337
|
-
const runningCliPath = process.argv[1] ?
|
|
35663
|
+
const runningCliPath = process.argv[1] ? resolve16(process.argv[1]) : null;
|
|
34338
35664
|
const globalCli = input2.scope === "global" ? inspectGlobalCliAvailability() : null;
|
|
34339
35665
|
const pathGlobalCli = globalCli?.path ?? null;
|
|
34340
35666
|
const cliPath = input2.scope === "global" ? pathGlobalCli : runningCliPath;
|
|
@@ -34877,7 +36203,7 @@ import {
|
|
|
34877
36203
|
readFileSync as readFileSync15,
|
|
34878
36204
|
renameSync,
|
|
34879
36205
|
rmSync as rmSync5,
|
|
34880
|
-
writeFileSync as
|
|
36206
|
+
writeFileSync as writeFileSync16
|
|
34881
36207
|
} from "fs";
|
|
34882
36208
|
import { homedir as homedir10 } from "os";
|
|
34883
36209
|
import { dirname as dirname17, join as join17 } from "path";
|
|
@@ -34939,7 +36265,7 @@ function writeCliUpdatePreferences(preferences, homeDir2 = homedir10()) {
|
|
|
34939
36265
|
const tempPath = `${path}.${process.pid}.tmp`;
|
|
34940
36266
|
mkdirSync12(dirname17(path), { recursive: true });
|
|
34941
36267
|
try {
|
|
34942
|
-
|
|
36268
|
+
writeFileSync16(tempPath, `${JSON.stringify(preferences, null, 2)}
|
|
34943
36269
|
`, {
|
|
34944
36270
|
encoding: "utf8",
|
|
34945
36271
|
mode: 384
|
|
@@ -35004,7 +36330,7 @@ import {
|
|
|
35004
36330
|
renameSync as renameSync2,
|
|
35005
36331
|
rmSync as rmSync6,
|
|
35006
36332
|
unlinkSync as unlinkSync2,
|
|
35007
|
-
writeFileSync as
|
|
36333
|
+
writeFileSync as writeFileSync17
|
|
35008
36334
|
} from "fs";
|
|
35009
36335
|
import { homedir as homedir11 } from "os";
|
|
35010
36336
|
import {
|
|
@@ -35013,13 +36339,13 @@ import {
|
|
|
35013
36339
|
isAbsolute as isAbsolute7,
|
|
35014
36340
|
join as join19,
|
|
35015
36341
|
relative as relative7,
|
|
35016
|
-
resolve as
|
|
36342
|
+
resolve as resolve18
|
|
35017
36343
|
} from "path";
|
|
35018
36344
|
|
|
35019
36345
|
// src/cli/install-integrity.ts
|
|
35020
36346
|
import { createRequire } from "module";
|
|
35021
36347
|
import { existsSync as existsSync16, readFileSync as readFileSync16, statSync as statSync5 } from "fs";
|
|
35022
|
-
import { isAbsolute as isAbsolute6, join as join18, relative as relative6, resolve as
|
|
36348
|
+
import { isAbsolute as isAbsolute6, join as join18, relative as relative6, resolve as resolve17 } from "path";
|
|
35023
36349
|
var SDK_SIDECAR_CRITICAL_PACKAGE_FILES = [
|
|
35024
36350
|
"dist/cli/index.mjs",
|
|
35025
36351
|
"dist/index.mjs",
|
|
@@ -35044,8 +36370,8 @@ function safeRelativePath(value) {
|
|
|
35044
36370
|
}
|
|
35045
36371
|
function resolveContainedPath(root, value) {
|
|
35046
36372
|
if (!safeRelativePath(value)) return null;
|
|
35047
|
-
const target =
|
|
35048
|
-
const relativeTarget = relative6(
|
|
36373
|
+
const target = resolve17(root, value);
|
|
36374
|
+
const relativeTarget = relative6(resolve17(root), target);
|
|
35049
36375
|
if (!relativeTarget || relativeTarget.startsWith("..") || isAbsolute6(relativeTarget)) {
|
|
35050
36376
|
return null;
|
|
35051
36377
|
}
|
|
@@ -35271,8 +36597,8 @@ function resolvePythonSidecarUpdatePlan(options) {
|
|
|
35271
36597
|
const stateDir = sidecarStateDir(options);
|
|
35272
36598
|
if (!stateDir) return null;
|
|
35273
36599
|
const relativeEntrypoint = relative7(
|
|
35274
|
-
|
|
35275
|
-
|
|
36600
|
+
resolve18(stateDir),
|
|
36601
|
+
resolve18(options.entrypoint)
|
|
35276
36602
|
);
|
|
35277
36603
|
if (!relativeEntrypoint || relativeEntrypoint.startsWith("..") || isAbsolute7(relativeEntrypoint)) {
|
|
35278
36604
|
return null;
|
|
@@ -35306,7 +36632,7 @@ function resolvePythonSidecarUpdatePlan(options) {
|
|
|
35306
36632
|
};
|
|
35307
36633
|
}
|
|
35308
36634
|
function findRepoBackedSdkRoot(startPath) {
|
|
35309
|
-
let current =
|
|
36635
|
+
let current = resolve18(startPath);
|
|
35310
36636
|
while (true) {
|
|
35311
36637
|
if (existsSync17(join19(current, "package.json")) && existsSync17(join19(current, "bin", "deepline-dev.ts"))) {
|
|
35312
36638
|
const parent2 = dirname18(current);
|
|
@@ -35325,7 +36651,7 @@ function inferNpmGlobalPrefixFromEntrypoint(entrypoint, env) {
|
|
|
35325
36651
|
try {
|
|
35326
36652
|
return realpathSync5(entrypoint);
|
|
35327
36653
|
} catch {
|
|
35328
|
-
return
|
|
36654
|
+
return resolve18(entrypoint);
|
|
35329
36655
|
}
|
|
35330
36656
|
})();
|
|
35331
36657
|
const parts = normalized.split(/[\\/]+/);
|
|
@@ -35341,9 +36667,9 @@ function inferNpmGlobalPrefixFromEntrypoint(entrypoint, env) {
|
|
|
35341
36667
|
const knownWindowsPrefixes = [
|
|
35342
36668
|
env.npm_config_prefix,
|
|
35343
36669
|
env.APPDATA ? join19(env.APPDATA, "npm") : void 0
|
|
35344
|
-
].filter((value) => Boolean(value)).map((value) =>
|
|
36670
|
+
].filter((value) => Boolean(value)).map((value) => resolve18(value).replace(/\\/g, "/").toLowerCase());
|
|
35345
36671
|
if (!knownWindowsPrefixes.includes(
|
|
35346
|
-
|
|
36672
|
+
resolve18(directPrefix).replace(/\\/g, "/").toLowerCase()
|
|
35347
36673
|
)) {
|
|
35348
36674
|
return null;
|
|
35349
36675
|
}
|
|
@@ -35356,9 +36682,9 @@ function normalizedNpmPrefix(value) {
|
|
|
35356
36682
|
if (!trimmed) return null;
|
|
35357
36683
|
const normalized = (() => {
|
|
35358
36684
|
try {
|
|
35359
|
-
return realpathSync5(
|
|
36685
|
+
return realpathSync5(resolve18(trimmed));
|
|
35360
36686
|
} catch {
|
|
35361
|
-
return
|
|
36687
|
+
return resolve18(trimmed);
|
|
35362
36688
|
}
|
|
35363
36689
|
})().replace(/\\/g, "/");
|
|
35364
36690
|
return process.platform === "win32" ? normalized.toLowerCase() : normalized;
|
|
@@ -35383,7 +36709,7 @@ function isHomebrewFormulaEntrypoint(entrypoint) {
|
|
|
35383
36709
|
try {
|
|
35384
36710
|
return realpathSync5(entrypoint);
|
|
35385
36711
|
} catch {
|
|
35386
|
-
return
|
|
36712
|
+
return resolve18(entrypoint);
|
|
35387
36713
|
}
|
|
35388
36714
|
})();
|
|
35389
36715
|
const parts = normalized.split(/[\\/]+/);
|
|
@@ -35393,7 +36719,7 @@ function isHomebrewFormulaEntrypoint(entrypoint) {
|
|
|
35393
36719
|
function resolveUpdatePlan(options = {}) {
|
|
35394
36720
|
const env = options.env ?? process.env;
|
|
35395
36721
|
const homeDir2 = options.homeDir ?? homedir11();
|
|
35396
|
-
const entrypoint = options.entrypoint ?? (process.argv[1] ?
|
|
36722
|
+
const entrypoint = options.entrypoint ?? (process.argv[1] ? resolve18(process.argv[1]) : "");
|
|
35397
36723
|
const sourceRoot = entrypoint ? findRepoBackedSdkRoot(dirname18(entrypoint)) : null;
|
|
35398
36724
|
if (sourceRoot) {
|
|
35399
36725
|
return {
|
|
@@ -35487,7 +36813,7 @@ function writeAutoUpdateFailure(plan, exitCode) {
|
|
|
35487
36813
|
};
|
|
35488
36814
|
try {
|
|
35489
36815
|
mkdirSync13(dirname18(path), { recursive: true });
|
|
35490
|
-
|
|
36816
|
+
writeFileSync17(path, `${JSON.stringify(marker, null, 2)}
|
|
35491
36817
|
`, "utf8");
|
|
35492
36818
|
} catch {
|
|
35493
36819
|
}
|
|
@@ -35679,7 +37005,7 @@ function writeSidecarLauncher(input2) {
|
|
|
35679
37005
|
)
|
|
35680
37006
|
];
|
|
35681
37007
|
if (process.platform === "win32") {
|
|
35682
|
-
|
|
37008
|
+
writeFileSync17(
|
|
35683
37009
|
input2.path,
|
|
35684
37010
|
[
|
|
35685
37011
|
`@set DEEPLINE_HOST_URL=${input2.hostUrl.replace(/\r?\n/g, "")}`,
|
|
@@ -35702,7 +37028,7 @@ function writeSidecarLauncher(input2) {
|
|
|
35702
37028
|
);
|
|
35703
37029
|
return;
|
|
35704
37030
|
}
|
|
35705
|
-
|
|
37031
|
+
writeFileSync17(
|
|
35706
37032
|
input2.path,
|
|
35707
37033
|
[
|
|
35708
37034
|
"#!/usr/bin/env sh",
|
|
@@ -35736,7 +37062,7 @@ async function runPythonSidecarUpdatePlan(plan) {
|
|
|
35736
37062
|
);
|
|
35737
37063
|
rmSync6(tempDir, { recursive: true, force: true });
|
|
35738
37064
|
mkdirSync13(tempDir, { recursive: true });
|
|
35739
|
-
|
|
37065
|
+
writeFileSync17(join19(tempDir, "package.json"), NPM_SDK_SIDECAR_PACKAGE_JSON);
|
|
35740
37066
|
const env = {
|
|
35741
37067
|
...process.env,
|
|
35742
37068
|
PATH: `${dirname18(plan.nodeBin)}${process.platform === "win32" ? ";" : ":"}${process.env.PATH ?? ""}`
|
|
@@ -35859,27 +37185,27 @@ async function runPythonSidecarUpdatePlan(plan) {
|
|
|
35859
37185
|
nodeBin: plan.nodeBin,
|
|
35860
37186
|
entryPath: finalEntryPath
|
|
35861
37187
|
});
|
|
35862
|
-
|
|
37188
|
+
writeFileSync17(
|
|
35863
37189
|
join19(plan.stateDir, ".version"),
|
|
35864
37190
|
`${installedVersion}
|
|
35865
37191
|
`,
|
|
35866
37192
|
"utf8"
|
|
35867
37193
|
);
|
|
35868
|
-
|
|
37194
|
+
writeFileSync17(
|
|
35869
37195
|
join19(plan.stateDir, ".install-method"),
|
|
35870
37196
|
"python-sidecar\n",
|
|
35871
37197
|
"utf8"
|
|
35872
37198
|
);
|
|
35873
|
-
|
|
37199
|
+
writeFileSync17(
|
|
35874
37200
|
join19(plan.stateDir, ".command-path"),
|
|
35875
37201
|
`${plan.sidecarPath}
|
|
35876
37202
|
`,
|
|
35877
37203
|
"utf8"
|
|
35878
37204
|
);
|
|
35879
|
-
|
|
35880
|
-
|
|
37205
|
+
writeFileSync17(join19(plan.stateDir, ".runner"), "node\n", "utf8");
|
|
37206
|
+
writeFileSync17(join19(plan.stateDir, ".node-bin"), `${plan.nodeBin}
|
|
35881
37207
|
`, "utf8");
|
|
35882
|
-
|
|
37208
|
+
writeFileSync17(
|
|
35883
37209
|
join19(plan.stateDir, ".entry-path"),
|
|
35884
37210
|
`${finalEntryPath}
|
|
35885
37211
|
`,
|
|
@@ -36812,17 +38138,17 @@ import {
|
|
|
36812
38138
|
existsSync as existsSync18,
|
|
36813
38139
|
mkdtempSync,
|
|
36814
38140
|
readFileSync as readFileSync18,
|
|
36815
|
-
writeFileSync as
|
|
38141
|
+
writeFileSync as writeFileSync19
|
|
36816
38142
|
} from "fs";
|
|
36817
38143
|
import { tmpdir as tmpdir5 } from "os";
|
|
36818
|
-
import { join as join21, resolve as
|
|
38144
|
+
import { join as join21, resolve as resolve19 } from "path";
|
|
36819
38145
|
|
|
36820
38146
|
// src/tool-output.ts
|
|
36821
38147
|
import {
|
|
36822
38148
|
closeSync as closeSync3,
|
|
36823
38149
|
mkdirSync as mkdirSync14,
|
|
36824
38150
|
openSync as openSync3,
|
|
36825
|
-
writeFileSync as
|
|
38151
|
+
writeFileSync as writeFileSync18,
|
|
36826
38152
|
writeSync
|
|
36827
38153
|
} from "fs";
|
|
36828
38154
|
import { homedir as homedir12 } from "os";
|
|
@@ -36960,7 +38286,7 @@ function ensureOutputDir() {
|
|
|
36960
38286
|
function writeJsonOutputFile(payload, stem) {
|
|
36961
38287
|
const outputDir = ensureOutputDir();
|
|
36962
38288
|
const outputPath = join20(outputDir, `${stem}_${Date.now()}.json`);
|
|
36963
|
-
|
|
38289
|
+
writeFileSync18(outputPath, JSON.stringify(payload, null, 2), "utf-8");
|
|
36964
38290
|
return outputPath;
|
|
36965
38291
|
}
|
|
36966
38292
|
function writeCsvOutputFile(rows, stem, options) {
|
|
@@ -37301,9 +38627,9 @@ function requiredInputIds(tool) {
|
|
|
37301
38627
|
return toolInputFieldsForDisplay(inputSchema).filter((field) => field.required === true).map((field) => String(field.name ?? "")).filter(Boolean);
|
|
37302
38628
|
}
|
|
37303
38629
|
function notConnectedSuffix(tool) {
|
|
37304
|
-
const
|
|
37305
|
-
const status = stringField2(
|
|
37306
|
-
const connected =
|
|
38630
|
+
const record2 = tool;
|
|
38631
|
+
const status = stringField2(record2, "credentialStatus", "credential_status");
|
|
38632
|
+
const connected = record2.connected;
|
|
37307
38633
|
if (status === "requires_connection" || connected === false) {
|
|
37308
38634
|
return " - \u26A0 requires your credentials \u2014 not connected (connect to use)";
|
|
37309
38635
|
}
|
|
@@ -37678,19 +39004,19 @@ function printPlayAliasToolError(toolId, play) {
|
|
|
37678
39004
|
console.error(playAliasToolErrorMessage(toolId, play));
|
|
37679
39005
|
}
|
|
37680
39006
|
function isPlayLikeTool(tool) {
|
|
37681
|
-
const
|
|
37682
|
-
if (
|
|
37683
|
-
const playExpansion = recordField2(
|
|
39007
|
+
const record2 = tool;
|
|
39008
|
+
if (record2.isPlay === true || record2.is_play === true) return true;
|
|
39009
|
+
const playExpansion = recordField2(record2, "playExpansion", "play_expansion");
|
|
37684
39010
|
if (Object.keys(playExpansion).length > 0) return true;
|
|
37685
|
-
const toolId = typeof
|
|
39011
|
+
const toolId = typeof record2.toolId === "string" ? record2.toolId : "";
|
|
37686
39012
|
return toolId.endsWith("_waterfall");
|
|
37687
39013
|
}
|
|
37688
39014
|
function isMonitorTypeTool(tool) {
|
|
37689
39015
|
return stringField2(tool, "kind") === "monitor_type";
|
|
37690
39016
|
}
|
|
37691
39017
|
function playReferenceForTool(tool) {
|
|
37692
|
-
const
|
|
37693
|
-
const declared = stringField2(
|
|
39018
|
+
const record2 = tool;
|
|
39019
|
+
const declared = stringField2(record2, "playReference", "play_reference");
|
|
37694
39020
|
if (declared.startsWith("prebuilt/")) {
|
|
37695
39021
|
return declared;
|
|
37696
39022
|
}
|
|
@@ -38648,12 +39974,12 @@ function singleLineText(value, maxLength = 260) {
|
|
|
38648
39974
|
return `${text.slice(0, maxLength - 3).trimEnd()}...`;
|
|
38649
39975
|
}
|
|
38650
39976
|
function listedToolDescription(tool) {
|
|
38651
|
-
const
|
|
38652
|
-
return singleLineText(
|
|
39977
|
+
const record2 = tool;
|
|
39978
|
+
return singleLineText(record2.bestFor ?? record2.best_for ?? tool.description);
|
|
38653
39979
|
}
|
|
38654
39980
|
function formatListedToolCost(tool) {
|
|
38655
|
-
const
|
|
38656
|
-
const pricing = recordField2(
|
|
39981
|
+
const record2 = tool;
|
|
39982
|
+
const pricing = recordField2(record2, "pricing");
|
|
38657
39983
|
const displayText = stringField2(pricing, "displayText", "display_text");
|
|
38658
39984
|
return displayText ? `Cost: ${displayText}` : "";
|
|
38659
39985
|
}
|
|
@@ -38934,10 +40260,10 @@ function normalizeOutputFormat(raw) {
|
|
|
38934
40260
|
}
|
|
38935
40261
|
function resolveAtFilePath(rawPath) {
|
|
38936
40262
|
const trimmed = rawPath.trim();
|
|
38937
|
-
const resolved =
|
|
40263
|
+
const resolved = resolve19(trimmed);
|
|
38938
40264
|
if (existsSync18(resolved)) return resolved;
|
|
38939
40265
|
if (process.platform !== "win32" && trimmed.includes("\\")) {
|
|
38940
|
-
const normalized =
|
|
40266
|
+
const normalized = resolve19(trimmed.replace(/\\/g, "/"));
|
|
38941
40267
|
if (existsSync18(normalized)) return normalized;
|
|
38942
40268
|
}
|
|
38943
40269
|
return resolved;
|
|
@@ -39026,7 +40352,7 @@ function parseExecuteOptions(args) {
|
|
|
39026
40352
|
continue;
|
|
39027
40353
|
}
|
|
39028
40354
|
if ((arg === "--out" || arg === "-o") && args[index + 1]) {
|
|
39029
|
-
outPath =
|
|
40355
|
+
outPath = resolve19(args[++index]);
|
|
39030
40356
|
continue;
|
|
39031
40357
|
}
|
|
39032
40358
|
throw new Error(`Unknown option: ${arg}`);
|
|
@@ -39101,7 +40427,7 @@ export default definePlay(${JSON.stringify(playName)}, async (ctx) => {
|
|
|
39101
40427
|
description: ${JSON.stringify(`Seed ${input2.toolId} rows into a Deepline workflow-ready dataset.`)},
|
|
39102
40428
|
});
|
|
39103
40429
|
`;
|
|
39104
|
-
|
|
40430
|
+
writeFileSync19(scriptPath, script, { encoding: "utf-8", mode: 384 });
|
|
39105
40431
|
return {
|
|
39106
40432
|
path: scriptPath,
|
|
39107
40433
|
sourceCode: script,
|
|
@@ -39527,7 +40853,7 @@ Examples:
|
|
|
39527
40853
|
|
|
39528
40854
|
// src/cli/commands/workflow.ts
|
|
39529
40855
|
import { mkdir as mkdir5, readFile as readFile4, writeFile as writeFile5 } from "fs/promises";
|
|
39530
|
-
import { dirname as dirname20, join as join22, resolve as
|
|
40856
|
+
import { dirname as dirname20, join as join22, resolve as resolve20 } from "path";
|
|
39531
40857
|
|
|
39532
40858
|
// src/cli/workflow-to-play.ts
|
|
39533
40859
|
import { createHash as createHash5 } from "crypto";
|
|
@@ -39733,9 +41059,9 @@ function clientWithTimeout(timeoutSeconds) {
|
|
|
39733
41059
|
}
|
|
39734
41060
|
function readStatus(payload) {
|
|
39735
41061
|
if (!payload || typeof payload !== "object") return null;
|
|
39736
|
-
const
|
|
39737
|
-
if (typeof
|
|
39738
|
-
const run =
|
|
41062
|
+
const record2 = payload;
|
|
41063
|
+
if (typeof record2.status === "string") return record2.status;
|
|
41064
|
+
const run = record2.run;
|
|
39739
41065
|
if (run && typeof run === "object") {
|
|
39740
41066
|
const status = run.status;
|
|
39741
41067
|
if (typeof status === "string") return status;
|
|
@@ -39744,7 +41070,7 @@ function readStatus(payload) {
|
|
|
39744
41070
|
}
|
|
39745
41071
|
async function readJsonOption(payload, file) {
|
|
39746
41072
|
if (file) {
|
|
39747
|
-
const raw = await readFile4(
|
|
41073
|
+
const raw = await readFile4(resolve20(file), "utf8");
|
|
39748
41074
|
return JSON.parse(raw);
|
|
39749
41075
|
}
|
|
39750
41076
|
if (payload) {
|
|
@@ -39778,7 +41104,7 @@ async function transformOne(api, workflowId, outDir, publish) {
|
|
|
39778
41104
|
revision.config,
|
|
39779
41105
|
{ workflowName: workflow.name, version: revision.version }
|
|
39780
41106
|
);
|
|
39781
|
-
const file = join22(
|
|
41107
|
+
const file = join22(resolve20(outDir), `${compiled.playName}.play.ts`);
|
|
39782
41108
|
await mkdir5(dirname20(file), { recursive: true });
|
|
39783
41109
|
await writeFile5(file, compiled.sourceCode, "utf8");
|
|
39784
41110
|
let published = false;
|
|
@@ -40158,7 +41484,7 @@ function isDowngradeAutoUpdateResponse(response) {
|
|
|
40158
41484
|
return compareSemver(target, current) < 0;
|
|
40159
41485
|
}
|
|
40160
41486
|
function relaunchCurrentCommand(plan) {
|
|
40161
|
-
return new Promise((
|
|
41487
|
+
return new Promise((resolve21) => {
|
|
40162
41488
|
const command = plan.kind === "python-sidecar" ? plan.sidecarPath : process.execPath;
|
|
40163
41489
|
const args = plan.kind === "python-sidecar" ? process.argv.slice(2) : process.argv.slice(1);
|
|
40164
41490
|
const child = spawn5(command, args, {
|
|
@@ -40174,9 +41500,9 @@ function relaunchCurrentCommand(plan) {
|
|
|
40174
41500
|
`Deepline SDK/CLI updated, but relaunch failed: ${error.message}
|
|
40175
41501
|
`
|
|
40176
41502
|
);
|
|
40177
|
-
|
|
41503
|
+
resolve21(1);
|
|
40178
41504
|
});
|
|
40179
|
-
child.on("close", (code) =>
|
|
41505
|
+
child.on("close", (code) => resolve21(code ?? 1));
|
|
40180
41506
|
});
|
|
40181
41507
|
}
|
|
40182
41508
|
async function maybeAutoUpdateAndRelaunch(response, baseUrl) {
|
|
@@ -40324,8 +41650,8 @@ function classifyNetworkFailure(error) {
|
|
|
40324
41650
|
let current = error;
|
|
40325
41651
|
while (current && !seen.has(current)) {
|
|
40326
41652
|
seen.add(current);
|
|
40327
|
-
const
|
|
40328
|
-
const code = String(
|
|
41653
|
+
const record2 = typeof current === "object" && current !== null ? current : {};
|
|
41654
|
+
const code = String(record2.code ?? "").toLowerCase();
|
|
40329
41655
|
const name = current instanceof Error ? current.name.toLowerCase() : "";
|
|
40330
41656
|
const text = String(
|
|
40331
41657
|
current instanceof Error ? current.message : current
|
|
@@ -40352,7 +41678,7 @@ function classifyNetworkFailure(error) {
|
|
|
40352
41678
|
if (combined.includes("ssl") || combined.includes("tls") || combined.includes("unexpected_eof_while_reading")) {
|
|
40353
41679
|
return "network_ssl_error";
|
|
40354
41680
|
}
|
|
40355
|
-
current =
|
|
41681
|
+
current = record2.cause ?? record2.context;
|
|
40356
41682
|
}
|
|
40357
41683
|
return "network_error";
|
|
40358
41684
|
}
|