@posthog/wizard 2.43.0 → 2.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{add-mcp-server-to-clients-BiZmRLE6.js → add-mcp-server-to-clients-CNzZMSat.js} +5 -5
- package/dist/{add-mcp-server-to-clients-BiZmRLE6.js.map → add-mcp-server-to-clients-CNzZMSat.js.map} +1 -1
- package/dist/{agent-interface-CUaNjvqq.js → agent-interface-CF7GsdFf.js} +298 -158
- package/dist/agent-interface-CF7GsdFf.js.map +1 -0
- package/dist/{agent-runner-BuH7W62W.js → agent-runner-B0LTVFfw.js} +130 -598
- package/dist/agent-runner-B0LTVFfw.js.map +1 -0
- package/dist/{analytics-C_9Kh6J1.js → analytics-DQEuL6qS.js} +2 -2
- package/dist/{analytics-C_9Kh6J1.js.map → analytics-DQEuL6qS.js.map} +1 -1
- package/dist/analytics-YD3D38z2.js +2 -0
- package/dist/{api-Kgk7BFqo.js → api-uCMvDII5.js} +3 -3
- package/dist/{api-Kgk7BFqo.js.map → api-uCMvDII5.js.map} +1 -1
- package/dist/bin.js +69 -116
- package/dist/bin.js.map +1 -1
- package/dist/{ci-install-DoARcA-j.js → ci-install-Bow8-f0j.js} +4 -4
- package/dist/{ci-install-DoARcA-j.js.map → ci-install-Bow8-f0j.js.map} +1 -1
- package/dist/commandments-CyB7Icr1.js +42 -0
- package/dist/commandments-CyB7Icr1.js.map +1 -0
- package/dist/commandments-DguPfCX8.js +2 -0
- package/dist/{debug-CI0PLD6X.js → debug-BixHZmHv.js} +1 -1
- package/dist/{debug-DNEQR5DL.js → debug-DBmxx59Q.js} +42 -21
- package/dist/debug-DBmxx59Q.js.map +1 -0
- package/dist/{defaults-CeNThA-1.js → defaults-8zjNjGGi.js} +2 -2
- package/dist/defaults-8zjNjGGi.js.map +1 -0
- package/dist/{env-api-key-cjD4yfGT.js → env-api-key-AcC_tz8G.js} +1 -1
- package/dist/{env-api-key-cjD4yfGT.js.map → env-api-key-AcC_tz8G.js.map} +1 -1
- package/dist/{environment-D44UP2Nu.js → environment-kZtkp7eG.js} +3 -3
- package/dist/{environment-D44UP2Nu.js.map → environment-kZtkp7eG.js.map} +1 -1
- package/dist/{file-utils-C2PNKLhr.js → file-utils-BAhYy5vC.js} +2 -2
- package/dist/{file-utils-C2PNKLhr.js.map → file-utils-BAhYy5vC.js.map} +1 -1
- package/dist/file-watcher-BL-IRbR7.js +123 -0
- package/dist/file-watcher-BL-IRbR7.js.map +1 -0
- package/dist/{headless-ui-C3C0wWUi.js → headless-ui-DWmMyhaP.js} +5 -4
- package/dist/headless-ui-DWmMyhaP.js.map +1 -0
- package/dist/{interactive-k4xQiftO.js → interactive-Cyic0bGL.js} +2 -2
- package/dist/{interactive-k4xQiftO.js.map → interactive-Cyic0bGL.js.map} +1 -1
- package/dist/{mcp-CJn_ryMN.js → mcp-BSGmEWjt.js} +3 -3
- package/dist/mcp-BSGmEWjt.js.map +1 -0
- package/dist/{mcp-prompt-streaming-BB5nO--L.js → mcp-prompt-streaming-C227vG1X.js} +3 -3
- package/dist/{mcp-prompt-streaming-BB5nO--L.js.map → mcp-prompt-streaming-C227vG1X.js.map} +1 -1
- package/dist/{non-interactive-0x0Due8h.js → non-interactive-DQA9vn9f.js} +2 -2
- package/dist/{non-interactive-0x0Due8h.js.map → non-interactive-DQA9vn9f.js.map} +1 -1
- package/dist/orchestrator-tools-NuWONNkF.js +99 -0
- package/dist/orchestrator-tools-NuWONNkF.js.map +1 -0
- package/dist/{package-json-CDs1ZVKu.js → package-json-DCuoye-H.js} +1 -1
- package/dist/{package-json-CDs1ZVKu.js.map → package-json-DCuoye-H.js.map} +1 -1
- package/dist/{package-manager-CBRR4_i4.js → package-manager-DKtR3xzM.js} +2 -2
- package/dist/{package-manager-CBRR4_i4.js.map → package-manager-DKtR3xzM.js.map} +1 -1
- package/dist/pi-DJCln9jJ.js +603 -0
- package/dist/pi-DJCln9jJ.js.map +1 -0
- package/dist/{playground-CK617U6k.js → playground-CbEndzc8.js} +7 -8
- package/dist/{playground-CK617U6k.js.map → playground-CbEndzc8.js.map} +1 -1
- package/dist/{posthog-DwKlq0HM.js → posthog-DFyux4Vw.js} +1 -1
- package/dist/{posthog-DwKlq0HM.js.map → posthog-DFyux4Vw.js.map} +1 -1
- package/dist/{posthog-integration-qRjKkLcu.js → posthog-integration-dmWJZ8mj.js} +132 -27
- package/dist/posthog-integration-dmWJZ8mj.js.map +1 -0
- package/dist/{provisioning-BMXR8fS1.js → provisioning-CcxCry5p.js} +21 -14
- package/dist/provisioning-CcxCry5p.js.map +1 -0
- package/dist/queue-tools-Bw-AANLM.js +366 -0
- package/dist/queue-tools-Bw-AANLM.js.map +1 -0
- package/dist/{registry-CsUUdVCd.js → registry-D2V88NoC.js} +96 -18
- package/dist/registry-D2V88NoC.js.map +1 -0
- package/dist/{security-CIP3lpp6.js → security-DOtBCBvx.js} +4 -4
- package/dist/{security-CIP3lpp6.js.map → security-DOtBCBvx.js.map} +1 -1
- package/dist/{setup-utils-DkyEOBDx.js → setup-utils-Qp-u6BZk.js} +7 -7
- package/dist/{setup-utils-DkyEOBDx.js.map → setup-utils-Qp-u6BZk.js.map} +1 -1
- package/dist/{start-tui-CJlIgYjf.js → start-tui-DHa_9aiB.js} +429 -234
- package/dist/start-tui-DHa_9aiB.js.map +1 -0
- package/dist/{steps-CuNjxYsA.js → steps-D07HUQyE.js} +7 -7
- package/dist/{steps-CuNjxYsA.js.map → steps-D07HUQyE.js.map} +1 -1
- package/dist/{store-UKAJftq6.js → store-DSwsITKX.js} +30 -9
- package/dist/store-DSwsITKX.js.map +1 -0
- package/dist/{subagent-_syej145.js → subagent-Dk4K5MDa.js} +2 -2
- package/dist/{subagent-_syej145.js.map → subagent-Dk4K5MDa.js.map} +1 -1
- package/dist/task-CQnV9Qd2.js +305 -0
- package/dist/task-CQnV9Qd2.js.map +1 -0
- package/dist/{task-stream-Ne-9ZOnf.js → task-stream-B7qia9eW.js} +72 -7
- package/dist/task-stream-B7qia9eW.js.map +1 -0
- package/dist/{tasks-CUvCA1OY.js → tasks-C7BQp659.js} +2 -2
- package/dist/{tasks-CUvCA1OY.js.map → tasks-C7BQp659.js.map} +1 -1
- package/dist/{telemetry-DFYgJHH-.js → telemetry-DgahJGSx.js} +3 -3
- package/dist/{telemetry-DFYgJHH-.js.map → telemetry-DgahJGSx.js.map} +1 -1
- package/dist/{terminal-DLFgIxhg.js → terminal-Bb6tZkf-.js} +14 -14
- package/dist/terminal-Bb6tZkf-.js.map +1 -0
- package/dist/{tools-CNyhLqlK.js → tools-BJEvSUWN.js} +4 -4
- package/dist/{tools-CNyhLqlK.js.map → tools-BJEvSUWN.js.map} +1 -1
- package/dist/{types-y3HkjtSq.js → types-BRe_EzTW.js} +1 -1
- package/dist/{types-y3HkjtSq.js.map → types-BRe_EzTW.js.map} +1 -1
- package/dist/{wizard-abort-BM3pISoR.js → wizard-abort-BxtdkgI-.js} +4 -4
- package/dist/{wizard-abort-BM3pISoR.js.map → wizard-abort-BxtdkgI-.js.map} +1 -1
- package/dist/{wizard-abort-DCv08-op.js → wizard-abort-DpDmuCfA.js} +1 -1
- package/dist/{wizard-session-DXivb7kv.js → wizard-session-DWHe83uk.js} +1 -1
- package/dist/{wizard-session-BudcixsA.js → wizard-session-tp4Zdbwl.js} +3 -3
- package/dist/wizard-session-tp4Zdbwl.js.map +1 -0
- package/dist/{wizard-tools-BcuRxp1A.js → wizard-tools-Dg8o2lcH.js} +64 -387
- package/dist/wizard-tools-Dg8o2lcH.js.map +1 -0
- package/dist/yara-hooks-CncaWRuC.js +2 -0
- package/dist/{yara-hooks-GIs-R_g1.js → yara-hooks-pw86rZ8y.js} +4 -4
- package/dist/{yara-hooks-GIs-R_g1.js.map → yara-hooks-pw86rZ8y.js.map} +1 -1
- package/package.json +1 -1
- package/dist/agent-interface-CUaNjvqq.js.map +0 -1
- package/dist/agent-runner-BuH7W62W.js.map +0 -1
- package/dist/analytics-o-WJHD8Z.js +0 -2
- package/dist/debug-DNEQR5DL.js.map +0 -1
- package/dist/defaults-CeNThA-1.js.map +0 -1
- package/dist/headless-ui-C3C0wWUi.js.map +0 -1
- package/dist/mcp-CJn_ryMN.js.map +0 -1
- package/dist/posthog-integration-qRjKkLcu.js.map +0 -1
- package/dist/provisioning-BMXR8fS1.js.map +0 -1
- package/dist/registry-CsUUdVCd.js.map +0 -1
- package/dist/start-tui-CJlIgYjf.js.map +0 -1
- package/dist/store-UKAJftq6.js.map +0 -1
- package/dist/task-stream-Ne-9ZOnf.js.map +0 -1
- package/dist/terminal-DLFgIxhg.js.map +0 -1
- package/dist/wizard-session-BudcixsA.js.map +0 -1
- package/dist/wizard-tools-BcuRxp1A.js.map +0 -1
- package/dist/wizard-ui-WZ48rUgr.js +0 -15
- package/dist/wizard-ui-WZ48rUgr.js.map +0 -1
- package/dist/yara-hooks-DKbfESYf.js +0 -2
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as analytics } from "./analytics-
|
|
3
|
-
import { o as extractOAuthCode, t as getOrAskForProjectData } from "./setup-utils-
|
|
4
|
-
import { t as ApiError } from "./api-
|
|
5
|
-
import { t as ADDITIONAL_FEATURE_LABELS } from "./wizard-session-
|
|
6
|
-
import { i as wizardAbort } from "./wizard-abort-
|
|
7
|
-
import { a as formatTokenCount, i as formatCostUsd } from "./agent-runner-
|
|
8
|
-
import { i as
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import { t as
|
|
12
|
-
import { g as detectProjectsWithAgent, m as Icons, p as Colors, t as SETUP_REPORT_FILE } from "./posthog-integration-qRjKkLcu.js";
|
|
1
|
+
import { B as Integration, H as OAUTH_TIMEOUT_MS, K as POSTHOG_DOCS_URL, V as OAUTH_PORTS, X as POSTHOG_PRIVACY_URL, Y as POSTHOG_ORG_AI_SETTINGS_URL, d as relativeToInstallDir, et as POSTHOG_TERMS_URL, g as SIGNUP_WIZARD_READINESS_CONFIG, l as WIZARD_LOG_FILE, mt as WIZARD_TOOLS_MENU_FLAG_KEY, nt as REMOTE_SKILLS_BASE_URL, p as setUI, s as logToFile, v as getBlockingServiceKeys } from "./debug-DBmxx59Q.js";
|
|
2
|
+
import { n as analytics } from "./analytics-DQEuL6qS.js";
|
|
3
|
+
import { o as extractOAuthCode, t as getOrAskForProjectData } from "./setup-utils-Qp-u6BZk.js";
|
|
4
|
+
import { t as ApiError } from "./api-uCMvDII5.js";
|
|
5
|
+
import { t as ADDITIONAL_FEATURE_LABELS } from "./wizard-session-tp4Zdbwl.js";
|
|
6
|
+
import { i as wizardAbort } from "./wizard-abort-BxtdkgI-.js";
|
|
7
|
+
import { a as formatTokenCount, i as formatCostUsd } from "./agent-runner-B0LTVFfw.js";
|
|
8
|
+
import { a as coerceAuditChecks, i as AUDIT_SEVERITY_STYLE, n as AUDIT_CHECKS_KEY, o as getAuditChecks, t as AUDIT_CHECKS_FILE } from "./types-BRe_EzTW.js";
|
|
9
|
+
import { i as fetchSkillMenu, r as downloadSkill } from "./wizard-tools-Dg8o2lcH.js";
|
|
10
|
+
import { t as FRAMEWORK_REGISTRY } from "./registry-D2V88NoC.js";
|
|
11
|
+
import { _ as detectProjectsWithAgent, m as Icons, p as Colors, t as SETUP_REPORT_FILE } from "./posthog-integration-dmWJZ8mj.js";
|
|
13
12
|
import { C as STRIPE_SDKS, S as POSTHOG_SDKS, _ as SOURCE_MAPS_CONTEXT_KEYS, b as getDetectedWarehouseSources, d as Program, f as getProgramConfig, g as DISPLAY_NAME, h as AUTOMATABLE_VARIANTS, m as SELF_DRIVING_INTEGRATE_PATH_KEY, n as useKeyBindings, p as detectSelfDrivingIntegrationProjects, t as PickerMenu, x as getContentBlocks, y as fetchHealthIssues } from "./bin.js";
|
|
14
|
-
import { r as totalTokenCount, t as WizardStore } from "./store-
|
|
15
|
-
import { A as ConfirmationInput, C as TabContainer, D as LinkText, E as LogViewer, F as SplitView, M as useStdoutDimensions, N as ProgressList, O as extractUrls, P as LoadingBox, S as HNViewer, T as EventPlanViewer, _ as SEVERITY_ORDER, a as useSkillEntry, b as LearnCard, c as SlackConnectScreen, d as AuditChecksViewer, f as McpSuggestedPromptsScreen, g as SEVERITY_LABEL, h as IssueTable, i as SkillSourceInfo, k as ModalOverlay, l as AUDIT_AREA_SLIDES, m as McpScreen, n as releaseTerminal, o as OutroScreen, r as AiOptInRequiredScreen, s as useDismissOnAnyKey, t as enterDarkTerminal, u as VisualBox, v as ServiceHealthList, w as ScreenContainer, y as TipsCard } from "./terminal-
|
|
16
|
-
import { t as ALL_FEATURE_VALUES } from "./defaults-
|
|
17
|
-
import {
|
|
18
|
-
import
|
|
13
|
+
import { r as totalTokenCount, t as WizardStore } from "./store-DSwsITKX.js";
|
|
14
|
+
import { A as ConfirmationInput, C as TabContainer, D as LinkText, E as LogViewer, F as SplitView, M as useStdoutDimensions, N as ProgressList, O as extractUrls, P as LoadingBox, S as HNViewer, T as EventPlanViewer, _ as SEVERITY_ORDER, a as useSkillEntry, b as LearnCard, c as SlackConnectScreen, d as AuditChecksViewer, f as McpSuggestedPromptsScreen, g as SEVERITY_LABEL, h as IssueTable, i as SkillSourceInfo, k as ModalOverlay, l as AUDIT_AREA_SLIDES, m as McpScreen, n as releaseTerminal, o as OutroScreen, r as AiOptInRequiredScreen, s as useDismissOnAnyKey, t as enterDarkTerminal, u as VisualBox, v as ServiceHealthList, w as ScreenContainer, y as TipsCard } from "./terminal-Bb6tZkf-.js";
|
|
15
|
+
import { t as ALL_FEATURE_VALUES } from "./defaults-8zjNjGGi.js";
|
|
16
|
+
import { t as startFileWatcher } from "./file-watcher-BL-IRbR7.js";
|
|
17
|
+
import { a as getSupportedClients, c as removeMCPServer, i as getInstalledClients, o as getSupportedPluginClients, s as installPlugins, u as isPluginCapable } from "./add-mcp-server-to-clients-CNzZMSat.js";
|
|
19
18
|
import path from "path";
|
|
20
19
|
import { join as join$1 } from "node:path";
|
|
21
20
|
import { spawn, spawnSync } from "node:child_process";
|
|
@@ -1082,7 +1081,7 @@ const FrameworkPicker = ({ store, onComplete }) => {
|
|
|
1082
1081
|
})),
|
|
1083
1082
|
onSelect: (value) => {
|
|
1084
1083
|
const integration = Array.isArray(value) ? value[0] : value;
|
|
1085
|
-
import("./registry-
|
|
1084
|
+
import("./registry-D2V88NoC.js").then((n) => n.n).then(({ FRAMEWORK_REGISTRY }) => {
|
|
1086
1085
|
const config = FRAMEWORK_REGISTRY[integration];
|
|
1087
1086
|
store.setFrameworkConfig(integration, config);
|
|
1088
1087
|
store.setDetectedFramework(config.metadata.name);
|
|
@@ -2592,13 +2591,202 @@ const DetectErrorBody = ({ error }) => {
|
|
|
2592
2591
|
//#region src/ui/tui/screens/SelfDrivingIntegrationCheckScreen.tsx
|
|
2593
2592
|
/**
|
|
2594
2593
|
* SelfDrivingIntegrationCheckScreen — shown only when detection found no
|
|
2595
|
-
* PostHog in the project.
|
|
2596
|
-
*
|
|
2597
|
-
*
|
|
2598
|
-
*
|
|
2594
|
+
* PostHog in the project. Self-driving needs a PostHog SDK, so we always
|
|
2595
|
+
* integrate first; but a project with no SDK is often a project with no PostHog
|
|
2596
|
+
* account either, so this screen first asks whether the user already has one:
|
|
2597
|
+
*
|
|
2598
|
+
* - "Yes — log me in" → setIntegrate(true); auth runs the OAuth login.
|
|
2599
|
+
* - "No — create one for me" → collect email + region, then
|
|
2600
|
+
* chooseProvisionAccount(): auth provisions a new
|
|
2601
|
+
* account (and emails a login link) instead.
|
|
2602
|
+
*
|
|
2603
|
+
* Both answers integrate the SDK; they only differ in how auth gets credentials.
|
|
2604
|
+
* Skipped entirely when PostHog is already present (or under `--integrate`,
|
|
2605
|
+
* which forces integration + the default OAuth login).
|
|
2599
2606
|
*/
|
|
2607
|
+
const EMAIL_RE = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
|
|
2600
2608
|
const SelfDrivingIntegrationCheckScreen = ({ store }) => {
|
|
2601
2609
|
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
2610
|
+
const [stage, setStage] = useState("ask");
|
|
2611
|
+
const [email, setEmail] = useState(store.session.email ?? "");
|
|
2612
|
+
const [emailError, setEmailError] = useState(null);
|
|
2613
|
+
const [showPrivacy, setShowPrivacy] = useState(false);
|
|
2614
|
+
useInput((input, key) => {
|
|
2615
|
+
if (showPrivacy) {
|
|
2616
|
+
if (key.escape) setShowPrivacy(false);
|
|
2617
|
+
return;
|
|
2618
|
+
}
|
|
2619
|
+
if ((input === "i" || input === "I") && stage !== "email") {
|
|
2620
|
+
setShowPrivacy(true);
|
|
2621
|
+
return;
|
|
2622
|
+
}
|
|
2623
|
+
if (key.escape && stage !== "ask") {
|
|
2624
|
+
setEmailError(null);
|
|
2625
|
+
setStage(stage === "region" ? "email" : "ask");
|
|
2626
|
+
}
|
|
2627
|
+
});
|
|
2628
|
+
if (showPrivacy) return /* @__PURE__ */ jsx(IntroScreenLayout, {
|
|
2629
|
+
installDir: store.session.installDir,
|
|
2630
|
+
title: "Wizard privacy & usage",
|
|
2631
|
+
showSubtitle: false,
|
|
2632
|
+
showDetection: false,
|
|
2633
|
+
body: /* @__PURE__ */ jsx(PrivacyPanel, {}),
|
|
2634
|
+
menuOptions: [{
|
|
2635
|
+
label: "Back",
|
|
2636
|
+
value: "back"
|
|
2637
|
+
}],
|
|
2638
|
+
menuAlign: "left",
|
|
2639
|
+
onSelect: () => setShowPrivacy(false)
|
|
2640
|
+
});
|
|
2641
|
+
if (stage === "region") return /* @__PURE__ */ jsxs(Box, {
|
|
2642
|
+
flexDirection: "column",
|
|
2643
|
+
flexGrow: 1,
|
|
2644
|
+
children: [
|
|
2645
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2646
|
+
bold: true,
|
|
2647
|
+
color: Colors.accent,
|
|
2648
|
+
children: "Where should we create your account?"
|
|
2649
|
+
}),
|
|
2650
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2651
|
+
marginTop: 1,
|
|
2652
|
+
flexDirection: "column",
|
|
2653
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
2654
|
+
dimColor: true,
|
|
2655
|
+
children: [
|
|
2656
|
+
"We'll create your PostHog account for ",
|
|
2657
|
+
email,
|
|
2658
|
+
" in this region."
|
|
2659
|
+
]
|
|
2660
|
+
})
|
|
2661
|
+
}),
|
|
2662
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2663
|
+
marginTop: 1,
|
|
2664
|
+
children: /* @__PURE__ */ jsx(PickerMenu, {
|
|
2665
|
+
message: "Pick your cloud region",
|
|
2666
|
+
options: [{
|
|
2667
|
+
label: "US",
|
|
2668
|
+
value: "us",
|
|
2669
|
+
hint: "us.posthog.com"
|
|
2670
|
+
}, {
|
|
2671
|
+
label: "EU",
|
|
2672
|
+
value: "eu",
|
|
2673
|
+
hint: "eu.posthog.com"
|
|
2674
|
+
}],
|
|
2675
|
+
onSelect: (value) => {
|
|
2676
|
+
const region = Array.isArray(value) ? value[0] : value;
|
|
2677
|
+
store.chooseProvisionAccount(email.trim(), region);
|
|
2678
|
+
}
|
|
2679
|
+
})
|
|
2680
|
+
}),
|
|
2681
|
+
/* @__PURE__ */ jsxs(Box, {
|
|
2682
|
+
marginTop: 1,
|
|
2683
|
+
flexDirection: "column",
|
|
2684
|
+
children: [
|
|
2685
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2686
|
+
dimColor: true,
|
|
2687
|
+
children: "By creating an account you agree to our terms."
|
|
2688
|
+
}),
|
|
2689
|
+
/* @__PURE__ */ jsxs(Text, {
|
|
2690
|
+
dimColor: true,
|
|
2691
|
+
children: ["Terms: ", /* @__PURE__ */ jsx(Text, {
|
|
2692
|
+
color: "cyan",
|
|
2693
|
+
children: POSTHOG_TERMS_URL
|
|
2694
|
+
})]
|
|
2695
|
+
}),
|
|
2696
|
+
/* @__PURE__ */ jsxs(Text, {
|
|
2697
|
+
dimColor: true,
|
|
2698
|
+
children: ["Privacy: ", /* @__PURE__ */ jsx(Text, {
|
|
2699
|
+
color: "cyan",
|
|
2700
|
+
children: POSTHOG_PRIVACY_URL
|
|
2701
|
+
})]
|
|
2702
|
+
})
|
|
2703
|
+
]
|
|
2704
|
+
}),
|
|
2705
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2706
|
+
marginTop: 1,
|
|
2707
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
2708
|
+
dimColor: true,
|
|
2709
|
+
children: [
|
|
2710
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2711
|
+
color: Colors.accent,
|
|
2712
|
+
children: "[Esc]"
|
|
2713
|
+
}),
|
|
2714
|
+
" back",
|
|
2715
|
+
" · ",
|
|
2716
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2717
|
+
color: Colors.accent,
|
|
2718
|
+
children: "[I]"
|
|
2719
|
+
}),
|
|
2720
|
+
" privacy & usage"
|
|
2721
|
+
]
|
|
2722
|
+
})
|
|
2723
|
+
})
|
|
2724
|
+
]
|
|
2725
|
+
});
|
|
2726
|
+
if (stage === "email") return /* @__PURE__ */ jsxs(Box, {
|
|
2727
|
+
flexDirection: "column",
|
|
2728
|
+
flexGrow: 1,
|
|
2729
|
+
children: [
|
|
2730
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2731
|
+
bold: true,
|
|
2732
|
+
color: Colors.accent,
|
|
2733
|
+
children: "Create your PostHog account"
|
|
2734
|
+
}),
|
|
2735
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2736
|
+
marginTop: 1,
|
|
2737
|
+
flexDirection: "column",
|
|
2738
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
2739
|
+
dimColor: true,
|
|
2740
|
+
children: "We'll create your account and email you a login link. What email should we use?"
|
|
2741
|
+
})
|
|
2742
|
+
}),
|
|
2743
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2744
|
+
marginTop: 1,
|
|
2745
|
+
width: "100%",
|
|
2746
|
+
children: /* @__PURE__ */ jsx(TextInput, {
|
|
2747
|
+
placeholder: "you@company.com",
|
|
2748
|
+
defaultValue: email,
|
|
2749
|
+
onChange: setEmail,
|
|
2750
|
+
onSubmit: (value) => {
|
|
2751
|
+
const trimmed = value.trim();
|
|
2752
|
+
if (!EMAIL_RE.test(trimmed)) {
|
|
2753
|
+
setEmailError("Please enter a valid email address.");
|
|
2754
|
+
return;
|
|
2755
|
+
}
|
|
2756
|
+
setEmail(trimmed);
|
|
2757
|
+
setEmailError(null);
|
|
2758
|
+
setStage("region");
|
|
2759
|
+
}
|
|
2760
|
+
})
|
|
2761
|
+
}),
|
|
2762
|
+
emailError && /* @__PURE__ */ jsx(Box, {
|
|
2763
|
+
marginTop: 1,
|
|
2764
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
2765
|
+
color: "yellow",
|
|
2766
|
+
children: emailError
|
|
2767
|
+
})
|
|
2768
|
+
}),
|
|
2769
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2770
|
+
marginTop: 1,
|
|
2771
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
2772
|
+
dimColor: true,
|
|
2773
|
+
children: [
|
|
2774
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2775
|
+
color: Colors.accent,
|
|
2776
|
+
children: "[Enter]"
|
|
2777
|
+
}),
|
|
2778
|
+
" continue",
|
|
2779
|
+
" · ",
|
|
2780
|
+
/* @__PURE__ */ jsx(Text, {
|
|
2781
|
+
color: Colors.accent,
|
|
2782
|
+
children: "[Esc]"
|
|
2783
|
+
}),
|
|
2784
|
+
" back"
|
|
2785
|
+
]
|
|
2786
|
+
})
|
|
2787
|
+
})
|
|
2788
|
+
]
|
|
2789
|
+
});
|
|
2602
2790
|
return /* @__PURE__ */ jsxs(Box, {
|
|
2603
2791
|
flexDirection: "column",
|
|
2604
2792
|
flexGrow: 1,
|
|
@@ -2613,17 +2801,35 @@ const SelfDrivingIntegrationCheckScreen = ({ store }) => {
|
|
|
2613
2801
|
flexDirection: "column",
|
|
2614
2802
|
children: /* @__PURE__ */ jsx(Text, {
|
|
2615
2803
|
dimColor: true,
|
|
2616
|
-
children: "This will kick off an agent to explore your project and find existing PostHog integrations. Self-driving reads PostHog data, so we'll set that up first: it gives your signal sources something to watch."
|
|
2804
|
+
children: "This will kick off an agent to explore your project and find existing PostHog integrations. Self-driving reads PostHog data, so we'll set that up first: it gives your signal sources something to watch. To do that we need to connect to PostHog — do you already have an account?"
|
|
2617
2805
|
})
|
|
2618
2806
|
}),
|
|
2619
2807
|
/* @__PURE__ */ jsx(Box, {
|
|
2620
2808
|
marginTop: 1,
|
|
2621
2809
|
children: /* @__PURE__ */ jsx(PickerMenu, {
|
|
2622
2810
|
options: [{
|
|
2623
|
-
label: "
|
|
2624
|
-
value: "
|
|
2811
|
+
label: "Yes, log me in",
|
|
2812
|
+
value: "login",
|
|
2813
|
+
hint: "opens PostHog to authorize"
|
|
2814
|
+
}, {
|
|
2815
|
+
label: "No, create one for me",
|
|
2816
|
+
value: "provision",
|
|
2817
|
+
hint: "we'll email you a login link"
|
|
2625
2818
|
}],
|
|
2626
|
-
onSelect: () =>
|
|
2819
|
+
onSelect: (value) => {
|
|
2820
|
+
if ((Array.isArray(value) ? value[0] : value) === "login") store.setIntegrate(true);
|
|
2821
|
+
else setStage("email");
|
|
2822
|
+
}
|
|
2823
|
+
})
|
|
2824
|
+
}),
|
|
2825
|
+
/* @__PURE__ */ jsx(Box, {
|
|
2826
|
+
marginTop: 1,
|
|
2827
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
2828
|
+
dimColor: true,
|
|
2829
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
2830
|
+
color: Colors.accent,
|
|
2831
|
+
children: "[I]"
|
|
2832
|
+
}), " privacy & usage"]
|
|
2627
2833
|
})
|
|
2628
2834
|
})
|
|
2629
2835
|
]
|
|
@@ -3073,59 +3279,6 @@ const AuditIntroScreen = ({ store }) => {
|
|
|
3073
3279
|
};
|
|
3074
3280
|
//#endregion
|
|
3075
3281
|
//#region src/ui/tui/hooks/file-watcher.ts
|
|
3076
|
-
/**
|
|
3077
|
-
* File watcher (UI concern).
|
|
3078
|
-
*
|
|
3079
|
-
* `fs.watch` alone is unreliable for atomic-rename writes (which is how Claude
|
|
3080
|
-
* rewrites JSON files), so the watcher pairs `fs.watch` with a continuous
|
|
3081
|
-
* mtime-polled re-read. The poll catches missed events; the watch keeps
|
|
3082
|
-
* latency low when it does fire. We dedupe with `mtimeMs` so steady-state
|
|
3083
|
-
* polls cost a single `stat`.
|
|
3084
|
-
*
|
|
3085
|
-
* Screens that need to mirror an agent-emitted JSON file into the store call
|
|
3086
|
-
* `useFileWatcher(absolutePath, onUpdate)`; the watcher starts on mount and
|
|
3087
|
-
* tears down on unmount.
|
|
3088
|
-
*/
|
|
3089
|
-
const DEFAULT_POLL_INTERVAL_MS = 5e3;
|
|
3090
|
-
const DEFAULT_ATTACH_RETRY_INTERVAL_MS = 1e3;
|
|
3091
|
-
/** Watch `path` for JSON updates and call `onUpdate(parsed)` whenever the
|
|
3092
|
-
* file's mtime changes and the contents are valid JSON. Caller must invoke
|
|
3093
|
-
* `handle.stop()` to release the watcher. */
|
|
3094
|
-
function startFileWatcher(path, onUpdate, options = {}) {
|
|
3095
|
-
const pollIntervalMs = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
3096
|
-
const attachRetryIntervalMs = options.attachRetryIntervalMs ?? DEFAULT_ATTACH_RETRY_INTERVAL_MS;
|
|
3097
|
-
const watchers = [];
|
|
3098
|
-
const intervals = [];
|
|
3099
|
-
let lastMtimeMs = 0;
|
|
3100
|
-
const read = (force = false) => {
|
|
3101
|
-
try {
|
|
3102
|
-
const stat = fs$1.statSync(path);
|
|
3103
|
-
if (!force && stat.mtimeMs === lastMtimeMs) return;
|
|
3104
|
-
lastMtimeMs = stat.mtimeMs;
|
|
3105
|
-
onUpdate(JSON.parse(fs$1.readFileSync(path, "utf-8")));
|
|
3106
|
-
} catch {}
|
|
3107
|
-
};
|
|
3108
|
-
intervals.push(setInterval(() => read(), pollIntervalMs));
|
|
3109
|
-
try {
|
|
3110
|
-
watchers.push(fs$1.watch(path, () => read(true)));
|
|
3111
|
-
read(true);
|
|
3112
|
-
} catch {
|
|
3113
|
-
const attachInterval = setInterval(() => {
|
|
3114
|
-
try {
|
|
3115
|
-
fs$1.accessSync(path);
|
|
3116
|
-
clearInterval(attachInterval);
|
|
3117
|
-
const idx = intervals.indexOf(attachInterval);
|
|
3118
|
-
if (idx >= 0) intervals.splice(idx, 1);
|
|
3119
|
-
watchers.push(fs$1.watch(path, () => read(true)));
|
|
3120
|
-
} catch {}
|
|
3121
|
-
}, attachRetryIntervalMs);
|
|
3122
|
-
intervals.push(attachInterval);
|
|
3123
|
-
}
|
|
3124
|
-
return { stop() {
|
|
3125
|
-
for (const w of watchers) w.close();
|
|
3126
|
-
for (const i of intervals) clearInterval(i);
|
|
3127
|
-
} };
|
|
3128
|
-
}
|
|
3129
3282
|
/** React hook wrapping `startFileWatcher`. Starts on mount, stops on unmount
|
|
3130
3283
|
* or when `path` changes. `onUpdate` and `options` are captured at mount
|
|
3131
3284
|
* time — change `path` to restart with a new callback. */
|
|
@@ -4019,6 +4172,120 @@ const SetupScreen = ({ store }) => {
|
|
|
4019
4172
|
});
|
|
4020
4173
|
};
|
|
4021
4174
|
//#endregion
|
|
4175
|
+
//#region src/utils/clipboard.ts
|
|
4176
|
+
/**
|
|
4177
|
+
* Best-effort platform shell-outs for making a URL usable in any terminal —
|
|
4178
|
+
* no third-party dependency.
|
|
4179
|
+
*
|
|
4180
|
+
* Two helpers back the `wizard_ask` link overlay, for terminals that can't
|
|
4181
|
+
* linkify a wrapped URL (e.g. macOS Terminal.app, which lacks OSC 8 hyperlink
|
|
4182
|
+
* support):
|
|
4183
|
+
*
|
|
4184
|
+
* - `copyToClipboard` — pipe the URL to the platform clipboard binary so the
|
|
4185
|
+
* user can paste it into a browser.
|
|
4186
|
+
* - `openInBrowser` — hand the URL to the platform opener so it launches
|
|
4187
|
+
* directly, no copy/paste needed.
|
|
4188
|
+
*
|
|
4189
|
+
* Both shell out with `spawn` and never a shell, and pass the URL as an argv
|
|
4190
|
+
* (clipboard via stdin) — so there's no shell-injection surface. Neither throws:
|
|
4191
|
+
* they return false when no command is reachable (CI, headless, or the binary
|
|
4192
|
+
* isn't installed).
|
|
4193
|
+
*/
|
|
4194
|
+
/** Platform clipboard commands, in preference order. */
|
|
4195
|
+
function clipboardCommands() {
|
|
4196
|
+
if (process.platform === "darwin") return [{
|
|
4197
|
+
cmd: "pbcopy",
|
|
4198
|
+
args: []
|
|
4199
|
+
}];
|
|
4200
|
+
if (process.platform === "win32") return [{
|
|
4201
|
+
cmd: "clip",
|
|
4202
|
+
args: []
|
|
4203
|
+
}];
|
|
4204
|
+
return [
|
|
4205
|
+
{
|
|
4206
|
+
cmd: "wl-copy",
|
|
4207
|
+
args: []
|
|
4208
|
+
},
|
|
4209
|
+
{
|
|
4210
|
+
cmd: "xclip",
|
|
4211
|
+
args: ["-selection", "clipboard"]
|
|
4212
|
+
},
|
|
4213
|
+
{
|
|
4214
|
+
cmd: "xsel",
|
|
4215
|
+
args: ["--clipboard", "--input"]
|
|
4216
|
+
}
|
|
4217
|
+
];
|
|
4218
|
+
}
|
|
4219
|
+
function writeWith({ cmd, args }, text) {
|
|
4220
|
+
return new Promise((resolve) => {
|
|
4221
|
+
try {
|
|
4222
|
+
const child = spawn(cmd, args);
|
|
4223
|
+
child.on("error", () => resolve(false));
|
|
4224
|
+
child.stdin.on("error", () => resolve(false));
|
|
4225
|
+
child.on("close", (code) => resolve(code === 0));
|
|
4226
|
+
child.stdin.end(text);
|
|
4227
|
+
} catch {
|
|
4228
|
+
resolve(false);
|
|
4229
|
+
}
|
|
4230
|
+
});
|
|
4231
|
+
}
|
|
4232
|
+
async function copyToClipboard(text) {
|
|
4233
|
+
for (const command of clipboardCommands()) if (await writeWith(command, text)) return true;
|
|
4234
|
+
logToFile("[clipboard] no working clipboard command found");
|
|
4235
|
+
return false;
|
|
4236
|
+
}
|
|
4237
|
+
/**
|
|
4238
|
+
* Platform browser-open commands, in preference order. The URL is one argv
|
|
4239
|
+
* element — never concatenated into a shell string — so a `?kind=…` query or
|
|
4240
|
+
* any other character can't escape into the command line.
|
|
4241
|
+
*
|
|
4242
|
+
* `win32` has no shell-free single binary for this: `start` is a `cmd` builtin,
|
|
4243
|
+
* so we invoke `cmd /c start "" <url>` (the empty `""` is `start`'s window-title
|
|
4244
|
+
* argument, which would otherwise swallow the URL). The URL is still a discrete
|
|
4245
|
+
* argv element, not interpolated into the command string.
|
|
4246
|
+
*
|
|
4247
|
+
* Takes `platform` as an argument (defaulting to the host) so the mapping is a
|
|
4248
|
+
* pure function the tests can exercise across platforms.
|
|
4249
|
+
*/
|
|
4250
|
+
function browserOpenCommands(url, platform = process.platform) {
|
|
4251
|
+
if (platform === "darwin") return [{
|
|
4252
|
+
cmd: "open",
|
|
4253
|
+
args: [url]
|
|
4254
|
+
}];
|
|
4255
|
+
if (platform === "win32") return [{
|
|
4256
|
+
cmd: "cmd",
|
|
4257
|
+
args: [
|
|
4258
|
+
"/c",
|
|
4259
|
+
"start",
|
|
4260
|
+
"",
|
|
4261
|
+
url
|
|
4262
|
+
]
|
|
4263
|
+
}];
|
|
4264
|
+
return [{
|
|
4265
|
+
cmd: "xdg-open",
|
|
4266
|
+
args: [url]
|
|
4267
|
+
}, {
|
|
4268
|
+
cmd: "x-www-browser",
|
|
4269
|
+
args: [url]
|
|
4270
|
+
}];
|
|
4271
|
+
}
|
|
4272
|
+
function spawnOpener({ cmd, args }) {
|
|
4273
|
+
return new Promise((resolve) => {
|
|
4274
|
+
try {
|
|
4275
|
+
const child = spawn(cmd, args, { stdio: "ignore" });
|
|
4276
|
+
child.on("error", () => resolve(false));
|
|
4277
|
+
child.on("close", (code) => resolve(code === 0));
|
|
4278
|
+
} catch {
|
|
4279
|
+
resolve(false);
|
|
4280
|
+
}
|
|
4281
|
+
});
|
|
4282
|
+
}
|
|
4283
|
+
async function openInBrowser(url) {
|
|
4284
|
+
for (const command of browserOpenCommands(url)) if (await spawnOpener(command)) return true;
|
|
4285
|
+
logToFile("[clipboard] no working browser-open command found");
|
|
4286
|
+
return false;
|
|
4287
|
+
}
|
|
4288
|
+
//#endregion
|
|
4022
4289
|
//#region src/ui/tui/screens/AuthScreen.tsx
|
|
4023
4290
|
/**
|
|
4024
4291
|
* AuthScreen — Shown while waiting for OAuth authentication.
|
|
@@ -4026,23 +4293,39 @@ const SetupScreen = ({ store }) => {
|
|
|
4026
4293
|
* Displays framework detection, a compressed privacy summary, a waiting
|
|
4027
4294
|
* spinner, and the login URL when available. [I] opens the full
|
|
4028
4295
|
* PrivacyPanel as an overlay. [P] (when loginUrl is set) lets the user
|
|
4029
|
-
* paste the callback URL by hand.
|
|
4296
|
+
* paste the callback URL by hand. [C] copies the login URL to the
|
|
4297
|
+
* clipboard — the exact string, so it can't be chopped by a soft-wrap.
|
|
4030
4298
|
*
|
|
4031
4299
|
* The router resolves past this screen once session.credentials is set.
|
|
4032
4300
|
*/
|
|
4033
4301
|
const AuthScreen = ({ store }) => {
|
|
4034
4302
|
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
4035
4303
|
const [showPrivacy, setShowPrivacy] = useState(false);
|
|
4304
|
+
const [copyStatus, setCopyStatus] = useState("idle");
|
|
4305
|
+
const [columns] = useStdoutDimensions();
|
|
4036
4306
|
const { session } = store;
|
|
4037
|
-
const
|
|
4307
|
+
const loginUrl = session.loginUrl;
|
|
4308
|
+
const canPasteCode = Boolean(loginUrl);
|
|
4309
|
+
const availableWidth = Math.min(columns, 120) - 2;
|
|
4310
|
+
const urlFits = loginUrl ? loginUrl.length <= availableWidth : true;
|
|
4038
4311
|
const bindings = [];
|
|
4039
4312
|
if (!showPrivacy) {
|
|
4040
|
-
if (canPasteCode)
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4044
|
-
|
|
4045
|
-
|
|
4313
|
+
if (canPasteCode && loginUrl) {
|
|
4314
|
+
bindings.push({
|
|
4315
|
+
match: ["p", "P"],
|
|
4316
|
+
label: "P",
|
|
4317
|
+
action: "paste auth code",
|
|
4318
|
+
handler: () => store.showManualAuthCode()
|
|
4319
|
+
});
|
|
4320
|
+
bindings.push({
|
|
4321
|
+
match: ["c", "C"],
|
|
4322
|
+
label: "C",
|
|
4323
|
+
action: "copy link",
|
|
4324
|
+
handler: () => {
|
|
4325
|
+
copyToClipboard(loginUrl).then((ok) => setCopyStatus(ok ? "copied" : "failed"));
|
|
4326
|
+
}
|
|
4327
|
+
});
|
|
4328
|
+
}
|
|
4046
4329
|
bindings.push({
|
|
4047
4330
|
match: ["i", "I"],
|
|
4048
4331
|
label: "I",
|
|
@@ -4129,35 +4412,68 @@ const AuthScreen = ({ store }) => {
|
|
|
4129
4412
|
]
|
|
4130
4413
|
}),
|
|
4131
4414
|
/* @__PURE__ */ jsx(LoadingBox, { message: "Waiting for authentication..." }),
|
|
4132
|
-
|
|
4415
|
+
loginUrl && /* @__PURE__ */ jsxs(Box, {
|
|
4133
4416
|
marginTop: 1,
|
|
4134
4417
|
marginBottom: 1,
|
|
4135
4418
|
flexDirection: "column",
|
|
4136
|
-
children: [
|
|
4137
|
-
/* @__PURE__ */
|
|
4138
|
-
|
|
4139
|
-
|
|
4419
|
+
children: [
|
|
4420
|
+
urlFits ? /* @__PURE__ */ jsxs(Text, { children: [
|
|
4421
|
+
/* @__PURE__ */ jsx(Text, {
|
|
4422
|
+
dimColor: true,
|
|
4423
|
+
children: "If the browser didn't open, copy and paste this URL:"
|
|
4424
|
+
}),
|
|
4425
|
+
"\n\n",
|
|
4426
|
+
/* @__PURE__ */ jsx(Text, {
|
|
4427
|
+
color: "cyan",
|
|
4428
|
+
children: loginUrl
|
|
4429
|
+
})
|
|
4430
|
+
] }) : /* @__PURE__ */ jsx(Text, {
|
|
4431
|
+
color: "yellow",
|
|
4432
|
+
children: "[This terminal is too small to show the full link for copying, resize your terminal]"
|
|
4140
4433
|
}),
|
|
4141
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4144
|
-
|
|
4145
|
-
|
|
4146
|
-
|
|
4147
|
-
|
|
4148
|
-
|
|
4149
|
-
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
|
|
4158
|
-
|
|
4434
|
+
/* @__PURE__ */ jsx(Box, {
|
|
4435
|
+
marginTop: 1,
|
|
4436
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
4437
|
+
dimColor: true,
|
|
4438
|
+
children: [
|
|
4439
|
+
"Press ",
|
|
4440
|
+
/* @__PURE__ */ jsx(Text, {
|
|
4441
|
+
color: Colors.accent,
|
|
4442
|
+
children: "[C]"
|
|
4443
|
+
}),
|
|
4444
|
+
" to copy the link · on a remote machine or devbox? Press",
|
|
4445
|
+
" ",
|
|
4446
|
+
/* @__PURE__ */ jsx(Text, {
|
|
4447
|
+
color: Colors.accent,
|
|
4448
|
+
children: "[P]"
|
|
4449
|
+
}),
|
|
4450
|
+
" to paste the callback URL."
|
|
4451
|
+
]
|
|
4452
|
+
})
|
|
4453
|
+
}),
|
|
4454
|
+
copyStatus === "copied" && /* @__PURE__ */ jsx(Box, {
|
|
4455
|
+
marginTop: 1,
|
|
4456
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
4457
|
+
color: Colors.success,
|
|
4458
|
+
children: [Icons.check, " Link copied to clipboard."]
|
|
4459
|
+
})
|
|
4460
|
+
}),
|
|
4461
|
+
copyStatus === "failed" && /* @__PURE__ */ jsx(Box, {
|
|
4462
|
+
marginTop: 1,
|
|
4463
|
+
children: /* @__PURE__ */ jsxs(Text, {
|
|
4464
|
+
color: "yellow",
|
|
4465
|
+
children: [
|
|
4466
|
+
"Couldn't reach a clipboard on this machine — press",
|
|
4467
|
+
" ",
|
|
4468
|
+
/* @__PURE__ */ jsx(Text, {
|
|
4469
|
+
color: Colors.accent,
|
|
4470
|
+
children: "[P]"
|
|
4471
|
+
}),
|
|
4472
|
+
" to paste the callback URL instead."
|
|
4473
|
+
]
|
|
4474
|
+
})
|
|
4159
4475
|
})
|
|
4160
|
-
|
|
4476
|
+
]
|
|
4161
4477
|
})
|
|
4162
4478
|
]
|
|
4163
4479
|
});
|
|
@@ -4173,13 +4489,6 @@ const AuthScreen = ({ store }) => {
|
|
|
4173
4489
|
*/
|
|
4174
4490
|
const RunScreen = ({ store }) => {
|
|
4175
4491
|
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
4176
|
-
useFileWatcher(join$1(store.session.installDir, EVENT_PLAN_FILE), (parsed) => {
|
|
4177
|
-
if (!Array.isArray(parsed)) return;
|
|
4178
|
-
store.setEventPlan(parsed.map((e) => ({
|
|
4179
|
-
name: e.event_name ?? e.name ?? e.event ?? "",
|
|
4180
|
-
description: e.event_description ?? e.description ?? ""
|
|
4181
|
-
})).filter((e) => e.name));
|
|
4182
|
-
});
|
|
4183
4492
|
const [columns] = useStdoutDimensions();
|
|
4184
4493
|
const progressItems = store.tasks.map((t) => ({
|
|
4185
4494
|
label: t.label,
|
|
@@ -4625,120 +4934,6 @@ const SessionTimeoutScreen = ({ store }) => {
|
|
|
4625
4934
|
});
|
|
4626
4935
|
};
|
|
4627
4936
|
//#endregion
|
|
4628
|
-
//#region src/utils/clipboard.ts
|
|
4629
|
-
/**
|
|
4630
|
-
* Best-effort platform shell-outs for making a URL usable in any terminal —
|
|
4631
|
-
* no third-party dependency.
|
|
4632
|
-
*
|
|
4633
|
-
* Two helpers back the `wizard_ask` link overlay, for terminals that can't
|
|
4634
|
-
* linkify a wrapped URL (e.g. macOS Terminal.app, which lacks OSC 8 hyperlink
|
|
4635
|
-
* support):
|
|
4636
|
-
*
|
|
4637
|
-
* - `copyToClipboard` — pipe the URL to the platform clipboard binary so the
|
|
4638
|
-
* user can paste it into a browser.
|
|
4639
|
-
* - `openInBrowser` — hand the URL to the platform opener so it launches
|
|
4640
|
-
* directly, no copy/paste needed.
|
|
4641
|
-
*
|
|
4642
|
-
* Both shell out with `spawn` and never a shell, and pass the URL as an argv
|
|
4643
|
-
* (clipboard via stdin) — so there's no shell-injection surface. Neither throws:
|
|
4644
|
-
* they return false when no command is reachable (CI, headless, or the binary
|
|
4645
|
-
* isn't installed).
|
|
4646
|
-
*/
|
|
4647
|
-
/** Platform clipboard commands, in preference order. */
|
|
4648
|
-
function clipboardCommands() {
|
|
4649
|
-
if (process.platform === "darwin") return [{
|
|
4650
|
-
cmd: "pbcopy",
|
|
4651
|
-
args: []
|
|
4652
|
-
}];
|
|
4653
|
-
if (process.platform === "win32") return [{
|
|
4654
|
-
cmd: "clip",
|
|
4655
|
-
args: []
|
|
4656
|
-
}];
|
|
4657
|
-
return [
|
|
4658
|
-
{
|
|
4659
|
-
cmd: "wl-copy",
|
|
4660
|
-
args: []
|
|
4661
|
-
},
|
|
4662
|
-
{
|
|
4663
|
-
cmd: "xclip",
|
|
4664
|
-
args: ["-selection", "clipboard"]
|
|
4665
|
-
},
|
|
4666
|
-
{
|
|
4667
|
-
cmd: "xsel",
|
|
4668
|
-
args: ["--clipboard", "--input"]
|
|
4669
|
-
}
|
|
4670
|
-
];
|
|
4671
|
-
}
|
|
4672
|
-
function writeWith({ cmd, args }, text) {
|
|
4673
|
-
return new Promise((resolve) => {
|
|
4674
|
-
try {
|
|
4675
|
-
const child = spawn(cmd, args);
|
|
4676
|
-
child.on("error", () => resolve(false));
|
|
4677
|
-
child.stdin.on("error", () => resolve(false));
|
|
4678
|
-
child.on("close", (code) => resolve(code === 0));
|
|
4679
|
-
child.stdin.end(text);
|
|
4680
|
-
} catch {
|
|
4681
|
-
resolve(false);
|
|
4682
|
-
}
|
|
4683
|
-
});
|
|
4684
|
-
}
|
|
4685
|
-
async function copyToClipboard(text) {
|
|
4686
|
-
for (const command of clipboardCommands()) if (await writeWith(command, text)) return true;
|
|
4687
|
-
logToFile("[clipboard] no working clipboard command found");
|
|
4688
|
-
return false;
|
|
4689
|
-
}
|
|
4690
|
-
/**
|
|
4691
|
-
* Platform browser-open commands, in preference order. The URL is one argv
|
|
4692
|
-
* element — never concatenated into a shell string — so a `?kind=…` query or
|
|
4693
|
-
* any other character can't escape into the command line.
|
|
4694
|
-
*
|
|
4695
|
-
* `win32` has no shell-free single binary for this: `start` is a `cmd` builtin,
|
|
4696
|
-
* so we invoke `cmd /c start "" <url>` (the empty `""` is `start`'s window-title
|
|
4697
|
-
* argument, which would otherwise swallow the URL). The URL is still a discrete
|
|
4698
|
-
* argv element, not interpolated into the command string.
|
|
4699
|
-
*
|
|
4700
|
-
* Takes `platform` as an argument (defaulting to the host) so the mapping is a
|
|
4701
|
-
* pure function the tests can exercise across platforms.
|
|
4702
|
-
*/
|
|
4703
|
-
function browserOpenCommands(url, platform = process.platform) {
|
|
4704
|
-
if (platform === "darwin") return [{
|
|
4705
|
-
cmd: "open",
|
|
4706
|
-
args: [url]
|
|
4707
|
-
}];
|
|
4708
|
-
if (platform === "win32") return [{
|
|
4709
|
-
cmd: "cmd",
|
|
4710
|
-
args: [
|
|
4711
|
-
"/c",
|
|
4712
|
-
"start",
|
|
4713
|
-
"",
|
|
4714
|
-
url
|
|
4715
|
-
]
|
|
4716
|
-
}];
|
|
4717
|
-
return [{
|
|
4718
|
-
cmd: "xdg-open",
|
|
4719
|
-
args: [url]
|
|
4720
|
-
}, {
|
|
4721
|
-
cmd: "x-www-browser",
|
|
4722
|
-
args: [url]
|
|
4723
|
-
}];
|
|
4724
|
-
}
|
|
4725
|
-
function spawnOpener({ cmd, args }) {
|
|
4726
|
-
return new Promise((resolve) => {
|
|
4727
|
-
try {
|
|
4728
|
-
const child = spawn(cmd, args, { stdio: "ignore" });
|
|
4729
|
-
child.on("error", () => resolve(false));
|
|
4730
|
-
child.on("close", (code) => resolve(code === 0));
|
|
4731
|
-
} catch {
|
|
4732
|
-
resolve(false);
|
|
4733
|
-
}
|
|
4734
|
-
});
|
|
4735
|
-
}
|
|
4736
|
-
async function openInBrowser(url) {
|
|
4737
|
-
for (const command of browserOpenCommands(url)) if (await spawnOpener(command)) return true;
|
|
4738
|
-
logToFile("[clipboard] no working browser-open command found");
|
|
4739
|
-
return false;
|
|
4740
|
-
}
|
|
4741
|
-
//#endregion
|
|
4742
4937
|
//#region src/ui/tui/screens/WizardAskScreen.tsx
|
|
4743
4938
|
/**
|
|
4744
4939
|
* WizardAskScreen — Overlay for the `wizard_ask` MCP tool.
|
|
@@ -5017,7 +5212,7 @@ function createMcpSuggestedPromptsServices(store) {
|
|
|
5017
5212
|
};
|
|
5018
5213
|
}
|
|
5019
5214
|
async function* runProductionPromptStreaming(args) {
|
|
5020
|
-
const { runMcpPromptViaSdk } = await import("./mcp-prompt-streaming-
|
|
5215
|
+
const { runMcpPromptViaSdk } = await import("./mcp-prompt-streaming-C227vG1X.js");
|
|
5021
5216
|
yield* runMcpPromptViaSdk(args);
|
|
5022
5217
|
}
|
|
5023
5218
|
//#endregion
|
|
@@ -5193,4 +5388,4 @@ function startTUI(version, program = Program.PostHogIntegration) {
|
|
|
5193
5388
|
//#endregion
|
|
5194
5389
|
export { startTUI };
|
|
5195
5390
|
|
|
5196
|
-
//# sourceMappingURL=start-tui-
|
|
5391
|
+
//# sourceMappingURL=start-tui-DHa_9aiB.js.map
|