deepline 0.1.264 → 0.1.266
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/release.ts +1 -1
- package/dist/bundling-sources/sdk/src/types.ts +58 -0
- package/dist/bundling-sources/shared_libs/play-runtime/context.ts +20 -1
- package/dist/bundling-sources/shared_libs/play-runtime/csv-rename.ts +50 -4
- package/dist/bundling-sources/shared_libs/play-runtime/secret-resolution-retry-policy.ts +6 -0
- package/dist/cli/index.js +131 -257
- package/dist/cli/index.mjs +129 -255
- package/dist/index.d.mts +56 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -703,7 +703,7 @@ var SDK_RELEASE = {
|
|
|
703
703
|
// 0.1.253 makes play-page browser opening opt-in and retires --no-open.
|
|
704
704
|
// 0.1.254 removes the internal operations tree from the published SDK CLI.
|
|
705
705
|
// Operators use the checkout-local deepline-admin binary instead.
|
|
706
|
-
version: "0.1.
|
|
706
|
+
version: "0.1.266",
|
|
707
707
|
apiContract: "2026-07-admin-cli-local-cutover",
|
|
708
708
|
supportPolicy: {
|
|
709
709
|
minimumSupported: "0.1.53",
|
|
@@ -14285,6 +14285,26 @@ function withOrdinaryRunAgainCommand(status, options, resolvedRevisionId) {
|
|
|
14285
14285
|
rerunCommand: buildOrdinaryPlayRunCommand(options, resolvedRevisionId)
|
|
14286
14286
|
} : status;
|
|
14287
14287
|
}
|
|
14288
|
+
function buildBillingRollupTextLines(status) {
|
|
14289
|
+
const billing = status.billing;
|
|
14290
|
+
const rollup = billing?.rollup;
|
|
14291
|
+
if (!rollup) return [];
|
|
14292
|
+
const total = formatCreditAmount(rollup.totalCreditsRollup);
|
|
14293
|
+
if (rollup.childCredits > 0 && rollup.descendantRunCount > 0) {
|
|
14294
|
+
const own = formatCreditAmount(rollup.ownCredits);
|
|
14295
|
+
const child = formatCreditAmount(rollup.childCredits);
|
|
14296
|
+
const suffix = rollup.rollupComplete ? "" : " (incomplete: child billing could not be fully resolved)";
|
|
14297
|
+
return [
|
|
14298
|
+
` cost: ${total} credits total \u2014 ${own} this run + ${child} across ${rollup.descendantRunCount} child run${rollup.descendantRunCount === 1 ? "" : "s"}${suffix}`
|
|
14299
|
+
];
|
|
14300
|
+
}
|
|
14301
|
+
if (!rollup.rollupComplete) {
|
|
14302
|
+
return [
|
|
14303
|
+
` cost: ${total} credits (incomplete: child billing could not be fully resolved${rollup.rollupError ? ` \u2014 ${rollup.rollupError}` : ""})`
|
|
14304
|
+
];
|
|
14305
|
+
}
|
|
14306
|
+
return [` cost: ${total} credits`];
|
|
14307
|
+
}
|
|
14288
14308
|
function writePlayResult(status, jsonOutput, options) {
|
|
14289
14309
|
const packaged = getPlayRunPackage(status);
|
|
14290
14310
|
if (jsonOutput) {
|
|
@@ -14347,6 +14367,7 @@ function writePlayResult(status, jsonOutput, options) {
|
|
|
14347
14367
|
lines.push(...renderedServerView.lines);
|
|
14348
14368
|
}
|
|
14349
14369
|
lines.push(...renderedServerView.actions);
|
|
14370
|
+
lines.push(...buildBillingRollupTextLines(status));
|
|
14350
14371
|
const compact = compactPlayStatus(status);
|
|
14351
14372
|
const payload = options?.fullJson ? status : compact;
|
|
14352
14373
|
printCommandEnvelope(
|
|
@@ -25722,243 +25743,82 @@ Examples:
|
|
|
25722
25743
|
);
|
|
25723
25744
|
}
|
|
25724
25745
|
|
|
25725
|
-
// src/cli/
|
|
25726
|
-
|
|
25727
|
-
|
|
25728
|
-
|
|
25729
|
-
|
|
25730
|
-
|
|
25731
|
-
|
|
25732
|
-
|
|
25733
|
-
|
|
25734
|
-
|
|
25735
|
-
|
|
25736
|
-
|
|
25737
|
-
|
|
25738
|
-
|
|
25739
|
-
|
|
25740
|
-
|
|
25741
|
-
|
|
25742
|
-
});
|
|
25743
|
-
return result.status === 0;
|
|
25744
|
-
} catch {
|
|
25745
|
-
return false;
|
|
25746
|
+
// src/cli/getting-started.ts
|
|
25747
|
+
var DEEPLINE_GTM_SKILL = "/deepline-gtm";
|
|
25748
|
+
var DEEPLINE_GTM_STARTER_PROMPTS = [
|
|
25749
|
+
{
|
|
25750
|
+
id: "waterfall-email-lookup",
|
|
25751
|
+
title: "Waterfall email lookup",
|
|
25752
|
+
prompt: "/deepline-gtm Find 5 CTOs in NYC and get their verified work emails."
|
|
25753
|
+
},
|
|
25754
|
+
{
|
|
25755
|
+
id: "signal-based-outbound",
|
|
25756
|
+
title: "Signal-based outbound",
|
|
25757
|
+
prompt: "/deepline-gtm Find 5 leads engaging with Gong's competitors on LinkedIn. Score against CMO or VP of Marketing. Waterfall enrich their emails. Build a sequence-ready list with personalized first lines."
|
|
25758
|
+
},
|
|
25759
|
+
{
|
|
25760
|
+
id: "vc-portfolio-scrape",
|
|
25761
|
+
title: "VC portfolio scrape",
|
|
25762
|
+
prompt: "/deepline-gtm Pull 5 companies from Y Combinator W26. Find the Head of Marketing or VP Sales at each one. Waterfall their emails and write a personalized first line."
|
|
25746
25763
|
}
|
|
25764
|
+
];
|
|
25765
|
+
var DEEPLINE_GTM_HANDOFF_QUESTION = "Would you like to try one of these examples, or tell me your own business problem?";
|
|
25766
|
+
function deeplineGtmGettingStartedPayload() {
|
|
25767
|
+
return {
|
|
25768
|
+
skill: DEEPLINE_GTM_SKILL,
|
|
25769
|
+
examples: DEEPLINE_GTM_STARTER_PROMPTS,
|
|
25770
|
+
question: DEEPLINE_GTM_HANDOFF_QUESTION,
|
|
25771
|
+
customProblemBehavior: "Turn the business problem into one exact /deepline-gtm prompt, show that reusable prompt, then execute it without asking the user to paste it again."
|
|
25772
|
+
};
|
|
25747
25773
|
}
|
|
25748
|
-
|
|
25749
|
-
|
|
25750
|
-
const child = spawn2("claude", [prompt], {
|
|
25751
|
-
stdio: "inherit",
|
|
25752
|
-
shell: process.platform === "win32"
|
|
25753
|
-
});
|
|
25754
|
-
child.on("error", () => resolve15(EXIT_SERVER3));
|
|
25755
|
-
child.on("close", (status) => resolve15(status ?? EXIT_OK2));
|
|
25756
|
-
});
|
|
25757
|
-
}
|
|
25758
|
-
function readBody(req) {
|
|
25759
|
-
return new Promise((resolve15, reject) => {
|
|
25760
|
-
let raw = "";
|
|
25761
|
-
req.setEncoding("utf8");
|
|
25762
|
-
req.on("data", (chunk) => {
|
|
25763
|
-
raw += chunk;
|
|
25764
|
-
if (raw.length > MAX_BODY_BYTES) {
|
|
25765
|
-
reject(new Error("Request body too large."));
|
|
25766
|
-
req.destroy();
|
|
25767
|
-
}
|
|
25768
|
-
});
|
|
25769
|
-
req.on("end", () => resolve15(raw));
|
|
25770
|
-
req.on("error", reject);
|
|
25771
|
-
});
|
|
25772
|
-
}
|
|
25773
|
-
function writeJson(res, status, payload) {
|
|
25774
|
-
res.writeHead(status, { "content-type": "application/json" });
|
|
25775
|
-
res.end(JSON.stringify(payload));
|
|
25776
|
-
}
|
|
25777
|
-
function startCallbackServer(input2) {
|
|
25778
|
-
const server = createServer((req, res) => {
|
|
25779
|
-
res.setHeader("Access-Control-Allow-Origin", req.headers.origin ?? "*");
|
|
25780
|
-
res.setHeader("Vary", "Origin");
|
|
25781
|
-
res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
|
|
25782
|
-
res.setHeader("Access-Control-Allow-Headers", "content-type");
|
|
25783
|
-
res.setHeader("Access-Control-Allow-Private-Network", "true");
|
|
25784
|
-
res.setHeader("Access-Control-Max-Age", "600");
|
|
25785
|
-
if (req.method === "OPTIONS") {
|
|
25786
|
-
res.writeHead(204);
|
|
25787
|
-
res.end();
|
|
25788
|
-
return;
|
|
25789
|
-
}
|
|
25790
|
-
if (req.method !== "POST" || req.url !== "/submit") {
|
|
25791
|
-
writeJson(res, 404, { error: "Not found." });
|
|
25792
|
-
return;
|
|
25793
|
-
}
|
|
25794
|
-
void readBody(req).then((raw) => {
|
|
25795
|
-
let body = null;
|
|
25796
|
-
try {
|
|
25797
|
-
body = JSON.parse(raw);
|
|
25798
|
-
} catch {
|
|
25799
|
-
body = null;
|
|
25800
|
-
}
|
|
25801
|
-
const state = typeof body?.state === "string" ? body.state : "";
|
|
25802
|
-
const prompt = typeof body?.prompt === "string" ? body.prompt.trim() : "";
|
|
25803
|
-
const workflowId = typeof body?.workflow_id === "string" && body.workflow_id.trim() ? body.workflow_id.trim() : null;
|
|
25804
|
-
if (!state || state !== input2.state) {
|
|
25805
|
-
writeJson(res, 403, { error: "Invalid quickstart state token." });
|
|
25806
|
-
return;
|
|
25807
|
-
}
|
|
25808
|
-
if (!prompt) {
|
|
25809
|
-
writeJson(res, 400, { error: "prompt is required." });
|
|
25810
|
-
return;
|
|
25811
|
-
}
|
|
25812
|
-
if (prompt.length > MAX_PROMPT_LENGTH) {
|
|
25813
|
-
writeJson(res, 400, {
|
|
25814
|
-
error: `prompt exceeds ${MAX_PROMPT_LENGTH} characters.`
|
|
25815
|
-
});
|
|
25816
|
-
return;
|
|
25817
|
-
}
|
|
25818
|
-
writeJson(res, 200, { ok: true });
|
|
25819
|
-
setImmediate(() => input2.onSelection({ prompt, workflowId }));
|
|
25820
|
-
}).catch(() => {
|
|
25821
|
-
writeJson(res, 400, { error: "Invalid request body." });
|
|
25822
|
-
});
|
|
25823
|
-
});
|
|
25824
|
-
return new Promise((resolve15, reject) => {
|
|
25825
|
-
server.once("error", reject);
|
|
25826
|
-
server.listen(0, "127.0.0.1", () => {
|
|
25827
|
-
const address = server.address();
|
|
25828
|
-
if (!address || typeof address === "string") {
|
|
25829
|
-
reject(new Error("Failed to bind quickstart callback server."));
|
|
25830
|
-
return;
|
|
25831
|
-
}
|
|
25832
|
-
resolve15({ server, port: address.port });
|
|
25833
|
-
});
|
|
25834
|
-
});
|
|
25835
|
-
}
|
|
25774
|
+
|
|
25775
|
+
// src/cli/commands/quickstart.ts
|
|
25836
25776
|
async function handleQuickstart(options) {
|
|
25837
25777
|
const jsonOutput = shouldEmitJson(options.json === true);
|
|
25838
|
-
const
|
|
25839
|
-
|
|
25840
|
-
|
|
25841
|
-
|
|
25842
|
-
);
|
|
25843
|
-
let apiKey = resolveApiKeyForBaseUrl(baseUrl);
|
|
25844
|
-
if (!apiKey) {
|
|
25845
|
-
if (interactive) {
|
|
25846
|
-
console.error("Not connected yet \u2014 registering this device first.");
|
|
25847
|
-
const registerExit = await handleRegister([]);
|
|
25848
|
-
if (registerExit !== EXIT_OK2) return registerExit;
|
|
25849
|
-
apiKey = resolveApiKeyForBaseUrl(baseUrl);
|
|
25850
|
-
}
|
|
25851
|
-
if (!apiKey) {
|
|
25852
|
-
console.error("Not connected. Run: deepline auth register");
|
|
25853
|
-
return EXIT_AUTH2;
|
|
25854
|
-
}
|
|
25855
|
-
}
|
|
25856
|
-
const state = randomBytes(32).toString("hex");
|
|
25857
|
-
let resolveSelection;
|
|
25858
|
-
const selectionPromise = new Promise((resolve15) => {
|
|
25859
|
-
resolveSelection = resolve15;
|
|
25860
|
-
});
|
|
25861
|
-
let callback;
|
|
25862
|
-
try {
|
|
25863
|
-
callback = await startCallbackServer({
|
|
25864
|
-
state,
|
|
25865
|
-
onSelection: (selection) => resolveSelection(selection)
|
|
25866
|
-
});
|
|
25867
|
-
} catch (error) {
|
|
25868
|
-
console.error(
|
|
25869
|
-
`Could not start the local quickstart listener: ${error instanceof Error ? error.message : String(error)}`
|
|
25870
|
-
);
|
|
25871
|
-
return EXIT_SERVER3;
|
|
25872
|
-
}
|
|
25873
|
-
const quickstartUrl = `${baseUrl}/cli/quickstart?cb=${callback.port}&state=${state}`;
|
|
25874
|
-
console.error(" Opening the recipe picker in your browser.");
|
|
25875
|
-
console.error(` If it didn't open, cmd+click: ${quickstartUrl}`);
|
|
25876
|
-
if (options.open !== false) {
|
|
25877
|
-
openInBrowser(quickstartUrl);
|
|
25878
|
-
}
|
|
25879
|
-
const timeoutSeconds = Number.parseInt(options.timeout ?? "300", 10);
|
|
25880
|
-
const timeoutMs = (Number.isFinite(timeoutSeconds) && timeoutSeconds > 0 ? timeoutSeconds : 300) * 1e3;
|
|
25881
|
-
const timeoutHandle = setTimeout(
|
|
25882
|
-
() => resolveSelection("timeout"),
|
|
25883
|
-
timeoutMs
|
|
25884
|
-
);
|
|
25885
|
-
const progress = createCliProgress(!jsonOutput);
|
|
25886
|
-
progress.phase("waiting for your pick in the browser (Ctrl+C to skip)");
|
|
25887
|
-
const onSigint = () => resolveSelection("sigint");
|
|
25888
|
-
process.once("SIGINT", onSigint);
|
|
25889
|
-
const outcome = await selectionPromise;
|
|
25890
|
-
clearTimeout(timeoutHandle);
|
|
25891
|
-
process.removeListener("SIGINT", onSigint);
|
|
25892
|
-
callback.server.close();
|
|
25893
|
-
if (outcome === "sigint") {
|
|
25894
|
-
progress.fail();
|
|
25895
|
-
console.error("\nSkipped \u2014 run `deepline quickstart` anytime.");
|
|
25896
|
-
return EXIT_OK2;
|
|
25897
|
-
}
|
|
25898
|
-
if (outcome === "timeout") {
|
|
25899
|
-
progress.fail();
|
|
25900
|
-
console.error(
|
|
25901
|
-
"Timed out waiting for a selection. Run: deepline quickstart"
|
|
25902
|
-
);
|
|
25903
|
-
return EXIT_AUTH2;
|
|
25904
|
-
}
|
|
25905
|
-
progress.complete();
|
|
25906
|
-
const { prompt, workflowId } = outcome;
|
|
25907
|
-
const claudeCommand = `claude ${shellQuote3(prompt)}`;
|
|
25908
|
-
const claudeAvailable = hasClaudeBinary();
|
|
25909
|
-
const willLaunch = options.launch !== false && !jsonOutput && interactive && claudeAvailable;
|
|
25778
|
+
const gettingStarted = {
|
|
25779
|
+
skill: DEEPLINE_GTM_SKILL,
|
|
25780
|
+
examples: DEEPLINE_GTM_STARTER_PROMPTS
|
|
25781
|
+
};
|
|
25910
25782
|
printCommandEnvelope(
|
|
25911
25783
|
{
|
|
25912
|
-
|
|
25913
|
-
|
|
25914
|
-
|
|
25915
|
-
|
|
25916
|
-
|
|
25917
|
-
|
|
25784
|
+
ok: true,
|
|
25785
|
+
status: "deprecated",
|
|
25786
|
+
code: "QUICKSTART_DEPRECATED",
|
|
25787
|
+
exitCode: 0,
|
|
25788
|
+
message: "`deepline quickstart` is deprecated. Start with the installed /deepline-gtm skill in your agent.",
|
|
25789
|
+
deprecatedCommand: "deepline quickstart",
|
|
25790
|
+
replacement: DEEPLINE_GTM_SKILL,
|
|
25791
|
+
gettingStarted,
|
|
25792
|
+
next: DEEPLINE_GTM_SKILL,
|
|
25918
25793
|
render: {
|
|
25919
25794
|
sections: [
|
|
25920
25795
|
{
|
|
25921
|
-
title: "quickstart",
|
|
25796
|
+
title: "quickstart deprecated",
|
|
25922
25797
|
lines: [
|
|
25923
|
-
|
|
25924
|
-
|
|
25798
|
+
`Use ${DEEPLINE_GTM_SKILL} in your agent instead.`,
|
|
25799
|
+
...DEEPLINE_GTM_STARTER_PROMPTS.map(
|
|
25800
|
+
(example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
|
|
25801
|
+
)
|
|
25925
25802
|
]
|
|
25926
25803
|
}
|
|
25927
|
-
]
|
|
25928
|
-
actions: [{ label: "Run", command: claudeCommand }]
|
|
25804
|
+
]
|
|
25929
25805
|
}
|
|
25930
25806
|
},
|
|
25931
25807
|
{ json: jsonOutput }
|
|
25932
25808
|
);
|
|
25933
|
-
|
|
25934
|
-
return launchClaude(prompt);
|
|
25935
|
-
}
|
|
25936
|
-
return EXIT_OK2;
|
|
25809
|
+
return 0;
|
|
25937
25810
|
}
|
|
25938
25811
|
function registerQuickstartCommands(program) {
|
|
25939
25812
|
program.command("quickstart").description(
|
|
25940
|
-
"
|
|
25813
|
+
"Deprecated compatibility command. Use /deepline-gtm in your agent."
|
|
25941
25814
|
).addHelpText(
|
|
25942
25815
|
"after",
|
|
25943
25816
|
`
|
|
25944
|
-
|
|
25945
|
-
|
|
25946
|
-
|
|
25947
|
-
on the same machine as the CLI. Once a recipe arrives, the CLI prints the
|
|
25948
|
-
matching claude command and, when Claude Code is installed and the shell is
|
|
25949
|
-
interactive, launches it directly. Press Ctrl+C while waiting to skip.
|
|
25950
|
-
|
|
25951
|
-
Examples:
|
|
25952
|
-
deepline quickstart
|
|
25953
|
-
deepline quickstart --no-open
|
|
25954
|
-
deepline quickstart --no-launch --json
|
|
25955
|
-
deepline quickstart --timeout 120
|
|
25817
|
+
Deprecated:
|
|
25818
|
+
Use the installed /deepline-gtm skill in your agent. This compatibility
|
|
25819
|
+
command prints three starter prompts and no longer opens a browser.
|
|
25956
25820
|
`
|
|
25957
|
-
).option("--json", "Emit JSON output. Also automatic when stdout is piped").option("--no-open", "
|
|
25958
|
-
"--timeout <seconds>",
|
|
25959
|
-
"Maximum seconds to wait for a selection",
|
|
25960
|
-
"300"
|
|
25961
|
-
).action(async (options) => {
|
|
25821
|
+
).option("--json", "Emit JSON output. Also automatic when stdout is piped").option("--no-open", "Deprecated compatibility option").option("--no-launch", "Deprecated compatibility option").option("--timeout <seconds>", "Deprecated compatibility option").action(async (options) => {
|
|
25962
25822
|
process.exitCode = await handleQuickstart(options);
|
|
25963
25823
|
});
|
|
25964
25824
|
}
|
|
@@ -27931,9 +27791,9 @@ function apifySyncRecoveryNext(rawResponse) {
|
|
|
27931
27791
|
const getDatasetItemsTool = stringField2(getDatasetItems, "tool");
|
|
27932
27792
|
const getDatasetItemsPayload = recordField2(getDatasetItems, "payload");
|
|
27933
27793
|
return {
|
|
27934
|
-
getActorRun: `deepline tools execute ${getActorRunTool} --input ${
|
|
27794
|
+
getActorRun: `deepline tools execute ${getActorRunTool} --input ${shellQuote3(JSON.stringify(getActorRunPayload))} --json`,
|
|
27935
27795
|
...getDatasetItemsTool && Object.keys(getDatasetItemsPayload).length > 0 ? {
|
|
27936
|
-
getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${
|
|
27796
|
+
getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${shellQuote3(JSON.stringify(getDatasetItemsPayload))} --json`
|
|
27937
27797
|
} : {}
|
|
27938
27798
|
};
|
|
27939
27799
|
}
|
|
@@ -28106,7 +27966,7 @@ function parseExecuteOptions(args) {
|
|
|
28106
27966
|
function safeFileStem(value) {
|
|
28107
27967
|
return value.trim().replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "tool";
|
|
28108
27968
|
}
|
|
28109
|
-
function
|
|
27969
|
+
function shellQuote3(value) {
|
|
28110
27970
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
28111
27971
|
}
|
|
28112
27972
|
function powerShellQuote(value) {
|
|
@@ -28176,7 +28036,7 @@ export default definePlay(${JSON.stringify(playName)}, async (ctx) => {
|
|
|
28176
28036
|
path: scriptPath,
|
|
28177
28037
|
sourceCode: script,
|
|
28178
28038
|
projectDir,
|
|
28179
|
-
macCopyCommand: `mkdir -p ${
|
|
28039
|
+
macCopyCommand: `mkdir -p ${shellQuote3(projectDir)} && cp ${shellQuote3(scriptPath)} ${shellQuote3(`${projectDir}/${fileName}`)}`,
|
|
28180
28040
|
windowsCopyCommand: `New-Item -ItemType Directory -Force -Path ${powerShellQuote(projectDir.replace(/\//g, "\\"))} | Out-Null; Copy-Item -LiteralPath ${powerShellQuote(scriptPath)} -Destination ${powerShellQuote(`${projectDir.replace(/\//g, "\\")}\\${fileName}`)}`
|
|
28181
28041
|
};
|
|
28182
28042
|
}
|
|
@@ -28200,7 +28060,7 @@ function buildToolExecuteBaseEnvelope(input2) {
|
|
|
28200
28060
|
envelope,
|
|
28201
28061
|
"output"
|
|
28202
28062
|
);
|
|
28203
|
-
const inspectCommand = `deepline tools execute ${input2.toolId} --input ${
|
|
28063
|
+
const inspectCommand = `deepline tools execute ${input2.toolId} --input ${shellQuote3(JSON.stringify(input2.params))} --json`;
|
|
28204
28064
|
const actions = input2.listConversion ? [
|
|
28205
28065
|
{
|
|
28206
28066
|
label: "next",
|
|
@@ -29054,7 +28914,7 @@ Notes:
|
|
|
29054
28914
|
}
|
|
29055
28915
|
|
|
29056
28916
|
// src/cli/commands/update.ts
|
|
29057
|
-
import { spawn as
|
|
28917
|
+
import { spawn as spawn3 } from "child_process";
|
|
29058
28918
|
import {
|
|
29059
28919
|
existsSync as existsSync12,
|
|
29060
28920
|
mkdirSync as mkdirSync10,
|
|
@@ -29069,7 +28929,7 @@ import { homedir as homedir12 } from "os";
|
|
|
29069
28929
|
import { dirname as dirname13, isAbsolute as isAbsolute3, join as join15, relative as relative2, resolve as resolve13 } from "path";
|
|
29070
28930
|
|
|
29071
28931
|
// src/cli/commands/skills.ts
|
|
29072
|
-
import { spawn as
|
|
28932
|
+
import { spawn as spawn2 } from "child_process";
|
|
29073
28933
|
import { existsSync as existsSync11, mkdirSync as mkdirSync9, readFileSync as readFileSync12, writeFileSync as writeFileSync14 } from "fs";
|
|
29074
28934
|
import { homedir as homedir11 } from "os";
|
|
29075
28935
|
import { dirname as dirname12, join as join14 } from "path";
|
|
@@ -29343,7 +29203,7 @@ function readSkillsInstallState(path) {
|
|
|
29343
29203
|
}
|
|
29344
29204
|
function runProcess(command, args, cwd) {
|
|
29345
29205
|
return new Promise((resolve15, reject) => {
|
|
29346
|
-
const child =
|
|
29206
|
+
const child = spawn2(command, args, {
|
|
29347
29207
|
cwd,
|
|
29348
29208
|
env: process.env,
|
|
29349
29209
|
stdio: ["ignore", "ignore", "pipe"],
|
|
@@ -29583,14 +29443,14 @@ function posixShellQuote(value) {
|
|
|
29583
29443
|
function windowsCmdQuote(value) {
|
|
29584
29444
|
return `"${value.replace(/"/g, '""')}"`;
|
|
29585
29445
|
}
|
|
29586
|
-
function
|
|
29446
|
+
function shellQuote4(value) {
|
|
29587
29447
|
if (process.platform === "win32") {
|
|
29588
29448
|
return /^[A-Za-z0-9_./:@%+=,-]+$/.test(value) ? value : windowsCmdQuote(value);
|
|
29589
29449
|
}
|
|
29590
29450
|
return posixShellQuote(value);
|
|
29591
29451
|
}
|
|
29592
29452
|
function buildSourceUpdateCommand(sourceRoot) {
|
|
29593
|
-
const quotedRoot =
|
|
29453
|
+
const quotedRoot = shellQuote4(sourceRoot);
|
|
29594
29454
|
const cdCommand = process.platform === "win32" ? `cd /d ${quotedRoot}` : `cd ${quotedRoot}`;
|
|
29595
29455
|
return `${cdCommand} && git fetch origin main --tags && git merge --ff-only origin/main`;
|
|
29596
29456
|
}
|
|
@@ -29602,7 +29462,7 @@ function buildSidecarProjectConfigCommand(versionDir, nodeBin) {
|
|
|
29602
29462
|
"fs.mkdirSync(dir,{recursive:true});",
|
|
29603
29463
|
`fs.writeFileSync(path.join(dir,'package.json'),${JSON.stringify(NPM_SDK_SIDECAR_PACKAGE_JSON)});`
|
|
29604
29464
|
].join("");
|
|
29605
|
-
return `${
|
|
29465
|
+
return `${shellQuote4(nodeBin)} -e ${shellQuote4(script)} ${shellQuote4(versionDir)}`;
|
|
29606
29466
|
}
|
|
29607
29467
|
function sidecarStateDir(input2) {
|
|
29608
29468
|
const scope = input2.env.DEEPLINE_CONFIG_SCOPE?.trim();
|
|
@@ -29665,7 +29525,7 @@ function resolvePythonSidecarUpdatePlan(options) {
|
|
|
29665
29525
|
const npmCommand = "npm";
|
|
29666
29526
|
const registryUrl = sidecarRegistryUrl(hostUrl);
|
|
29667
29527
|
const versionDir = join15(stateDir, "versions", "<version>");
|
|
29668
|
-
const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${
|
|
29528
|
+
const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${shellQuote4(versionDir)} --registry ${shellQuote4(registryUrl)} ${NPM_SDK_INSTALL_COMMON_FLAGS.map(shellQuote4).join(" ")} ${shellQuote4(packageSpec)}`;
|
|
29669
29529
|
return {
|
|
29670
29530
|
kind: "python-sidecar",
|
|
29671
29531
|
stateDir,
|
|
@@ -29749,7 +29609,7 @@ function resolveUpdatePlan(options = {}) {
|
|
|
29749
29609
|
fallbackRegistryUrl: publicNpmFallbackRegistryUrl(
|
|
29750
29610
|
env.DEEPLINE_HOST_URL?.trim() || autoDetectBaseUrl()
|
|
29751
29611
|
),
|
|
29752
|
-
manualCommand: `${command} ${args.map(
|
|
29612
|
+
manualCommand: `${command} ${args.map(shellQuote4).join(" ")}`
|
|
29753
29613
|
};
|
|
29754
29614
|
}
|
|
29755
29615
|
var AUTO_UPDATE_FAILURE_FILE = ".auto-update-failure.json";
|
|
@@ -29869,7 +29729,7 @@ function installedPackageVersion(versionDir) {
|
|
|
29869
29729
|
function runCommand(command, args, env = process.env) {
|
|
29870
29730
|
return new Promise((resolveResult) => {
|
|
29871
29731
|
let output2 = "";
|
|
29872
|
-
const child =
|
|
29732
|
+
const child = spawn3(command, args, {
|
|
29873
29733
|
stdio: ["inherit", "pipe", "pipe"],
|
|
29874
29734
|
shell: process.platform === "win32",
|
|
29875
29735
|
env
|
|
@@ -29954,9 +29814,9 @@ function writeSidecarLauncher(input2) {
|
|
|
29954
29814
|
input2.path,
|
|
29955
29815
|
[
|
|
29956
29816
|
"#!/usr/bin/env sh",
|
|
29957
|
-
`export DEEPLINE_HOST_URL=${
|
|
29958
|
-
`export DEEPLINE_CONFIG_SCOPE=${
|
|
29959
|
-
`exec ${
|
|
29817
|
+
`export DEEPLINE_HOST_URL=${shellQuote4(input2.hostUrl)}`,
|
|
29818
|
+
`export DEEPLINE_CONFIG_SCOPE=${shellQuote4(input2.scope)}`,
|
|
29819
|
+
`exec ${shellQuote4(input2.nodeBin)} ${shellQuote4(input2.entryPath)} "$@"`,
|
|
29960
29820
|
""
|
|
29961
29821
|
].join("\n"),
|
|
29962
29822
|
{ encoding: "utf8", mode: 493 }
|
|
@@ -30168,7 +30028,7 @@ Examples:
|
|
|
30168
30028
|
}
|
|
30169
30029
|
|
|
30170
30030
|
// src/cli/commands/setup.ts
|
|
30171
|
-
import { spawnSync
|
|
30031
|
+
import { spawnSync } from "child_process";
|
|
30172
30032
|
import {
|
|
30173
30033
|
existsSync as existsSync13,
|
|
30174
30034
|
lstatSync,
|
|
@@ -30279,6 +30139,15 @@ function resolveScopeRoot(scope) {
|
|
|
30279
30139
|
function authScopeForSetup(scope) {
|
|
30280
30140
|
return scope === "local" ? "folder" : "global";
|
|
30281
30141
|
}
|
|
30142
|
+
function shouldOpenSetupAuthorization(runtime = detectAgentRuntime()) {
|
|
30143
|
+
return runtime !== "claude_cowork";
|
|
30144
|
+
}
|
|
30145
|
+
function openSetupAuthorization(authorizationUrl, options = {}) {
|
|
30146
|
+
const url = authorizationUrl.trim();
|
|
30147
|
+
if (!url || !shouldOpenSetupAuthorization(options.runtime)) return false;
|
|
30148
|
+
(options.open ?? openInBrowser)(url);
|
|
30149
|
+
return true;
|
|
30150
|
+
}
|
|
30282
30151
|
function setupStatePath(baseUrl, scope, root) {
|
|
30283
30152
|
return scope === "local" && root ? join16(root, ".deepline", "setup", "state.json") : join16(sdkCliStateDirPath(baseUrl), "setup.json");
|
|
30284
30153
|
}
|
|
@@ -30361,7 +30230,7 @@ function removeKnownLegacyPaths(baseUrl) {
|
|
|
30361
30230
|
return removed;
|
|
30362
30231
|
}
|
|
30363
30232
|
function resolvePathCommands(command) {
|
|
30364
|
-
const lookup =
|
|
30233
|
+
const lookup = spawnSync(
|
|
30365
30234
|
process.platform === "win32" ? "where" : "which",
|
|
30366
30235
|
process.platform === "win32" ? [command] : ["-a", command],
|
|
30367
30236
|
{ encoding: "utf8", shell: process.platform === "win32" }
|
|
@@ -30376,7 +30245,7 @@ function resolvePathCommand(command) {
|
|
|
30376
30245
|
return resolvePathCommands(command)[0] ?? null;
|
|
30377
30246
|
}
|
|
30378
30247
|
function resolvePersistentGlobalCommand() {
|
|
30379
|
-
const prefix =
|
|
30248
|
+
const prefix = spawnSync("npm", ["prefix", "-g"], { encoding: "utf8" });
|
|
30380
30249
|
if (prefix.status !== 0) return null;
|
|
30381
30250
|
const root = String(prefix.stdout ?? "").trim();
|
|
30382
30251
|
if (!root) return null;
|
|
@@ -30468,9 +30337,6 @@ function rollbackCommand(scope, root) {
|
|
|
30468
30337
|
const prefix = scope === "local" && root ? ` --prefix ${JSON.stringify(join16(root, ".deepline", "runtime"))}` : "";
|
|
30469
30338
|
return `npm install -g${prefix} --no-audit --no-fund --include=optional --allow-scripts=esbuild deepline@${SDK_VERSION}`;
|
|
30470
30339
|
}
|
|
30471
|
-
function setupQuickstartCommand(baseUrl) {
|
|
30472
|
-
return baseUrl === "https://code.deepline.com" ? "deepline quickstart" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} deepline quickstart`;
|
|
30473
|
-
}
|
|
30474
30340
|
function setupResumeCommand(baseUrl, scope) {
|
|
30475
30341
|
const hostPrefix = baseUrl === "https://code.deepline.com" ? "" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} `;
|
|
30476
30342
|
return `${hostPrefix}deepline setup --scope ${scope} --json`;
|
|
@@ -30620,7 +30486,7 @@ async function runDoctorCommand(options) {
|
|
|
30620
30486
|
root,
|
|
30621
30487
|
authStatus
|
|
30622
30488
|
});
|
|
30623
|
-
const
|
|
30489
|
+
const gettingStarted = deeplineGtmGettingStartedPayload();
|
|
30624
30490
|
printCommandEnvelope(
|
|
30625
30491
|
{
|
|
30626
30492
|
ok,
|
|
@@ -30628,7 +30494,8 @@ async function runDoctorCommand(options) {
|
|
|
30628
30494
|
code: ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
|
|
30629
30495
|
exitCode: ok ? 0 : 7,
|
|
30630
30496
|
checks,
|
|
30631
|
-
next: ok ?
|
|
30497
|
+
next: ok ? DEEPLINE_GTM_SKILL : "Review failed checks, then rerun: deepline doctor --json",
|
|
30498
|
+
...ok ? { gettingStarted } : {},
|
|
30632
30499
|
render: {
|
|
30633
30500
|
sections: [
|
|
30634
30501
|
{
|
|
@@ -30657,6 +30524,7 @@ function pendingResult(input2) {
|
|
|
30657
30524
|
phases: input2.phases
|
|
30658
30525
|
});
|
|
30659
30526
|
if (input2.authorizationUrl) {
|
|
30527
|
+
openSetupAuthorization(input2.authorizationUrl);
|
|
30660
30528
|
process.stderr.write(`Authorize Deepline: ${input2.authorizationUrl}
|
|
30661
30529
|
`);
|
|
30662
30530
|
}
|
|
@@ -30740,7 +30608,7 @@ async function runSetupCommand(options) {
|
|
|
30740
30608
|
json: options.json,
|
|
30741
30609
|
extra: {
|
|
30742
30610
|
persistentPath: globalCli.persistentPath,
|
|
30743
|
-
fallback: "https://code.deepline.com/
|
|
30611
|
+
fallback: "https://code.deepline.com/SKILL.md"
|
|
30744
30612
|
}
|
|
30745
30613
|
});
|
|
30746
30614
|
}
|
|
@@ -30943,14 +30811,15 @@ async function runSetupCommand(options) {
|
|
|
30943
30811
|
root,
|
|
30944
30812
|
authStatus: auth
|
|
30945
30813
|
});
|
|
30946
|
-
const
|
|
30814
|
+
const gettingStarted = deeplineGtmGettingStartedPayload();
|
|
30947
30815
|
const doctorPayload = {
|
|
30948
30816
|
ok: assessment.ok,
|
|
30949
30817
|
status: assessment.ok ? "complete" : "failed",
|
|
30950
30818
|
code: assessment.ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
|
|
30951
30819
|
exitCode: assessment.ok ? 0 : 7,
|
|
30952
30820
|
checks: assessment.checks,
|
|
30953
|
-
next: assessment.ok ?
|
|
30821
|
+
next: assessment.ok ? DEEPLINE_GTM_SKILL : `deepline doctor --scope ${scope} --json`,
|
|
30822
|
+
...assessment.ok ? { gettingStarted } : {}
|
|
30954
30823
|
};
|
|
30955
30824
|
if (!assessment.ok) {
|
|
30956
30825
|
return reportSetupPhaseFailure({
|
|
@@ -30997,14 +30866,19 @@ async function runSetupCommand(options) {
|
|
|
30997
30866
|
currentPhase: null,
|
|
30998
30867
|
failedPhase: null,
|
|
30999
30868
|
resumed,
|
|
31000
|
-
next:
|
|
30869
|
+
next: DEEPLINE_GTM_SKILL,
|
|
30870
|
+
gettingStarted,
|
|
31001
30871
|
render: {
|
|
31002
30872
|
sections: [
|
|
31003
30873
|
{
|
|
31004
30874
|
title: "setup",
|
|
31005
30875
|
lines: [
|
|
31006
30876
|
"Deepline is installed and connected.",
|
|
31007
|
-
`
|
|
30877
|
+
`Use ${DEEPLINE_GTM_SKILL} in your agent.`,
|
|
30878
|
+
...DEEPLINE_GTM_STARTER_PROMPTS.map(
|
|
30879
|
+
(example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
|
|
30880
|
+
),
|
|
30881
|
+
gettingStarted.question
|
|
31008
30882
|
]
|
|
31009
30883
|
}
|
|
31010
30884
|
]
|
|
@@ -31020,7 +30894,7 @@ function registerSetupCommands(program) {
|
|
|
31020
30894
|
`
|
|
31021
30895
|
Notes:
|
|
31022
30896
|
Setup is idempotent. Bare setup resumes the first incomplete or failed phase.
|
|
31023
|
-
It installs skills before auth and does not run
|
|
30897
|
+
It installs skills before auth and does not run a starter workflow.
|
|
31024
30898
|
JSON output includes phase status and an exact retry command.
|
|
31025
30899
|
|
|
31026
30900
|
Examples:
|
|
@@ -31143,7 +31017,7 @@ function unknownCommandNameFromMessage(message) {
|
|
|
31143
31017
|
}
|
|
31144
31018
|
|
|
31145
31019
|
// src/cli/self-update.ts
|
|
31146
|
-
import { spawn as
|
|
31020
|
+
import { spawn as spawn4 } from "child_process";
|
|
31147
31021
|
function envTruthy(name) {
|
|
31148
31022
|
const value = process.env[name]?.trim().toLowerCase();
|
|
31149
31023
|
return value === "1" || value === "true" || value === "yes";
|
|
@@ -31192,7 +31066,7 @@ function relaunchCurrentCommand(plan) {
|
|
|
31192
31066
|
return new Promise((resolve15) => {
|
|
31193
31067
|
const command = plan.kind === "python-sidecar" ? plan.sidecarPath : process.execPath;
|
|
31194
31068
|
const args = plan.kind === "python-sidecar" ? process.argv.slice(2) : process.argv.slice(1);
|
|
31195
|
-
const child =
|
|
31069
|
+
const child = spawn4(command, args, {
|
|
31196
31070
|
stdio: "inherit",
|
|
31197
31071
|
shell: process.platform === "win32",
|
|
31198
31072
|
env: {
|
|
@@ -31257,7 +31131,7 @@ async function maybeAutoUpdateAndRelaunch(response) {
|
|
|
31257
31131
|
}
|
|
31258
31132
|
|
|
31259
31133
|
// src/cli/skills-sync.ts
|
|
31260
|
-
import { spawn as
|
|
31134
|
+
import { spawn as spawn5, spawnSync as spawnSync2 } from "child_process";
|
|
31261
31135
|
import {
|
|
31262
31136
|
existsSync as existsSync14,
|
|
31263
31137
|
mkdirSync as mkdirSync12,
|
|
@@ -31406,13 +31280,13 @@ function buildBunxSkillsInstallArgs(baseUrl, skillNames) {
|
|
|
31406
31280
|
});
|
|
31407
31281
|
}
|
|
31408
31282
|
function hasCommand(command) {
|
|
31409
|
-
const result =
|
|
31283
|
+
const result = spawnSync2(command, ["--version"], {
|
|
31410
31284
|
stdio: "ignore",
|
|
31411
31285
|
shell: process.platform === "win32"
|
|
31412
31286
|
});
|
|
31413
31287
|
return result.status === 0;
|
|
31414
31288
|
}
|
|
31415
|
-
function
|
|
31289
|
+
function shellQuote5(arg) {
|
|
31416
31290
|
return `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
31417
31291
|
}
|
|
31418
31292
|
function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NAMES) {
|
|
@@ -31422,7 +31296,7 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
|
|
|
31422
31296
|
commands.push({
|
|
31423
31297
|
command: "bunx",
|
|
31424
31298
|
args: bunxArgs,
|
|
31425
|
-
manualCommand: `bunx ${bunxArgs.map(
|
|
31299
|
+
manualCommand: `bunx ${bunxArgs.map(shellQuote5).join(" ")}`
|
|
31426
31300
|
});
|
|
31427
31301
|
}
|
|
31428
31302
|
if (hasCommand("npx")) {
|
|
@@ -31430,14 +31304,14 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
|
|
|
31430
31304
|
commands.push({
|
|
31431
31305
|
command: "npx",
|
|
31432
31306
|
args: npxArgs,
|
|
31433
|
-
manualCommand: `npx ${npxArgs.map(
|
|
31307
|
+
manualCommand: `npx ${npxArgs.map(shellQuote5).join(" ")}`
|
|
31434
31308
|
});
|
|
31435
31309
|
}
|
|
31436
31310
|
return commands;
|
|
31437
31311
|
}
|
|
31438
31312
|
function runOneSkillsInstall(install) {
|
|
31439
31313
|
return new Promise((resolve15) => {
|
|
31440
|
-
const child =
|
|
31314
|
+
const child = spawn5(install.command, install.args, {
|
|
31441
31315
|
stdio: ["ignore", "ignore", "pipe"],
|
|
31442
31316
|
env: process.env
|
|
31443
31317
|
});
|
|
@@ -31521,7 +31395,7 @@ function runLegacySkillsCleanup() {
|
|
|
31521
31395
|
}
|
|
31522
31396
|
];
|
|
31523
31397
|
for (const candidate of candidates) {
|
|
31524
|
-
const result =
|
|
31398
|
+
const result = spawnSync2(candidate.command, candidate.args, {
|
|
31525
31399
|
stdio: "ignore",
|
|
31526
31400
|
env: process.env,
|
|
31527
31401
|
shell: process.platform === "win32"
|