deepline 0.1.264 → 0.1.265
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/cli/index.js +110 -257
- package/dist/cli/index.mjs +108 -255
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -125,7 +125,7 @@ export const SDK_RELEASE = {
|
|
|
125
125
|
// 0.1.253 makes play-page browser opening opt-in and retires --no-open.
|
|
126
126
|
// 0.1.254 removes the internal operations tree from the published SDK CLI.
|
|
127
127
|
// Operators use the checkout-local deepline-admin binary instead.
|
|
128
|
-
version: '0.1.
|
|
128
|
+
version: '0.1.265',
|
|
129
129
|
apiContract: '2026-07-admin-cli-local-cutover',
|
|
130
130
|
supportPolicy: {
|
|
131
131
|
minimumSupported: '0.1.53',
|
package/dist/cli/index.js
CHANGED
|
@@ -718,7 +718,7 @@ var SDK_RELEASE = {
|
|
|
718
718
|
// 0.1.253 makes play-page browser opening opt-in and retires --no-open.
|
|
719
719
|
// 0.1.254 removes the internal operations tree from the published SDK CLI.
|
|
720
720
|
// Operators use the checkout-local deepline-admin binary instead.
|
|
721
|
-
version: "0.1.
|
|
721
|
+
version: "0.1.265",
|
|
722
722
|
apiContract: "2026-07-admin-cli-local-cutover",
|
|
723
723
|
supportPolicy: {
|
|
724
724
|
minimumSupported: "0.1.53",
|
|
@@ -25686,243 +25686,82 @@ Examples:
|
|
|
25686
25686
|
);
|
|
25687
25687
|
}
|
|
25688
25688
|
|
|
25689
|
-
// src/cli/
|
|
25690
|
-
var
|
|
25691
|
-
var
|
|
25692
|
-
|
|
25693
|
-
|
|
25694
|
-
|
|
25695
|
-
|
|
25696
|
-
|
|
25697
|
-
|
|
25698
|
-
|
|
25699
|
-
|
|
25700
|
-
|
|
25701
|
-
|
|
25702
|
-
|
|
25703
|
-
|
|
25704
|
-
|
|
25705
|
-
|
|
25706
|
-
});
|
|
25707
|
-
return result.status === 0;
|
|
25708
|
-
} catch {
|
|
25709
|
-
return false;
|
|
25689
|
+
// src/cli/getting-started.ts
|
|
25690
|
+
var DEEPLINE_GTM_SKILL = "/deepline-gtm";
|
|
25691
|
+
var DEEPLINE_GTM_STARTER_PROMPTS = [
|
|
25692
|
+
{
|
|
25693
|
+
id: "waterfall-email-lookup",
|
|
25694
|
+
title: "Waterfall email lookup",
|
|
25695
|
+
prompt: "/deepline-gtm Find 5 CTOs in NYC and get their verified work emails."
|
|
25696
|
+
},
|
|
25697
|
+
{
|
|
25698
|
+
id: "signal-based-outbound",
|
|
25699
|
+
title: "Signal-based outbound",
|
|
25700
|
+
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."
|
|
25701
|
+
},
|
|
25702
|
+
{
|
|
25703
|
+
id: "vc-portfolio-scrape",
|
|
25704
|
+
title: "VC portfolio scrape",
|
|
25705
|
+
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."
|
|
25710
25706
|
}
|
|
25707
|
+
];
|
|
25708
|
+
var DEEPLINE_GTM_HANDOFF_QUESTION = "Would you like to try one of these examples, or tell me your own business problem?";
|
|
25709
|
+
function deeplineGtmGettingStartedPayload() {
|
|
25710
|
+
return {
|
|
25711
|
+
skill: DEEPLINE_GTM_SKILL,
|
|
25712
|
+
examples: DEEPLINE_GTM_STARTER_PROMPTS,
|
|
25713
|
+
question: DEEPLINE_GTM_HANDOFF_QUESTION,
|
|
25714
|
+
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."
|
|
25715
|
+
};
|
|
25711
25716
|
}
|
|
25712
|
-
|
|
25713
|
-
|
|
25714
|
-
const child = (0, import_node_child_process2.spawn)("claude", [prompt], {
|
|
25715
|
-
stdio: "inherit",
|
|
25716
|
-
shell: process.platform === "win32"
|
|
25717
|
-
});
|
|
25718
|
-
child.on("error", () => resolve15(EXIT_SERVER3));
|
|
25719
|
-
child.on("close", (status) => resolve15(status ?? EXIT_OK2));
|
|
25720
|
-
});
|
|
25721
|
-
}
|
|
25722
|
-
function readBody(req) {
|
|
25723
|
-
return new Promise((resolve15, reject) => {
|
|
25724
|
-
let raw = "";
|
|
25725
|
-
req.setEncoding("utf8");
|
|
25726
|
-
req.on("data", (chunk) => {
|
|
25727
|
-
raw += chunk;
|
|
25728
|
-
if (raw.length > MAX_BODY_BYTES) {
|
|
25729
|
-
reject(new Error("Request body too large."));
|
|
25730
|
-
req.destroy();
|
|
25731
|
-
}
|
|
25732
|
-
});
|
|
25733
|
-
req.on("end", () => resolve15(raw));
|
|
25734
|
-
req.on("error", reject);
|
|
25735
|
-
});
|
|
25736
|
-
}
|
|
25737
|
-
function writeJson(res, status, payload) {
|
|
25738
|
-
res.writeHead(status, { "content-type": "application/json" });
|
|
25739
|
-
res.end(JSON.stringify(payload));
|
|
25740
|
-
}
|
|
25741
|
-
function startCallbackServer(input2) {
|
|
25742
|
-
const server = (0, import_node_http.createServer)((req, res) => {
|
|
25743
|
-
res.setHeader("Access-Control-Allow-Origin", req.headers.origin ?? "*");
|
|
25744
|
-
res.setHeader("Vary", "Origin");
|
|
25745
|
-
res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
|
|
25746
|
-
res.setHeader("Access-Control-Allow-Headers", "content-type");
|
|
25747
|
-
res.setHeader("Access-Control-Allow-Private-Network", "true");
|
|
25748
|
-
res.setHeader("Access-Control-Max-Age", "600");
|
|
25749
|
-
if (req.method === "OPTIONS") {
|
|
25750
|
-
res.writeHead(204);
|
|
25751
|
-
res.end();
|
|
25752
|
-
return;
|
|
25753
|
-
}
|
|
25754
|
-
if (req.method !== "POST" || req.url !== "/submit") {
|
|
25755
|
-
writeJson(res, 404, { error: "Not found." });
|
|
25756
|
-
return;
|
|
25757
|
-
}
|
|
25758
|
-
void readBody(req).then((raw) => {
|
|
25759
|
-
let body = null;
|
|
25760
|
-
try {
|
|
25761
|
-
body = JSON.parse(raw);
|
|
25762
|
-
} catch {
|
|
25763
|
-
body = null;
|
|
25764
|
-
}
|
|
25765
|
-
const state = typeof body?.state === "string" ? body.state : "";
|
|
25766
|
-
const prompt = typeof body?.prompt === "string" ? body.prompt.trim() : "";
|
|
25767
|
-
const workflowId = typeof body?.workflow_id === "string" && body.workflow_id.trim() ? body.workflow_id.trim() : null;
|
|
25768
|
-
if (!state || state !== input2.state) {
|
|
25769
|
-
writeJson(res, 403, { error: "Invalid quickstart state token." });
|
|
25770
|
-
return;
|
|
25771
|
-
}
|
|
25772
|
-
if (!prompt) {
|
|
25773
|
-
writeJson(res, 400, { error: "prompt is required." });
|
|
25774
|
-
return;
|
|
25775
|
-
}
|
|
25776
|
-
if (prompt.length > MAX_PROMPT_LENGTH) {
|
|
25777
|
-
writeJson(res, 400, {
|
|
25778
|
-
error: `prompt exceeds ${MAX_PROMPT_LENGTH} characters.`
|
|
25779
|
-
});
|
|
25780
|
-
return;
|
|
25781
|
-
}
|
|
25782
|
-
writeJson(res, 200, { ok: true });
|
|
25783
|
-
setImmediate(() => input2.onSelection({ prompt, workflowId }));
|
|
25784
|
-
}).catch(() => {
|
|
25785
|
-
writeJson(res, 400, { error: "Invalid request body." });
|
|
25786
|
-
});
|
|
25787
|
-
});
|
|
25788
|
-
return new Promise((resolve15, reject) => {
|
|
25789
|
-
server.once("error", reject);
|
|
25790
|
-
server.listen(0, "127.0.0.1", () => {
|
|
25791
|
-
const address = server.address();
|
|
25792
|
-
if (!address || typeof address === "string") {
|
|
25793
|
-
reject(new Error("Failed to bind quickstart callback server."));
|
|
25794
|
-
return;
|
|
25795
|
-
}
|
|
25796
|
-
resolve15({ server, port: address.port });
|
|
25797
|
-
});
|
|
25798
|
-
});
|
|
25799
|
-
}
|
|
25717
|
+
|
|
25718
|
+
// src/cli/commands/quickstart.ts
|
|
25800
25719
|
async function handleQuickstart(options) {
|
|
25801
25720
|
const jsonOutput = shouldEmitJson(options.json === true);
|
|
25802
|
-
const
|
|
25803
|
-
|
|
25804
|
-
|
|
25805
|
-
|
|
25806
|
-
);
|
|
25807
|
-
let apiKey = resolveApiKeyForBaseUrl(baseUrl);
|
|
25808
|
-
if (!apiKey) {
|
|
25809
|
-
if (interactive) {
|
|
25810
|
-
console.error("Not connected yet \u2014 registering this device first.");
|
|
25811
|
-
const registerExit = await handleRegister([]);
|
|
25812
|
-
if (registerExit !== EXIT_OK2) return registerExit;
|
|
25813
|
-
apiKey = resolveApiKeyForBaseUrl(baseUrl);
|
|
25814
|
-
}
|
|
25815
|
-
if (!apiKey) {
|
|
25816
|
-
console.error("Not connected. Run: deepline auth register");
|
|
25817
|
-
return EXIT_AUTH2;
|
|
25818
|
-
}
|
|
25819
|
-
}
|
|
25820
|
-
const state = (0, import_node_crypto6.randomBytes)(32).toString("hex");
|
|
25821
|
-
let resolveSelection;
|
|
25822
|
-
const selectionPromise = new Promise((resolve15) => {
|
|
25823
|
-
resolveSelection = resolve15;
|
|
25824
|
-
});
|
|
25825
|
-
let callback;
|
|
25826
|
-
try {
|
|
25827
|
-
callback = await startCallbackServer({
|
|
25828
|
-
state,
|
|
25829
|
-
onSelection: (selection) => resolveSelection(selection)
|
|
25830
|
-
});
|
|
25831
|
-
} catch (error) {
|
|
25832
|
-
console.error(
|
|
25833
|
-
`Could not start the local quickstart listener: ${error instanceof Error ? error.message : String(error)}`
|
|
25834
|
-
);
|
|
25835
|
-
return EXIT_SERVER3;
|
|
25836
|
-
}
|
|
25837
|
-
const quickstartUrl = `${baseUrl}/cli/quickstart?cb=${callback.port}&state=${state}`;
|
|
25838
|
-
console.error(" Opening the recipe picker in your browser.");
|
|
25839
|
-
console.error(` If it didn't open, cmd+click: ${quickstartUrl}`);
|
|
25840
|
-
if (options.open !== false) {
|
|
25841
|
-
openInBrowser(quickstartUrl);
|
|
25842
|
-
}
|
|
25843
|
-
const timeoutSeconds = Number.parseInt(options.timeout ?? "300", 10);
|
|
25844
|
-
const timeoutMs = (Number.isFinite(timeoutSeconds) && timeoutSeconds > 0 ? timeoutSeconds : 300) * 1e3;
|
|
25845
|
-
const timeoutHandle = setTimeout(
|
|
25846
|
-
() => resolveSelection("timeout"),
|
|
25847
|
-
timeoutMs
|
|
25848
|
-
);
|
|
25849
|
-
const progress = createCliProgress(!jsonOutput);
|
|
25850
|
-
progress.phase("waiting for your pick in the browser (Ctrl+C to skip)");
|
|
25851
|
-
const onSigint = () => resolveSelection("sigint");
|
|
25852
|
-
process.once("SIGINT", onSigint);
|
|
25853
|
-
const outcome = await selectionPromise;
|
|
25854
|
-
clearTimeout(timeoutHandle);
|
|
25855
|
-
process.removeListener("SIGINT", onSigint);
|
|
25856
|
-
callback.server.close();
|
|
25857
|
-
if (outcome === "sigint") {
|
|
25858
|
-
progress.fail();
|
|
25859
|
-
console.error("\nSkipped \u2014 run `deepline quickstart` anytime.");
|
|
25860
|
-
return EXIT_OK2;
|
|
25861
|
-
}
|
|
25862
|
-
if (outcome === "timeout") {
|
|
25863
|
-
progress.fail();
|
|
25864
|
-
console.error(
|
|
25865
|
-
"Timed out waiting for a selection. Run: deepline quickstart"
|
|
25866
|
-
);
|
|
25867
|
-
return EXIT_AUTH2;
|
|
25868
|
-
}
|
|
25869
|
-
progress.complete();
|
|
25870
|
-
const { prompt, workflowId } = outcome;
|
|
25871
|
-
const claudeCommand = `claude ${shellQuote3(prompt)}`;
|
|
25872
|
-
const claudeAvailable = hasClaudeBinary();
|
|
25873
|
-
const willLaunch = options.launch !== false && !jsonOutput && interactive && claudeAvailable;
|
|
25721
|
+
const gettingStarted = {
|
|
25722
|
+
skill: DEEPLINE_GTM_SKILL,
|
|
25723
|
+
examples: DEEPLINE_GTM_STARTER_PROMPTS
|
|
25724
|
+
};
|
|
25874
25725
|
printCommandEnvelope(
|
|
25875
25726
|
{
|
|
25876
|
-
|
|
25877
|
-
|
|
25878
|
-
|
|
25879
|
-
|
|
25880
|
-
|
|
25881
|
-
|
|
25727
|
+
ok: true,
|
|
25728
|
+
status: "deprecated",
|
|
25729
|
+
code: "QUICKSTART_DEPRECATED",
|
|
25730
|
+
exitCode: 0,
|
|
25731
|
+
message: "`deepline quickstart` is deprecated. Start with the installed /deepline-gtm skill in your agent.",
|
|
25732
|
+
deprecatedCommand: "deepline quickstart",
|
|
25733
|
+
replacement: DEEPLINE_GTM_SKILL,
|
|
25734
|
+
gettingStarted,
|
|
25735
|
+
next: DEEPLINE_GTM_SKILL,
|
|
25882
25736
|
render: {
|
|
25883
25737
|
sections: [
|
|
25884
25738
|
{
|
|
25885
|
-
title: "quickstart",
|
|
25739
|
+
title: "quickstart deprecated",
|
|
25886
25740
|
lines: [
|
|
25887
|
-
|
|
25888
|
-
|
|
25741
|
+
`Use ${DEEPLINE_GTM_SKILL} in your agent instead.`,
|
|
25742
|
+
...DEEPLINE_GTM_STARTER_PROMPTS.map(
|
|
25743
|
+
(example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
|
|
25744
|
+
)
|
|
25889
25745
|
]
|
|
25890
25746
|
}
|
|
25891
|
-
]
|
|
25892
|
-
actions: [{ label: "Run", command: claudeCommand }]
|
|
25747
|
+
]
|
|
25893
25748
|
}
|
|
25894
25749
|
},
|
|
25895
25750
|
{ json: jsonOutput }
|
|
25896
25751
|
);
|
|
25897
|
-
|
|
25898
|
-
return launchClaude(prompt);
|
|
25899
|
-
}
|
|
25900
|
-
return EXIT_OK2;
|
|
25752
|
+
return 0;
|
|
25901
25753
|
}
|
|
25902
25754
|
function registerQuickstartCommands(program) {
|
|
25903
25755
|
program.command("quickstart").description(
|
|
25904
|
-
"
|
|
25756
|
+
"Deprecated compatibility command. Use /deepline-gtm in your agent."
|
|
25905
25757
|
).addHelpText(
|
|
25906
25758
|
"after",
|
|
25907
25759
|
`
|
|
25908
|
-
|
|
25909
|
-
|
|
25910
|
-
|
|
25911
|
-
on the same machine as the CLI. Once a recipe arrives, the CLI prints the
|
|
25912
|
-
matching claude command and, when Claude Code is installed and the shell is
|
|
25913
|
-
interactive, launches it directly. Press Ctrl+C while waiting to skip.
|
|
25914
|
-
|
|
25915
|
-
Examples:
|
|
25916
|
-
deepline quickstart
|
|
25917
|
-
deepline quickstart --no-open
|
|
25918
|
-
deepline quickstart --no-launch --json
|
|
25919
|
-
deepline quickstart --timeout 120
|
|
25760
|
+
Deprecated:
|
|
25761
|
+
Use the installed /deepline-gtm skill in your agent. This compatibility
|
|
25762
|
+
command prints three starter prompts and no longer opens a browser.
|
|
25920
25763
|
`
|
|
25921
|
-
).option("--json", "Emit JSON output. Also automatic when stdout is piped").option("--no-open", "
|
|
25922
|
-
"--timeout <seconds>",
|
|
25923
|
-
"Maximum seconds to wait for a selection",
|
|
25924
|
-
"300"
|
|
25925
|
-
).action(async (options) => {
|
|
25764
|
+
).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) => {
|
|
25926
25765
|
process.exitCode = await handleQuickstart(options);
|
|
25927
25766
|
});
|
|
25928
25767
|
}
|
|
@@ -27883,9 +27722,9 @@ function apifySyncRecoveryNext(rawResponse) {
|
|
|
27883
27722
|
const getDatasetItemsTool = stringField2(getDatasetItems, "tool");
|
|
27884
27723
|
const getDatasetItemsPayload = recordField2(getDatasetItems, "payload");
|
|
27885
27724
|
return {
|
|
27886
|
-
getActorRun: `deepline tools execute ${getActorRunTool} --input ${
|
|
27725
|
+
getActorRun: `deepline tools execute ${getActorRunTool} --input ${shellQuote3(JSON.stringify(getActorRunPayload))} --json`,
|
|
27887
27726
|
...getDatasetItemsTool && Object.keys(getDatasetItemsPayload).length > 0 ? {
|
|
27888
|
-
getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${
|
|
27727
|
+
getDatasetItems: `deepline tools execute ${getDatasetItemsTool} --input ${shellQuote3(JSON.stringify(getDatasetItemsPayload))} --json`
|
|
27889
27728
|
} : {}
|
|
27890
27729
|
};
|
|
27891
27730
|
}
|
|
@@ -28058,7 +27897,7 @@ function parseExecuteOptions(args) {
|
|
|
28058
27897
|
function safeFileStem(value) {
|
|
28059
27898
|
return value.trim().replace(/[^a-zA-Z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64) || "tool";
|
|
28060
27899
|
}
|
|
28061
|
-
function
|
|
27900
|
+
function shellQuote3(value) {
|
|
28062
27901
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
28063
27902
|
}
|
|
28064
27903
|
function powerShellQuote(value) {
|
|
@@ -28128,7 +27967,7 @@ export default definePlay(${JSON.stringify(playName)}, async (ctx) => {
|
|
|
28128
27967
|
path: scriptPath,
|
|
28129
27968
|
sourceCode: script,
|
|
28130
27969
|
projectDir,
|
|
28131
|
-
macCopyCommand: `mkdir -p ${
|
|
27970
|
+
macCopyCommand: `mkdir -p ${shellQuote3(projectDir)} && cp ${shellQuote3(scriptPath)} ${shellQuote3(`${projectDir}/${fileName}`)}`,
|
|
28132
27971
|
windowsCopyCommand: `New-Item -ItemType Directory -Force -Path ${powerShellQuote(projectDir.replace(/\//g, "\\"))} | Out-Null; Copy-Item -LiteralPath ${powerShellQuote(scriptPath)} -Destination ${powerShellQuote(`${projectDir.replace(/\//g, "\\")}\\${fileName}`)}`
|
|
28133
27972
|
};
|
|
28134
27973
|
}
|
|
@@ -28152,7 +27991,7 @@ function buildToolExecuteBaseEnvelope(input2) {
|
|
|
28152
27991
|
envelope,
|
|
28153
27992
|
"output"
|
|
28154
27993
|
);
|
|
28155
|
-
const inspectCommand = `deepline tools execute ${input2.toolId} --input ${
|
|
27994
|
+
const inspectCommand = `deepline tools execute ${input2.toolId} --input ${shellQuote3(JSON.stringify(input2.params))} --json`;
|
|
28156
27995
|
const actions = input2.listConversion ? [
|
|
28157
27996
|
{
|
|
28158
27997
|
label: "next",
|
|
@@ -28469,7 +28308,7 @@ var import_promises5 = require("fs/promises");
|
|
|
28469
28308
|
var import_node_path17 = require("path");
|
|
28470
28309
|
|
|
28471
28310
|
// src/cli/workflow-to-play.ts
|
|
28472
|
-
var
|
|
28311
|
+
var import_node_crypto6 = require("crypto");
|
|
28473
28312
|
|
|
28474
28313
|
// ../shared_libs/plays/secret-guardrails.ts
|
|
28475
28314
|
var SECRET_ENV_PATTERN = /\bprocess(?:\.env|\[['"]env['"]\])(?:\.|\[['"])([A-Z0-9_]*(?:API[_-]?KEY|TOKEN|SECRET|PASSWORD|PRIVATE[_-]?KEY|ACCESS[_-]?KEY)[A-Z0-9_]*)(?:['"]\])?/g;
|
|
@@ -28621,7 +28460,7 @@ function sanitizePlayNameSegment(value) {
|
|
|
28621
28460
|
}
|
|
28622
28461
|
function deriveWorkflowPlayName(workflowName) {
|
|
28623
28462
|
const base = sanitizePlayNameSegment(workflowName) || "workflow";
|
|
28624
|
-
const suffix = (0,
|
|
28463
|
+
const suffix = (0, import_node_crypto6.createHash)("sha256").update(workflowName).digest("hex").slice(0, 8);
|
|
28625
28464
|
const reserved = suffix.length + 1;
|
|
28626
28465
|
const allowedBase = Math.max(1, MAX_PLAY_NAME_LENGTH - reserved);
|
|
28627
28466
|
let name = `${base.slice(0, allowedBase)}_${suffix}`;
|
|
@@ -29006,13 +28845,13 @@ Notes:
|
|
|
29006
28845
|
}
|
|
29007
28846
|
|
|
29008
28847
|
// src/cli/commands/update.ts
|
|
29009
|
-
var
|
|
28848
|
+
var import_node_child_process3 = require("child_process");
|
|
29010
28849
|
var import_node_fs17 = require("fs");
|
|
29011
28850
|
var import_node_os14 = require("os");
|
|
29012
28851
|
var import_node_path19 = require("path");
|
|
29013
28852
|
|
|
29014
28853
|
// src/cli/commands/skills.ts
|
|
29015
|
-
var
|
|
28854
|
+
var import_node_child_process2 = require("child_process");
|
|
29016
28855
|
var import_node_fs16 = require("fs");
|
|
29017
28856
|
var import_node_os13 = require("os");
|
|
29018
28857
|
var import_node_path18 = require("path");
|
|
@@ -29286,7 +29125,7 @@ function readSkillsInstallState(path) {
|
|
|
29286
29125
|
}
|
|
29287
29126
|
function runProcess(command, args, cwd) {
|
|
29288
29127
|
return new Promise((resolve15, reject) => {
|
|
29289
|
-
const child = (0,
|
|
29128
|
+
const child = (0, import_node_child_process2.spawn)(command, args, {
|
|
29290
29129
|
cwd,
|
|
29291
29130
|
env: process.env,
|
|
29292
29131
|
stdio: ["ignore", "ignore", "pipe"],
|
|
@@ -29526,14 +29365,14 @@ function posixShellQuote(value) {
|
|
|
29526
29365
|
function windowsCmdQuote(value) {
|
|
29527
29366
|
return `"${value.replace(/"/g, '""')}"`;
|
|
29528
29367
|
}
|
|
29529
|
-
function
|
|
29368
|
+
function shellQuote4(value) {
|
|
29530
29369
|
if (process.platform === "win32") {
|
|
29531
29370
|
return /^[A-Za-z0-9_./:@%+=,-]+$/.test(value) ? value : windowsCmdQuote(value);
|
|
29532
29371
|
}
|
|
29533
29372
|
return posixShellQuote(value);
|
|
29534
29373
|
}
|
|
29535
29374
|
function buildSourceUpdateCommand(sourceRoot) {
|
|
29536
|
-
const quotedRoot =
|
|
29375
|
+
const quotedRoot = shellQuote4(sourceRoot);
|
|
29537
29376
|
const cdCommand = process.platform === "win32" ? `cd /d ${quotedRoot}` : `cd ${quotedRoot}`;
|
|
29538
29377
|
return `${cdCommand} && git fetch origin main --tags && git merge --ff-only origin/main`;
|
|
29539
29378
|
}
|
|
@@ -29545,7 +29384,7 @@ function buildSidecarProjectConfigCommand(versionDir, nodeBin) {
|
|
|
29545
29384
|
"fs.mkdirSync(dir,{recursive:true});",
|
|
29546
29385
|
`fs.writeFileSync(path.join(dir,'package.json'),${JSON.stringify(NPM_SDK_SIDECAR_PACKAGE_JSON)});`
|
|
29547
29386
|
].join("");
|
|
29548
|
-
return `${
|
|
29387
|
+
return `${shellQuote4(nodeBin)} -e ${shellQuote4(script)} ${shellQuote4(versionDir)}`;
|
|
29549
29388
|
}
|
|
29550
29389
|
function sidecarStateDir(input2) {
|
|
29551
29390
|
const scope = input2.env.DEEPLINE_CONFIG_SCOPE?.trim();
|
|
@@ -29608,7 +29447,7 @@ function resolvePythonSidecarUpdatePlan(options) {
|
|
|
29608
29447
|
const npmCommand = "npm";
|
|
29609
29448
|
const registryUrl = sidecarRegistryUrl(hostUrl);
|
|
29610
29449
|
const versionDir = (0, import_node_path19.join)(stateDir, "versions", "<version>");
|
|
29611
|
-
const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${
|
|
29450
|
+
const manualCommand = `${buildSidecarProjectConfigCommand(versionDir, nodeBin)} && ${npmCommand} install --prefix ${shellQuote4(versionDir)} --registry ${shellQuote4(registryUrl)} ${NPM_SDK_INSTALL_COMMON_FLAGS.map(shellQuote4).join(" ")} ${shellQuote4(packageSpec)}`;
|
|
29612
29451
|
return {
|
|
29613
29452
|
kind: "python-sidecar",
|
|
29614
29453
|
stateDir,
|
|
@@ -29692,7 +29531,7 @@ function resolveUpdatePlan(options = {}) {
|
|
|
29692
29531
|
fallbackRegistryUrl: publicNpmFallbackRegistryUrl(
|
|
29693
29532
|
env.DEEPLINE_HOST_URL?.trim() || autoDetectBaseUrl()
|
|
29694
29533
|
),
|
|
29695
|
-
manualCommand: `${command} ${args.map(
|
|
29534
|
+
manualCommand: `${command} ${args.map(shellQuote4).join(" ")}`
|
|
29696
29535
|
};
|
|
29697
29536
|
}
|
|
29698
29537
|
var AUTO_UPDATE_FAILURE_FILE = ".auto-update-failure.json";
|
|
@@ -29812,7 +29651,7 @@ function installedPackageVersion(versionDir) {
|
|
|
29812
29651
|
function runCommand(command, args, env = process.env) {
|
|
29813
29652
|
return new Promise((resolveResult) => {
|
|
29814
29653
|
let output2 = "";
|
|
29815
|
-
const child = (0,
|
|
29654
|
+
const child = (0, import_node_child_process3.spawn)(command, args, {
|
|
29816
29655
|
stdio: ["inherit", "pipe", "pipe"],
|
|
29817
29656
|
shell: process.platform === "win32",
|
|
29818
29657
|
env
|
|
@@ -29897,9 +29736,9 @@ function writeSidecarLauncher(input2) {
|
|
|
29897
29736
|
input2.path,
|
|
29898
29737
|
[
|
|
29899
29738
|
"#!/usr/bin/env sh",
|
|
29900
|
-
`export DEEPLINE_HOST_URL=${
|
|
29901
|
-
`export DEEPLINE_CONFIG_SCOPE=${
|
|
29902
|
-
`exec ${
|
|
29739
|
+
`export DEEPLINE_HOST_URL=${shellQuote4(input2.hostUrl)}`,
|
|
29740
|
+
`export DEEPLINE_CONFIG_SCOPE=${shellQuote4(input2.scope)}`,
|
|
29741
|
+
`exec ${shellQuote4(input2.nodeBin)} ${shellQuote4(input2.entryPath)} "$@"`,
|
|
29903
29742
|
""
|
|
29904
29743
|
].join("\n"),
|
|
29905
29744
|
{ encoding: "utf8", mode: 493 }
|
|
@@ -30111,7 +29950,7 @@ Examples:
|
|
|
30111
29950
|
}
|
|
30112
29951
|
|
|
30113
29952
|
// src/cli/commands/setup.ts
|
|
30114
|
-
var
|
|
29953
|
+
var import_node_child_process4 = require("child_process");
|
|
30115
29954
|
var import_node_fs18 = require("fs");
|
|
30116
29955
|
var import_node_os15 = require("os");
|
|
30117
29956
|
var import_node_path20 = require("path");
|
|
@@ -30214,6 +30053,15 @@ function resolveScopeRoot(scope) {
|
|
|
30214
30053
|
function authScopeForSetup(scope) {
|
|
30215
30054
|
return scope === "local" ? "folder" : "global";
|
|
30216
30055
|
}
|
|
30056
|
+
function shouldOpenSetupAuthorization(runtime = detectAgentRuntime()) {
|
|
30057
|
+
return runtime !== "claude_cowork";
|
|
30058
|
+
}
|
|
30059
|
+
function openSetupAuthorization(authorizationUrl, options = {}) {
|
|
30060
|
+
const url = authorizationUrl.trim();
|
|
30061
|
+
if (!url || !shouldOpenSetupAuthorization(options.runtime)) return false;
|
|
30062
|
+
(options.open ?? openInBrowser)(url);
|
|
30063
|
+
return true;
|
|
30064
|
+
}
|
|
30217
30065
|
function setupStatePath(baseUrl, scope, root) {
|
|
30218
30066
|
return scope === "local" && root ? (0, import_node_path20.join)(root, ".deepline", "setup", "state.json") : (0, import_node_path20.join)(sdkCliStateDirPath(baseUrl), "setup.json");
|
|
30219
30067
|
}
|
|
@@ -30296,7 +30144,7 @@ function removeKnownLegacyPaths(baseUrl) {
|
|
|
30296
30144
|
return removed;
|
|
30297
30145
|
}
|
|
30298
30146
|
function resolvePathCommands(command) {
|
|
30299
|
-
const lookup = (0,
|
|
30147
|
+
const lookup = (0, import_node_child_process4.spawnSync)(
|
|
30300
30148
|
process.platform === "win32" ? "where" : "which",
|
|
30301
30149
|
process.platform === "win32" ? [command] : ["-a", command],
|
|
30302
30150
|
{ encoding: "utf8", shell: process.platform === "win32" }
|
|
@@ -30311,7 +30159,7 @@ function resolvePathCommand(command) {
|
|
|
30311
30159
|
return resolvePathCommands(command)[0] ?? null;
|
|
30312
30160
|
}
|
|
30313
30161
|
function resolvePersistentGlobalCommand() {
|
|
30314
|
-
const prefix = (0,
|
|
30162
|
+
const prefix = (0, import_node_child_process4.spawnSync)("npm", ["prefix", "-g"], { encoding: "utf8" });
|
|
30315
30163
|
if (prefix.status !== 0) return null;
|
|
30316
30164
|
const root = String(prefix.stdout ?? "").trim();
|
|
30317
30165
|
if (!root) return null;
|
|
@@ -30403,9 +30251,6 @@ function rollbackCommand(scope, root) {
|
|
|
30403
30251
|
const prefix = scope === "local" && root ? ` --prefix ${JSON.stringify((0, import_node_path20.join)(root, ".deepline", "runtime"))}` : "";
|
|
30404
30252
|
return `npm install -g${prefix} --no-audit --no-fund --include=optional --allow-scripts=esbuild deepline@${SDK_VERSION}`;
|
|
30405
30253
|
}
|
|
30406
|
-
function setupQuickstartCommand(baseUrl) {
|
|
30407
|
-
return baseUrl === "https://code.deepline.com" ? "deepline quickstart" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} deepline quickstart`;
|
|
30408
|
-
}
|
|
30409
30254
|
function setupResumeCommand(baseUrl, scope) {
|
|
30410
30255
|
const hostPrefix = baseUrl === "https://code.deepline.com" ? "" : `DEEPLINE_HOST_URL=${JSON.stringify(baseUrl)} `;
|
|
30411
30256
|
return `${hostPrefix}deepline setup --scope ${scope} --json`;
|
|
@@ -30555,7 +30400,7 @@ async function runDoctorCommand(options) {
|
|
|
30555
30400
|
root,
|
|
30556
30401
|
authStatus
|
|
30557
30402
|
});
|
|
30558
|
-
const
|
|
30403
|
+
const gettingStarted = deeplineGtmGettingStartedPayload();
|
|
30559
30404
|
printCommandEnvelope(
|
|
30560
30405
|
{
|
|
30561
30406
|
ok,
|
|
@@ -30563,7 +30408,8 @@ async function runDoctorCommand(options) {
|
|
|
30563
30408
|
code: ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
|
|
30564
30409
|
exitCode: ok ? 0 : 7,
|
|
30565
30410
|
checks,
|
|
30566
|
-
next: ok ?
|
|
30411
|
+
next: ok ? DEEPLINE_GTM_SKILL : "Review failed checks, then rerun: deepline doctor --json",
|
|
30412
|
+
...ok ? { gettingStarted } : {},
|
|
30567
30413
|
render: {
|
|
30568
30414
|
sections: [
|
|
30569
30415
|
{
|
|
@@ -30592,6 +30438,7 @@ function pendingResult(input2) {
|
|
|
30592
30438
|
phases: input2.phases
|
|
30593
30439
|
});
|
|
30594
30440
|
if (input2.authorizationUrl) {
|
|
30441
|
+
openSetupAuthorization(input2.authorizationUrl);
|
|
30595
30442
|
process.stderr.write(`Authorize Deepline: ${input2.authorizationUrl}
|
|
30596
30443
|
`);
|
|
30597
30444
|
}
|
|
@@ -30675,7 +30522,7 @@ async function runSetupCommand(options) {
|
|
|
30675
30522
|
json: options.json,
|
|
30676
30523
|
extra: {
|
|
30677
30524
|
persistentPath: globalCli.persistentPath,
|
|
30678
|
-
fallback: "https://code.deepline.com/
|
|
30525
|
+
fallback: "https://code.deepline.com/SKILL.md"
|
|
30679
30526
|
}
|
|
30680
30527
|
});
|
|
30681
30528
|
}
|
|
@@ -30878,14 +30725,15 @@ async function runSetupCommand(options) {
|
|
|
30878
30725
|
root,
|
|
30879
30726
|
authStatus: auth
|
|
30880
30727
|
});
|
|
30881
|
-
const
|
|
30728
|
+
const gettingStarted = deeplineGtmGettingStartedPayload();
|
|
30882
30729
|
const doctorPayload = {
|
|
30883
30730
|
ok: assessment.ok,
|
|
30884
30731
|
status: assessment.ok ? "complete" : "failed",
|
|
30885
30732
|
code: assessment.ok ? "DOCTOR_OK" : "DOCTOR_FAILED",
|
|
30886
30733
|
exitCode: assessment.ok ? 0 : 7,
|
|
30887
30734
|
checks: assessment.checks,
|
|
30888
|
-
next: assessment.ok ?
|
|
30735
|
+
next: assessment.ok ? DEEPLINE_GTM_SKILL : `deepline doctor --scope ${scope} --json`,
|
|
30736
|
+
...assessment.ok ? { gettingStarted } : {}
|
|
30889
30737
|
};
|
|
30890
30738
|
if (!assessment.ok) {
|
|
30891
30739
|
return reportSetupPhaseFailure({
|
|
@@ -30932,14 +30780,19 @@ async function runSetupCommand(options) {
|
|
|
30932
30780
|
currentPhase: null,
|
|
30933
30781
|
failedPhase: null,
|
|
30934
30782
|
resumed,
|
|
30935
|
-
next:
|
|
30783
|
+
next: DEEPLINE_GTM_SKILL,
|
|
30784
|
+
gettingStarted,
|
|
30936
30785
|
render: {
|
|
30937
30786
|
sections: [
|
|
30938
30787
|
{
|
|
30939
30788
|
title: "setup",
|
|
30940
30789
|
lines: [
|
|
30941
30790
|
"Deepline is installed and connected.",
|
|
30942
|
-
`
|
|
30791
|
+
`Use ${DEEPLINE_GTM_SKILL} in your agent.`,
|
|
30792
|
+
...DEEPLINE_GTM_STARTER_PROMPTS.map(
|
|
30793
|
+
(example, index) => `${index + 1}. ${example.title}: ${example.prompt}`
|
|
30794
|
+
),
|
|
30795
|
+
gettingStarted.question
|
|
30943
30796
|
]
|
|
30944
30797
|
}
|
|
30945
30798
|
]
|
|
@@ -30955,7 +30808,7 @@ function registerSetupCommands(program) {
|
|
|
30955
30808
|
`
|
|
30956
30809
|
Notes:
|
|
30957
30810
|
Setup is idempotent. Bare setup resumes the first incomplete or failed phase.
|
|
30958
|
-
It installs skills before auth and does not run
|
|
30811
|
+
It installs skills before auth and does not run a starter workflow.
|
|
30959
30812
|
JSON output includes phase status and an exact retry command.
|
|
30960
30813
|
|
|
30961
30814
|
Examples:
|
|
@@ -31078,7 +30931,7 @@ function unknownCommandNameFromMessage(message) {
|
|
|
31078
30931
|
}
|
|
31079
30932
|
|
|
31080
30933
|
// src/cli/self-update.ts
|
|
31081
|
-
var
|
|
30934
|
+
var import_node_child_process5 = require("child_process");
|
|
31082
30935
|
function envTruthy(name) {
|
|
31083
30936
|
const value = process.env[name]?.trim().toLowerCase();
|
|
31084
30937
|
return value === "1" || value === "true" || value === "yes";
|
|
@@ -31127,7 +30980,7 @@ function relaunchCurrentCommand(plan) {
|
|
|
31127
30980
|
return new Promise((resolve15) => {
|
|
31128
30981
|
const command = plan.kind === "python-sidecar" ? plan.sidecarPath : process.execPath;
|
|
31129
30982
|
const args = plan.kind === "python-sidecar" ? process.argv.slice(2) : process.argv.slice(1);
|
|
31130
|
-
const child = (0,
|
|
30983
|
+
const child = (0, import_node_child_process5.spawn)(command, args, {
|
|
31131
30984
|
stdio: "inherit",
|
|
31132
30985
|
shell: process.platform === "win32",
|
|
31133
30986
|
env: {
|
|
@@ -31192,7 +31045,7 @@ async function maybeAutoUpdateAndRelaunch(response) {
|
|
|
31192
31045
|
}
|
|
31193
31046
|
|
|
31194
31047
|
// src/cli/skills-sync.ts
|
|
31195
|
-
var
|
|
31048
|
+
var import_node_child_process6 = require("child_process");
|
|
31196
31049
|
var import_node_fs19 = require("fs");
|
|
31197
31050
|
var import_node_path21 = require("path");
|
|
31198
31051
|
var CHECK_TIMEOUT_MS2 = 3e3;
|
|
@@ -31335,13 +31188,13 @@ function buildBunxSkillsInstallArgs(baseUrl, skillNames) {
|
|
|
31335
31188
|
});
|
|
31336
31189
|
}
|
|
31337
31190
|
function hasCommand(command) {
|
|
31338
|
-
const result = (0,
|
|
31191
|
+
const result = (0, import_node_child_process6.spawnSync)(command, ["--version"], {
|
|
31339
31192
|
stdio: "ignore",
|
|
31340
31193
|
shell: process.platform === "win32"
|
|
31341
31194
|
});
|
|
31342
31195
|
return result.status === 0;
|
|
31343
31196
|
}
|
|
31344
|
-
function
|
|
31197
|
+
function shellQuote5(arg) {
|
|
31345
31198
|
return `'${arg.replace(/'/g, `'\\''`)}'`;
|
|
31346
31199
|
}
|
|
31347
31200
|
function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NAMES) {
|
|
@@ -31351,7 +31204,7 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
|
|
|
31351
31204
|
commands.push({
|
|
31352
31205
|
command: "bunx",
|
|
31353
31206
|
args: bunxArgs,
|
|
31354
|
-
manualCommand: `bunx ${bunxArgs.map(
|
|
31207
|
+
manualCommand: `bunx ${bunxArgs.map(shellQuote5).join(" ")}`
|
|
31355
31208
|
});
|
|
31356
31209
|
}
|
|
31357
31210
|
if (hasCommand("npx")) {
|
|
@@ -31359,14 +31212,14 @@ function resolveSkillsInstallCommands(baseUrl, skillNames = DEFAULT_SDK_SKILL_NA
|
|
|
31359
31212
|
commands.push({
|
|
31360
31213
|
command: "npx",
|
|
31361
31214
|
args: npxArgs,
|
|
31362
|
-
manualCommand: `npx ${npxArgs.map(
|
|
31215
|
+
manualCommand: `npx ${npxArgs.map(shellQuote5).join(" ")}`
|
|
31363
31216
|
});
|
|
31364
31217
|
}
|
|
31365
31218
|
return commands;
|
|
31366
31219
|
}
|
|
31367
31220
|
function runOneSkillsInstall(install) {
|
|
31368
31221
|
return new Promise((resolve15) => {
|
|
31369
|
-
const child = (0,
|
|
31222
|
+
const child = (0, import_node_child_process6.spawn)(install.command, install.args, {
|
|
31370
31223
|
stdio: ["ignore", "ignore", "pipe"],
|
|
31371
31224
|
env: process.env
|
|
31372
31225
|
});
|
|
@@ -31450,7 +31303,7 @@ function runLegacySkillsCleanup() {
|
|
|
31450
31303
|
}
|
|
31451
31304
|
];
|
|
31452
31305
|
for (const candidate of candidates) {
|
|
31453
|
-
const result = (0,
|
|
31306
|
+
const result = (0, import_node_child_process6.spawnSync)(candidate.command, candidate.args, {
|
|
31454
31307
|
stdio: "ignore",
|
|
31455
31308
|
env: process.env,
|
|
31456
31309
|
shell: process.platform === "win32"
|