iosm-cli 0.1.3 → 0.2.1
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/CHANGELOG.md +27 -0
- package/README.md +88 -46
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +38 -11
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/blast.d.ts +62 -0
- package/dist/core/blast.d.ts.map +1 -0
- package/dist/core/blast.js +448 -0
- package/dist/core/blast.js.map +1 -0
- package/dist/core/contract.d.ts +54 -0
- package/dist/core/contract.d.ts.map +1 -0
- package/dist/core/contract.js +300 -0
- package/dist/core/contract.js.map +1 -0
- package/dist/core/failure-retrospective.d.ts +12 -0
- package/dist/core/failure-retrospective.d.ts.map +1 -0
- package/dist/core/failure-retrospective.js +115 -0
- package/dist/core/failure-retrospective.js.map +1 -0
- package/dist/core/project-index/index.d.ts +17 -0
- package/dist/core/project-index/index.d.ts.map +1 -0
- package/dist/core/project-index/index.js +323 -0
- package/dist/core/project-index/index.js.map +1 -0
- package/dist/core/project-index/types.d.ts +34 -0
- package/dist/core/project-index/types.d.ts.map +1 -0
- package/dist/core/project-index/types.js +2 -0
- package/dist/core/project-index/types.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +8 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic/config.d.ts.map +1 -1
- package/dist/core/semantic/config.js +5 -0
- package/dist/core/semantic/config.js.map +1 -1
- package/dist/core/semantic/index.d.ts +1 -1
- package/dist/core/semantic/index.d.ts.map +1 -1
- package/dist/core/semantic/index.js +1 -1
- package/dist/core/semantic/index.js.map +1 -1
- package/dist/core/semantic/runtime.d.ts.map +1 -1
- package/dist/core/semantic/runtime.js +12 -1
- package/dist/core/semantic/runtime.js.map +1 -1
- package/dist/core/semantic/types.d.ts +6 -0
- package/dist/core/semantic/types.d.ts.map +1 -1
- package/dist/core/semantic/types.js +6 -0
- package/dist/core/semantic/types.js.map +1 -1
- package/dist/core/shadow-guard.d.ts +30 -0
- package/dist/core/shadow-guard.d.ts.map +1 -0
- package/dist/core/shadow-guard.js +81 -0
- package/dist/core/shadow-guard.js.map +1 -0
- package/dist/core/shared-memory.d.ts +46 -0
- package/dist/core/shared-memory.d.ts.map +1 -0
- package/dist/core/shared-memory.js +253 -0
- package/dist/core/shared-memory.js.map +1 -0
- package/dist/core/singular.d.ts +73 -0
- package/dist/core/singular.d.ts.map +1 -0
- package/dist/core/singular.js +413 -0
- package/dist/core/singular.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +14 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagents.js +1 -1
- package/dist/core/subagents.js.map +1 -1
- package/dist/core/swarm/gates.d.ts +9 -0
- package/dist/core/swarm/gates.d.ts.map +1 -0
- package/dist/core/swarm/gates.js +65 -0
- package/dist/core/swarm/gates.js.map +1 -0
- package/dist/core/swarm/index.d.ts +9 -0
- package/dist/core/swarm/index.d.ts.map +1 -0
- package/dist/core/swarm/index.js +9 -0
- package/dist/core/swarm/index.js.map +1 -0
- package/dist/core/swarm/locks.d.ts +21 -0
- package/dist/core/swarm/locks.d.ts.map +1 -0
- package/dist/core/swarm/locks.js +93 -0
- package/dist/core/swarm/locks.js.map +1 -0
- package/dist/core/swarm/planner.d.ts +16 -0
- package/dist/core/swarm/planner.d.ts.map +1 -0
- package/dist/core/swarm/planner.js +137 -0
- package/dist/core/swarm/planner.js.map +1 -0
- package/dist/core/swarm/retry.d.ts +16 -0
- package/dist/core/swarm/retry.d.ts.map +1 -0
- package/dist/core/swarm/retry.js +32 -0
- package/dist/core/swarm/retry.js.map +1 -0
- package/dist/core/swarm/scheduler.d.ts +48 -0
- package/dist/core/swarm/scheduler.d.ts.map +1 -0
- package/dist/core/swarm/scheduler.js +554 -0
- package/dist/core/swarm/scheduler.js.map +1 -0
- package/dist/core/swarm/spawn.d.ts +16 -0
- package/dist/core/swarm/spawn.d.ts.map +1 -0
- package/dist/core/swarm/spawn.js +42 -0
- package/dist/core/swarm/spawn.js.map +1 -0
- package/dist/core/swarm/state-store.d.ts +35 -0
- package/dist/core/swarm/state-store.d.ts.map +1 -0
- package/dist/core/swarm/state-store.js +106 -0
- package/dist/core/swarm/state-store.js.map +1 -0
- package/dist/core/swarm/types.d.ts +116 -0
- package/dist/core/swarm/types.d.ts.map +1 -0
- package/dist/core/swarm/types.js +2 -0
- package/dist/core/swarm/types.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +6 -3
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/semantic-search.d.ts.map +1 -1
- package/dist/core/tools/semantic-search.js +1 -0
- package/dist/core/tools/semantic-search.js.map +1 -1
- package/dist/core/tools/shared-memory.d.ts +23 -0
- package/dist/core/tools/shared-memory.d.ts.map +1 -0
- package/dist/core/tools/shared-memory.js +134 -0
- package/dist/core/tools/shared-memory.js.map +1 -0
- package/dist/core/tools/task.d.ts +8 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +664 -123
- package/dist/core/tools/task.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +8 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +8 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +70 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +27 -4
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/subagent-message.js +14 -0
- package/dist/modes/interactive/components/subagent-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +81 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3481 -870
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +29 -1
- package/docs/configuration.md +5 -0
- package/docs/interactive-mode.md +171 -2
- package/docs/orchestration-and-subagents.md +96 -169
- package/package.json +4 -3
|
@@ -6,6 +6,9 @@ import type { AppAction, KeybindingsManager } from "../../../core/keybindings.js
|
|
|
6
6
|
export declare class CustomEditor extends Editor {
|
|
7
7
|
private keybindings;
|
|
8
8
|
actionHandlers: Map<AppAction, () => void>;
|
|
9
|
+
private plainPasteBuffer;
|
|
10
|
+
private plainPasteFlushTimer;
|
|
11
|
+
private readonly plainPasteFlushDelayMs;
|
|
9
12
|
onEscape?: () => void;
|
|
10
13
|
onCtrlD?: () => void;
|
|
11
14
|
onPasteImage?: () => void;
|
|
@@ -16,6 +19,11 @@ export declare class CustomEditor extends Editor {
|
|
|
16
19
|
* Register a handler for an app action.
|
|
17
20
|
*/
|
|
18
21
|
onAction(action: AppAction, handler: () => void): void;
|
|
22
|
+
private isLikelyUnbracketedPasteChunk;
|
|
23
|
+
private schedulePlainPasteFlush;
|
|
24
|
+
private flushPlainPasteBuffer;
|
|
25
|
+
private rewritePasteMarker;
|
|
26
|
+
render(width: number): string[];
|
|
19
27
|
handleInput(data: string): void;
|
|
20
28
|
}
|
|
21
29
|
//# sourceMappingURL=custom-editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-editor.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"custom-editor.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiC,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC7H,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElF;;GAEG;AACH,qBAAa,YAAa,SAAQ,MAAM;IACvC,OAAO,CAAC,WAAW,CAAqB;IACjC,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAa;IAC9D,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAM;IAGtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,2EAA2E;IACpE,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;gBAE3C,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,aAAa;IAKlG;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAItD,OAAO,CAAC,6BAA6B;IAkBrC,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;IAMjB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAWxC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CA4D/B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Editor } from "@mariozechner/pi-tui";
|
|
1
|
+
import { Editor, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
|
|
2
2
|
/**
|
|
3
3
|
* Custom editor that handles app-level keybindings for coding-agent.
|
|
4
4
|
*/
|
|
@@ -6,6 +6,8 @@ export class CustomEditor extends Editor {
|
|
|
6
6
|
constructor(tui, theme, keybindings, options) {
|
|
7
7
|
super(tui, theme, options);
|
|
8
8
|
this.actionHandlers = new Map();
|
|
9
|
+
this.plainPasteBuffer = "";
|
|
10
|
+
this.plainPasteFlushDelayMs = 80;
|
|
9
11
|
this.keybindings = keybindings;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
@@ -14,7 +16,74 @@ export class CustomEditor extends Editor {
|
|
|
14
16
|
onAction(action, handler) {
|
|
15
17
|
this.actionHandlers.set(action, handler);
|
|
16
18
|
}
|
|
19
|
+
isLikelyUnbracketedPasteChunk(data) {
|
|
20
|
+
if (!data)
|
|
21
|
+
return false;
|
|
22
|
+
// Ignore known escape/control sequences (arrows, alt-combos, etc.)
|
|
23
|
+
if (data.includes("\x1b"))
|
|
24
|
+
return false;
|
|
25
|
+
// Single Enter key should still submit immediately.
|
|
26
|
+
if (data.length <= 1)
|
|
27
|
+
return false;
|
|
28
|
+
if (!data.includes("\n") && !data.includes("\r"))
|
|
29
|
+
return false;
|
|
30
|
+
let hasPrintable = false;
|
|
31
|
+
for (const char of data) {
|
|
32
|
+
if (char === "\n" || char === "\r" || char === "\t")
|
|
33
|
+
continue;
|
|
34
|
+
if (char.charCodeAt(0) >= 32) {
|
|
35
|
+
hasPrintable = true;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return hasPrintable;
|
|
40
|
+
}
|
|
41
|
+
schedulePlainPasteFlush() {
|
|
42
|
+
if (this.plainPasteFlushTimer) {
|
|
43
|
+
clearTimeout(this.plainPasteFlushTimer);
|
|
44
|
+
}
|
|
45
|
+
this.plainPasteFlushTimer = setTimeout(() => {
|
|
46
|
+
this.flushPlainPasteBuffer();
|
|
47
|
+
}, this.plainPasteFlushDelayMs);
|
|
48
|
+
}
|
|
49
|
+
flushPlainPasteBuffer() {
|
|
50
|
+
if (this.plainPasteFlushTimer) {
|
|
51
|
+
clearTimeout(this.plainPasteFlushTimer);
|
|
52
|
+
this.plainPasteFlushTimer = undefined;
|
|
53
|
+
}
|
|
54
|
+
if (!this.plainPasteBuffer)
|
|
55
|
+
return;
|
|
56
|
+
const payload = this.plainPasteBuffer;
|
|
57
|
+
this.plainPasteBuffer = "";
|
|
58
|
+
super.handleInput(`\x1b[200~${payload}\x1b[201~`);
|
|
59
|
+
}
|
|
60
|
+
rewritePasteMarker(line) {
|
|
61
|
+
return line.replace(/\[paste #(\d+)( (\+\d+ lines|\d+ chars))?\]/gi, (_match, id, suffix) => {
|
|
62
|
+
return `[Pasted text #${id}${suffix ?? ""}]`;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
render(width) {
|
|
66
|
+
const lines = super.render(width);
|
|
67
|
+
return lines.map((line) => {
|
|
68
|
+
const rewritten = this.rewritePasteMarker(line);
|
|
69
|
+
if (rewritten === line)
|
|
70
|
+
return line;
|
|
71
|
+
// Keep hard width guarantees after rewrite by trimming trailing visual width if needed.
|
|
72
|
+
if (visibleWidth(rewritten) <= width)
|
|
73
|
+
return rewritten;
|
|
74
|
+
return truncateToWidth(rewritten, width, "", true);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
17
77
|
handleInput(data) {
|
|
78
|
+
if (this.isLikelyUnbracketedPasteChunk(data)) {
|
|
79
|
+
this.plainPasteBuffer += data.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
80
|
+
this.schedulePlainPasteFlush();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// If we buffered plain paste chunks, flush them before processing the next key.
|
|
84
|
+
if (this.plainPasteBuffer) {
|
|
85
|
+
this.flushPlainPasteBuffer();
|
|
86
|
+
}
|
|
18
87
|
// Check extension-registered shortcuts first
|
|
19
88
|
if (this.onExtensionShortcut?.(data)) {
|
|
20
89
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-editor.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAkD,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-editor.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Editor, truncateToWidth, visibleWidth, type EditorOptions, type EditorTheme, type TUI } from \"@mariozechner/pi-tui\";\nimport type { AppAction, KeybindingsManager } from \"../../../core/keybindings.js\";\n\n/**\n * Custom editor that handles app-level keybindings for coding-agent.\n */\nexport class CustomEditor extends Editor {\n\tprivate keybindings: KeybindingsManager;\n\tpublic actionHandlers: Map<AppAction, () => void> = new Map();\n\tprivate plainPasteBuffer = \"\";\n\tprivate plainPasteFlushTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate readonly plainPasteFlushDelayMs = 80;\n\n\t// Special handlers that can be dynamically replaced\n\tpublic onEscape?: () => void;\n\tpublic onCtrlD?: () => void;\n\tpublic onPasteImage?: () => void;\n\t/** Handler for extension-registered shortcuts. Returns true if handled. */\n\tpublic onExtensionShortcut?: (data: string) => boolean;\n\n\tconstructor(tui: TUI, theme: EditorTheme, keybindings: KeybindingsManager, options?: EditorOptions) {\n\t\tsuper(tui, theme, options);\n\t\tthis.keybindings = keybindings;\n\t}\n\n\t/**\n\t * Register a handler for an app action.\n\t */\n\tonAction(action: AppAction, handler: () => void): void {\n\t\tthis.actionHandlers.set(action, handler);\n\t}\n\n\tprivate isLikelyUnbracketedPasteChunk(data: string): boolean {\n\t\tif (!data) return false;\n\t\t// Ignore known escape/control sequences (arrows, alt-combos, etc.)\n\t\tif (data.includes(\"\\x1b\")) return false;\n\t\t// Single Enter key should still submit immediately.\n\t\tif (data.length <= 1) return false;\n\t\tif (!data.includes(\"\\n\") && !data.includes(\"\\r\")) return false;\n\t\tlet hasPrintable = false;\n\t\tfor (const char of data) {\n\t\t\tif (char === \"\\n\" || char === \"\\r\" || char === \"\\t\") continue;\n\t\t\tif (char.charCodeAt(0) >= 32) {\n\t\t\t\thasPrintable = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn hasPrintable;\n\t}\n\n\tprivate schedulePlainPasteFlush(): void {\n\t\tif (this.plainPasteFlushTimer) {\n\t\t\tclearTimeout(this.plainPasteFlushTimer);\n\t\t}\n\t\tthis.plainPasteFlushTimer = setTimeout(() => {\n\t\t\tthis.flushPlainPasteBuffer();\n\t\t}, this.plainPasteFlushDelayMs);\n\t}\n\n\tprivate flushPlainPasteBuffer(): void {\n\t\tif (this.plainPasteFlushTimer) {\n\t\t\tclearTimeout(this.plainPasteFlushTimer);\n\t\t\tthis.plainPasteFlushTimer = undefined;\n\t\t}\n\t\tif (!this.plainPasteBuffer) return;\n\t\tconst payload = this.plainPasteBuffer;\n\t\tthis.plainPasteBuffer = \"\";\n\t\tsuper.handleInput(`\\x1b[200~${payload}\\x1b[201~`);\n\t}\n\n\tprivate rewritePasteMarker(line: string): string {\n\t\treturn line.replace(/\\[paste #(\\d+)( (\\+\\d+ lines|\\d+ chars))?\\]/gi, (_match, id: string, suffix?: string) => {\n\t\t\treturn `[Pasted text #${id}${suffix ?? \"\"}]`;\n\t\t});\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst lines = super.render(width);\n\t\treturn lines.map((line) => {\n\t\t\tconst rewritten = this.rewritePasteMarker(line);\n\t\t\tif (rewritten === line) return line;\n\t\t\t// Keep hard width guarantees after rewrite by trimming trailing visual width if needed.\n\t\t\tif (visibleWidth(rewritten) <= width) return rewritten;\n\t\t\treturn truncateToWidth(rewritten, width, \"\", true);\n\t\t});\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.isLikelyUnbracketedPasteChunk(data)) {\n\t\t\tthis.plainPasteBuffer += data.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n\t\t\tthis.schedulePlainPasteFlush();\n\t\t\treturn;\n\t\t}\n\t\t// If we buffered plain paste chunks, flush them before processing the next key.\n\t\tif (this.plainPasteBuffer) {\n\t\t\tthis.flushPlainPasteBuffer();\n\t\t}\n\n\t\t// Check extension-registered shortcuts first\n\t\tif (this.onExtensionShortcut?.(data)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check for paste image keybinding\n\t\tif (this.keybindings.matches(data, \"pasteImage\")) {\n\t\t\tthis.onPasteImage?.();\n\t\t\treturn;\n\t\t}\n\n\t\t// Check app keybindings first\n\n\t\t// Escape/interrupt - only if autocomplete is NOT active\n\t\tif (this.keybindings.matches(data, \"interrupt\")) {\n\t\t\tif (!this.isShowingAutocomplete()) {\n\t\t\t\t// Use dynamic onEscape if set, otherwise registered handler\n\t\t\t\tconst handler = this.onEscape ?? this.actionHandlers.get(\"interrupt\");\n\t\t\t\tif (handler) {\n\t\t\t\t\thandler();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Let parent handle escape for autocomplete cancellation\n\t\t\tsuper.handleInput(data);\n\t\t\treturn;\n\t\t}\n\n\t\t// Exit (Ctrl+D) - only when editor is empty\n\t\tif (this.keybindings.matches(data, \"exit\")) {\n\t\t\tif (this.getText().length === 0) {\n\t\t\t\tconst handler = this.onCtrlD ?? this.actionHandlers.get(\"exit\");\n\t\t\t\tif (handler) handler();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Fall through to editor handling for delete-char-forward when not empty\n\t\t}\n\n\t\t// Check all other app actions\n\t\tfor (const [action, handler] of this.actionHandlers) {\n\t\t\tif (action !== \"interrupt\" && action !== \"exit\" && this.keybindings.matches(data, action)) {\n\t\t\t\thandler();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Pass to parent for editor handling\n\t\tsuper.handleInput(data);\n\t}\n}\n"]}
|
|
@@ -16,6 +16,7 @@ export declare class LoginDialogComponent extends Container implements Focusable
|
|
|
16
16
|
constructor(tui: TUI, providerId: string, onComplete: (success: boolean, message?: string) => void);
|
|
17
17
|
get signal(): AbortSignal;
|
|
18
18
|
private cancel;
|
|
19
|
+
private tryOpenBrowser;
|
|
19
20
|
/**
|
|
20
21
|
* Called by onAuth callback - show URL and optional instructions
|
|
21
22
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAA6C,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAMtH;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IAqBtE,OAAO,CAAC,UAAU;IApBnB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAC,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAG/C,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EACV,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI;IAmCjE,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,OAAO,CAAC,MAAM;IAUd;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"login-dialog.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAA6C,KAAK,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAMtH;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IAqBtE,OAAO,CAAC,UAAU;IApBnB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAC,CAA0B;IAChD,OAAO,CAAC,aAAa,CAAC,CAAyB;IAG/C,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,EACV,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI;IAmCjE,IAAI,MAAM,IAAI,WAAW,CAExB;IAED,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBlD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAahD;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBlE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKnC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAW/B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getOAuthProviders } from "@mariozechner/pi-ai/oauth";
|
|
2
2
|
import { Container, getEditorKeybindings, Input, Spacer, Text } from "@mariozechner/pi-tui";
|
|
3
|
-
import {
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
4
|
import { theme } from "../theme/theme.js";
|
|
5
5
|
import { DynamicBorder } from "./dynamic-border.js";
|
|
6
6
|
import { keyHint } from "./keybinding-hints.js";
|
|
@@ -58,6 +58,31 @@ export class LoginDialogComponent extends Container {
|
|
|
58
58
|
}
|
|
59
59
|
this.onComplete(false, "Login cancelled");
|
|
60
60
|
}
|
|
61
|
+
tryOpenBrowser(url) {
|
|
62
|
+
const safeUrl = url.trim();
|
|
63
|
+
if (!safeUrl)
|
|
64
|
+
return;
|
|
65
|
+
const closeChild = (command, args) => {
|
|
66
|
+
const child = spawn(command, args, {
|
|
67
|
+
stdio: "ignore",
|
|
68
|
+
detached: true,
|
|
69
|
+
});
|
|
70
|
+
child.on("error", () => {
|
|
71
|
+
// best effort: hyperlink in TUI is still available for manual open
|
|
72
|
+
});
|
|
73
|
+
child.unref();
|
|
74
|
+
};
|
|
75
|
+
if (process.platform === "darwin") {
|
|
76
|
+
closeChild("open", [safeUrl]);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (process.platform === "win32") {
|
|
80
|
+
// Use cmd built-in `start` without interpolating user input into a shell string.
|
|
81
|
+
closeChild("cmd.exe", ["/d", "/s", "/c", "start", "", safeUrl]);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
closeChild("xdg-open", [safeUrl]);
|
|
85
|
+
}
|
|
61
86
|
/**
|
|
62
87
|
* Called by onAuth callback - show URL and optional instructions
|
|
63
88
|
*/
|
|
@@ -72,9 +97,7 @@ export class LoginDialogComponent extends Container {
|
|
|
72
97
|
this.contentContainer.addChild(new Spacer(1));
|
|
73
98
|
this.contentContainer.addChild(new Text(theme.fg("warning", instructions), 1, 0));
|
|
74
99
|
}
|
|
75
|
-
|
|
76
|
-
const openCmd = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
77
|
-
exec(`${openCmd} "${url}"`);
|
|
100
|
+
this.tryOpenBrowser(url);
|
|
78
101
|
this.tui.requestRender();
|
|
79
102
|
}
|
|
80
103
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAkB,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAY,MAAM,sBAAsB,CAAC;AACtH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAUlD,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED,YACC,GAAQ,EACR,UAAkB,EACV,UAAwD;QAEhE,KAAK,EAAE,CAAC;QAFA,eAAU,GAAV,UAAU,CAA8C;QAjBzD,oBAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAIhD,2EAA2E;QACnE,aAAQ,GAAG,KAAK,CAAC;QAexB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QAC1E,MAAM,YAAY,GAAG,YAAY,EAAE,IAAI,IAAI,UAAU,CAAC;QAEtD,aAAa;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,QAAQ;QACR,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/E,uBAAuB;QACvB,IAAI,CAAC,gBAAgB,GAAG,IAAI,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAErC,2CAA2C;QAC3C,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAChC,CAAC;QACF,CAAC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,CAAC,CAAC;QAEF,gBAAgB;QAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IACpC,CAAC;IAEO,MAAM;QACb,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW,EAAE,YAAqB;QAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC7F,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,SAAS,cAAc,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3E,IAAI,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,sBAAsB;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7G,IAAI,CAAC,GAAG,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAc;QAC7B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,OAAe,EAAE,WAAoB;QAC/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAC7B,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CACrG,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC7B,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,OAAe;QAC1B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe;QAC3B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAElC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO;QACR,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;CACD","sourcesContent":["import { getOAuthProviders } from \"@mariozechner/pi-ai/oauth\";\nimport { Container, type Focusable, getEditorKeybindings, Input, Spacer, Text, type TUI } from \"@mariozechner/pi-tui\";\nimport { exec } from \"child_process\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyHint } from \"./keybinding-hints.js\";\n\n/**\n * Login dialog component - replaces editor during OAuth login flow\n */\nexport class LoginDialogComponent extends Container implements Focusable {\n\tprivate contentContainer: Container;\n\tprivate input: Input;\n\tprivate tui: TUI;\n\tprivate abortController = new AbortController();\n\tprivate inputResolver?: (value: string) => void;\n\tprivate inputRejecter?: (error: Error) => void;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tproviderId: string,\n\t\tprivate onComplete: (success: boolean, message?: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.tui = tui;\n\n\t\tconst providerInfo = getOAuthProviders().find((p) => p.id === providerId);\n\t\tconst providerName = providerInfo?.name || providerId;\n\n\t\t// Top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.fg(\"warning\", `Login to ${providerName}`), 1, 0));\n\n\t\t// Dynamic content area\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\t// Input (always present, used when needed)\n\t\tthis.input = new Input();\n\t\tthis.input.onSubmit = () => {\n\t\t\tif (this.inputResolver) {\n\t\t\t\tthis.inputResolver(this.input.getValue());\n\t\t\t\tthis.inputResolver = undefined;\n\t\t\t\tthis.inputRejecter = undefined;\n\t\t\t}\n\t\t};\n\t\tthis.input.onEscape = () => {\n\t\t\tthis.cancel();\n\t\t};\n\n\t\t// Bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tget signal(): AbortSignal {\n\t\treturn this.abortController.signal;\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.abortController.abort();\n\t\tif (this.inputRejecter) {\n\t\t\tthis.inputRejecter(new Error(\"Login cancelled\"));\n\t\t\tthis.inputResolver = undefined;\n\t\t\tthis.inputRejecter = undefined;\n\t\t}\n\t\tthis.onComplete(false, \"Login cancelled\");\n\t}\n\n\t/**\n\t * Called by onAuth callback - show URL and optional instructions\n\t */\n\tshowAuth(url: string, instructions?: string): void {\n\t\tthis.contentContainer.clear();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", url), 1, 0));\n\n\t\tconst clickHint = process.platform === \"darwin\" ? \"Cmd+click to open\" : \"Ctrl+click to open\";\n\t\tconst hyperlink = `\\x1b]8;;${url}\\x07${clickHint}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", hyperlink), 1, 0));\n\n\t\tif (instructions) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", instructions), 1, 0));\n\t\t}\n\n\t\t// Try to open browser\n\t\tconst openCmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n\t\texec(`${openCmd} \"${url}\"`);\n\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Show input for manual code/URL entry (for callback server providers)\n\t */\n\tshowManualInput(prompt: string): Promise<string> {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", prompt), 1, 0));\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"selectCancel\", \"to cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/**\n\t * Called by onPrompt callback - show prompt and wait for input\n\t * Note: Does NOT clear content, appends to existing (preserves URL from showAuth)\n\t */\n\tshowPrompt(message: string, placeholder?: string): Promise<string> {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tif (placeholder) {\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", `e.g., ${placeholder}`), 1, 0));\n\t\t}\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(\n\t\t\tnew Text(`(${keyHint(\"selectCancel\", \"to cancel,\")} ${keyHint(\"selectConfirm\", \"to submit\")})`, 1, 0),\n\t\t);\n\n\t\tthis.input.setValue(\"\");\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/**\n\t * Show waiting message (for polling flows like GitHub Copilot)\n\t */\n\tshowWaiting(message: string): void {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"selectCancel\", \"to cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onProgress callback\n\t */\n\tshowProgress(message: string): void {\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getEditorKeybindings();\n\n\t\tif (kb.matches(data, \"selectCancel\")) {\n\t\t\tthis.cancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass to input\n\t\tthis.input.handleInput(data);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"login-dialog.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/login-dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { getOAuthProviders } from \"@mariozechner/pi-ai/oauth\";\nimport { Container, type Focusable, getEditorKeybindings, Input, Spacer, Text, type TUI } from \"@mariozechner/pi-tui\";\nimport { spawn } from \"node:child_process\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { keyHint } from \"./keybinding-hints.js\";\n\n/**\n * Login dialog component - replaces editor during OAuth login flow\n */\nexport class LoginDialogComponent extends Container implements Focusable {\n\tprivate contentContainer: Container;\n\tprivate input: Input;\n\tprivate tui: TUI;\n\tprivate abortController = new AbortController();\n\tprivate inputResolver?: (value: string) => void;\n\tprivate inputRejecter?: (error: Error) => void;\n\n\t// Focusable implementation - propagate to input for IME cursor positioning\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.input.focused = value;\n\t}\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tproviderId: string,\n\t\tprivate onComplete: (success: boolean, message?: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.tui = tui;\n\n\t\tconst providerInfo = getOAuthProviders().find((p) => p.id === providerId);\n\t\tconst providerName = providerInfo?.name || providerId;\n\n\t\t// Top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Title\n\t\tthis.addChild(new Text(theme.fg(\"warning\", `Login to ${providerName}`), 1, 0));\n\n\t\t// Dynamic content area\n\t\tthis.contentContainer = new Container();\n\t\tthis.addChild(this.contentContainer);\n\n\t\t// Input (always present, used when needed)\n\t\tthis.input = new Input();\n\t\tthis.input.onSubmit = () => {\n\t\t\tif (this.inputResolver) {\n\t\t\t\tthis.inputResolver(this.input.getValue());\n\t\t\t\tthis.inputResolver = undefined;\n\t\t\t\tthis.inputRejecter = undefined;\n\t\t\t}\n\t\t};\n\t\tthis.input.onEscape = () => {\n\t\t\tthis.cancel();\n\t\t};\n\n\t\t// Bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tget signal(): AbortSignal {\n\t\treturn this.abortController.signal;\n\t}\n\n\tprivate cancel(): void {\n\t\tthis.abortController.abort();\n\t\tif (this.inputRejecter) {\n\t\t\tthis.inputRejecter(new Error(\"Login cancelled\"));\n\t\t\tthis.inputResolver = undefined;\n\t\t\tthis.inputRejecter = undefined;\n\t\t}\n\t\tthis.onComplete(false, \"Login cancelled\");\n\t}\n\n\tprivate tryOpenBrowser(url: string): void {\n\t\tconst safeUrl = url.trim();\n\t\tif (!safeUrl) return;\n\t\tconst closeChild = (command: string, args: string[]): void => {\n\t\t\tconst child = spawn(command, args, {\n\t\t\t\tstdio: \"ignore\",\n\t\t\t\tdetached: true,\n\t\t\t});\n\t\t\tchild.on(\"error\", () => {\n\t\t\t\t// best effort: hyperlink in TUI is still available for manual open\n\t\t\t});\n\t\t\tchild.unref();\n\t\t};\n\t\tif (process.platform === \"darwin\") {\n\t\t\tcloseChild(\"open\", [safeUrl]);\n\t\t\treturn;\n\t\t}\n\t\tif (process.platform === \"win32\") {\n\t\t\t// Use cmd built-in `start` without interpolating user input into a shell string.\n\t\t\tcloseChild(\"cmd.exe\", [\"/d\", \"/s\", \"/c\", \"start\", \"\", safeUrl]);\n\t\t\treturn;\n\t\t}\n\t\tcloseChild(\"xdg-open\", [safeUrl]);\n\t}\n\n\t/**\n\t * Called by onAuth callback - show URL and optional instructions\n\t */\n\tshowAuth(url: string, instructions?: string): void {\n\t\tthis.contentContainer.clear();\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"accent\", url), 1, 0));\n\n\t\tconst clickHint = process.platform === \"darwin\" ? \"Cmd+click to open\" : \"Ctrl+click to open\";\n\t\tconst hyperlink = `\\x1b]8;;${url}\\x07${clickHint}\\x1b]8;;\\x07`;\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", hyperlink), 1, 0));\n\n\t\tif (instructions) {\n\t\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"warning\", instructions), 1, 0));\n\t\t}\n\n\t\tthis.tryOpenBrowser(url);\n\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Show input for manual code/URL entry (for callback server providers)\n\t */\n\tshowManualInput(prompt: string): Promise<string> {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", prompt), 1, 0));\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"selectCancel\", \"to cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/**\n\t * Called by onPrompt callback - show prompt and wait for input\n\t * Note: Does NOT clear content, appends to existing (preserves URL from showAuth)\n\t */\n\tshowPrompt(message: string, placeholder?: string): Promise<string> {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"text\", message), 1, 0));\n\t\tif (placeholder) {\n\t\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", `e.g., ${placeholder}`), 1, 0));\n\t\t}\n\t\tthis.contentContainer.addChild(this.input);\n\t\tthis.contentContainer.addChild(\n\t\t\tnew Text(`(${keyHint(\"selectCancel\", \"to cancel,\")} ${keyHint(\"selectConfirm\", \"to submit\")})`, 1, 0),\n\t\t);\n\n\t\tthis.input.setValue(\"\");\n\t\tthis.tui.requestRender();\n\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.inputResolver = resolve;\n\t\t\tthis.inputRejecter = reject;\n\t\t});\n\t}\n\n\t/**\n\t * Show waiting message (for polling flows like GitHub Copilot)\n\t */\n\tshowWaiting(message: string): void {\n\t\tthis.contentContainer.addChild(new Spacer(1));\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.contentContainer.addChild(new Text(`(${keyHint(\"selectCancel\", \"to cancel\")})`, 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\t/**\n\t * Called by onProgress callback\n\t */\n\tshowProgress(message: string): void {\n\t\tthis.contentContainer.addChild(new Text(theme.fg(\"dim\", message), 1, 0));\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleInput(data: string): void {\n\t\tconst kb = getEditorKeybindings();\n\n\t\tif (kb.matches(data, \"selectCancel\")) {\n\t\t\tthis.cancel();\n\t\t\treturn;\n\t\t}\n\n\t\t// Pass to input\n\t\tthis.input.handleInput(data);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAgB,MAAM,sBAAsB,CAAC;AAGzD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC5B,2FAA2F;IAC3F,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAChC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"subagent-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAgB,MAAM,sBAAsB,CAAC;AAGzD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAClF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC5B,2FAA2F;IAC3F,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IACrC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,mDAAmD;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAChC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8CAA8C;IAC9C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mDAAmD;IACnD,aAAa,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACvC;AAwJD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,wBAAyB,SAAQ,GAAG;gBACpC,IAAI,EAAE,YAAY;IAK9B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKvB,UAAU,IAAI,IAAI;IAI3B,OAAO,CAAC,aAAa;CAuJrB"}
|
|
@@ -25,6 +25,17 @@ function formatDuration(ms) {
|
|
|
25
25
|
const seconds = ((ms % 60_000) / 1000).toFixed(0);
|
|
26
26
|
return `${minutes}m ${seconds}s`;
|
|
27
27
|
}
|
|
28
|
+
function formatElapsedClock(ms) {
|
|
29
|
+
const totalSeconds = Math.max(0, Math.floor(ms / 1000));
|
|
30
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
31
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
32
|
+
const seconds = totalSeconds % 60;
|
|
33
|
+
const pad2 = (value) => value.toString().padStart(2, "0");
|
|
34
|
+
if (hours > 0) {
|
|
35
|
+
return `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;
|
|
36
|
+
}
|
|
37
|
+
return `${pad2(minutes)}:${pad2(seconds)}`;
|
|
38
|
+
}
|
|
28
39
|
function shortenPath(path) {
|
|
29
40
|
const home = homedir();
|
|
30
41
|
return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
|
|
@@ -195,6 +206,9 @@ export class SubagentMessageComponent extends Box {
|
|
|
195
206
|
if (info.agent) {
|
|
196
207
|
metadata.push(theme.fg("muted", `agent ${info.agent}`));
|
|
197
208
|
}
|
|
209
|
+
if (typeof info.durationMs === "number" && info.durationMs >= 0) {
|
|
210
|
+
metadata.push(theme.fg("muted", `elapsed ${formatElapsedClock(info.durationMs)}`));
|
|
211
|
+
}
|
|
198
212
|
if (info.isolation && info.isolation !== "none") {
|
|
199
213
|
metadata.push(theme.fg("muted", `iso ${info.isolation}`));
|
|
200
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { Box, Spacer, Text } from \"@mariozechner/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\n\nexport type SubagentPhaseState = \"queued\" | \"starting\" | \"running\" | \"responding\";\nexport type SubagentDelegateStatus = \"pending\" | \"running\" | \"done\" | \"failed\";\n\nexport interface SubagentDelegateItem {\n\tindex: number;\n\tdescription: string;\n\tprofile: string;\n\tstatus: SubagentDelegateStatus;\n}\n\nexport interface SubagentInfo {\n\t/** Human-readable description of the subagent's task, e.g. \"Exploring TypeScript files\" */\n\tdescription: string;\n\t/** Profile name, e.g. \"explore\" | \"plan\" | \"fix\" */\n\tprofile: string;\n\t/** Current lifecycle state of the subagent */\n\tstatus: \"running\" | \"done\" | \"error\";\n\t/** Byte length of the subagent's output, populated when status is \"done\" */\n\toutputLength?: number;\n\t/** Wall-clock elapsed time in milliseconds, populated when status is \"done\" */\n\tdurationMs?: number;\n\t/** Error message, populated when status is \"error\" */\n\terrorMessage?: string;\n\t/** Current phase summary for in-progress work */\n\tphase?: string;\n\t/** Current phase state in the execution timeline */\n\tphaseState?: SubagentPhaseState;\n\t/** Effective working directory for the subagent */\n\tcwd?: string;\n\t/** Optional custom agent label */\n\tagent?: string;\n\t/** Optional lock domain key */\n\tlockKey?: string;\n\t/** Isolation mode for this run */\n\tisolation?: \"none\" | \"worktree\";\n\t/** Current active subagent tool (e.g. read, bash, write) */\n\tactiveTool?: string;\n\t/** Number of subagent tool calls started */\n\ttoolCallsStarted?: number;\n\t/** Number of subagent tool calls completed */\n\ttoolCallsCompleted?: number;\n\t/** Number of assistant messages produced inside subagent */\n\tassistantMessages?: number;\n\t/** Queue delay before execution started (ms) */\n\twaitMs?: number;\n\t/** Number of delegated child subtasks launched by this subagent */\n\tdelegatedTasks?: number;\n\t/** Number of delegated child subtasks finished successfully */\n\tdelegatedSucceeded?: number;\n\t/** Number of delegated child subtasks that failed */\n\tdelegatedFailed?: number;\n\t/** Currently active delegated subtask index (1-based) */\n\tdelegateIndex?: number;\n\t/** Total delegated subtasks in the current batch */\n\tdelegateTotal?: number;\n\t/** Currently active delegated subtask description */\n\tdelegateDescription?: string;\n\t/** Currently active delegated subtask profile */\n\tdelegateProfile?: string;\n\t/** Delegate task mini-list with per-item status */\n\tdelegateItems?: SubagentDelegateItem[];\n}\n\ntype DelegateSummary = {\n\ttotal: number;\n\tdone: number;\n\tfailed: number;\n\trunning: number;\n\tpending: number;\n};\n\n/**\n * Format a byte count as a compact human-readable string.\n * Mirrors the formatting conventions used elsewhere in the footer (k/M suffixes).\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Format a millisecond duration as a compact human-readable string.\n * Keeps the unit explicit so users can immediately scan the value at a glance.\n */\nfunction formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n\tconst minutes = Math.floor(ms / 60_000);\n\tconst seconds = ((ms % 60_000) / 1000).toFixed(0);\n\treturn `${minutes}m ${seconds}s`;\n}\n\nfunction shortenPath(path: string): string {\n\tconst home = homedir();\n\treturn path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n}\n\nfunction formatToolProgress(started?: number, completed?: number): string | undefined {\n\tif (typeof started !== \"number\" || started < 0) return undefined;\n\tif (typeof completed === \"number\" && completed >= 0) {\n\t\treturn `tools ${completed}/${started}`;\n\t}\n\treturn `tools ${started}`;\n}\n\nfunction formatSubagentBadge(agent?: string): string {\n\tif (typeof agent !== \"string\") return \"[subagent]\";\n\tconst normalized = agent.trim();\n\tif (!normalized) return \"[subagent]\";\n\treturn `[subagent:${normalized}]`;\n}\n\nfunction renderPhaseTimeline(phaseState: SubagentPhaseState): string {\n\tconst phases: SubagentPhaseState[] = [\"queued\", \"starting\", \"running\", \"responding\"];\n\tconst currentIndex = phases.indexOf(phaseState);\n\tif (currentIndex < 0) return \"\";\n\n\tconst segments = phases.map((phase, index) => {\n\t\tconst marker = index < currentIndex ? \"[x]\" : index === currentIndex ? \"[>]\" : \"[ ]\";\n\t\tconst text = `${marker} ${phase}`;\n\t\tif (index < currentIndex) return theme.fg(\"success\", text);\n\t\tif (index === currentIndex) return theme.fg(\"accent\", text);\n\t\treturn theme.fg(\"muted\", text);\n\t});\n\treturn `${theme.fg(\"muted\", \"flow\")} ${segments.join(theme.fg(\"dim\", \" -> \"))}`;\n}\n\nfunction summarizeDelegates(info: SubagentInfo): DelegateSummary | undefined {\n\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\tlet done = 0;\n\t\tlet failed = 0;\n\t\tlet running = 0;\n\t\tlet pending = 0;\n\t\tfor (const item of info.delegateItems) {\n\t\t\tswitch (item.status) {\n\t\t\t\tcase \"done\":\n\t\t\t\t\tdone += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tfailed += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"running\":\n\t\t\t\t\trunning += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpending += 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn { total: info.delegateItems.length, done, failed, running, pending };\n\t}\n\tif (typeof info.delegatedTasks === \"number\" && info.delegatedTasks > 0) {\n\t\tconst total = info.delegatedTasks;\n\t\tconst done = typeof info.delegatedSucceeded === \"number\" ? Math.max(0, info.delegatedSucceeded) : 0;\n\t\tconst failed = typeof info.delegatedFailed === \"number\" ? Math.max(0, info.delegatedFailed) : 0;\n\t\tconst running = Math.max(0, total - done - failed);\n\t\tconst pending = 0;\n\t\treturn { total, done, failed, running, pending };\n\t}\n\treturn undefined;\n}\n\nfunction formatDelegateSummary(summary: DelegateSummary): string {\n\tconst parts: string[] = [`delegates ${summary.done}/${summary.total} done`];\n\tif (summary.failed > 0) {\n\t\tparts.push(`${summary.failed} failed`);\n\t}\n\tif (summary.running > 0) {\n\t\tparts.push(`${summary.running} running`);\n\t}\n\treturn parts.join(\", \");\n}\n\nfunction selectDelegateItemsForDisplay(items: SubagentDelegateItem[]): {\n\tvisibleItems: SubagentDelegateItem[];\n\tcompacted: boolean;\n\thiddenDonePending: number;\n\toverflow: number;\n} {\n\tconst compactThreshold = 6;\n\tconst maxRows = 5;\n\tif (items.length > compactThreshold) {\n\t\tconst critical = items.filter((item) => item.status === \"running\" || item.status === \"failed\");\n\t\tconst visibleItems = critical.slice(0, maxRows);\n\t\treturn {\n\t\t\tvisibleItems,\n\t\t\tcompacted: true,\n\t\t\thiddenDonePending: Math.max(0, items.length - critical.length),\n\t\t\toverflow: Math.max(0, critical.length - visibleItems.length),\n\t\t};\n\t}\n\tconst visibleItems = items.slice(0, maxRows);\n\treturn {\n\t\tvisibleItems,\n\t\tcompacted: false,\n\t\thiddenDonePending: 0,\n\t\toverflow: Math.max(0, items.length - visibleItems.length),\n\t};\n}\n\n/**\n * Component that surfaces a running or completed subagent (task tool invocation).\n *\n * Visual structure\n * ----------------\n * Line 1 (header): [subagent] <profile> · <description>\n * Line 2 (status):\n * running → ... <phase>\n * @ <cwd> · tool <active> · tools <done>/<started>\n * delegates <done>/<total> done, <failed> failed\n * delegate <i>/<n> · <description> · (<profile>)\n * delegates list with status markers (compact mode on large runs)\n * flow [x] queued -> [>] running -> [ ] responding\n * done → + <outputSize> output, <duration>, tools <done>/<started>, queue <wait>\n * error → x <errorMessage or \"error\">\n *\n * Theming follows the customMessage palette so the block sits visually alongside\n * other agent-injected messages (task plan, skill invocation, custom messages).\n */\nexport class SubagentMessageComponent extends Box {\n\tconstructor(info: SubagentInfo) {\n\t\tsuper(1, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\tthis.renderContent(info);\n\t}\n\n\t/**\n\t * Replace the rendered content with updated subagent info.\n\t * Call this whenever status, outputLength, durationMs, or errorMessage changes.\n\t */\n\tupdate(info: SubagentInfo): void {\n\t\tthis.clear();\n\t\tthis.renderContent(info);\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t}\n\n\tprivate renderContent(info: SubagentInfo): void {\n\t\t// --- Header line ---\n\t\t// [subagent] or [subagent:<agent>] <profile> · <description>\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m${formatSubagentBadge(info.agent)}\\x1b[22m`);\n\t\tconst profileBadge = theme.fg(\"accent\", info.profile);\n\t\tconst dot = theme.fg(\"dim\", \" \\u00B7 \"); // middle dot separator\n\t\tconst description = theme.fg(\"customMessageText\", info.description);\n\t\tthis.addChild(new Text(`${label} ${profileBadge}${dot}${description}`, 0, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// --- Status line ---\n\t\tswitch (info.status) {\n\t\t\t\tcase \"running\": {\n\t\t\t\t// Ellipsis prefix signals in-progress work without a spinner dependency\n\t\t\t\tconst indicator = theme.fg(\"accent\", \"...\");\n\t\t\t\tconst phase = info.phase?.trim() ? info.phase.trim() : \"running\";\n\t\t\t\tconst statusText = theme.fg(\"muted\", ` ${phase}`);\n\t\t\t\tthis.addChild(new Text(`${indicator}${statusText}`, 0, 0));\n\n\t\t\t\tconst metadata: string[] = [];\n\t\t\t\tif (info.cwd) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `@ ${shortenPath(info.cwd)}`));\n\t\t\t\t}\n\t\t\t\tif (info.activeTool) {\n\t\t\t\t\tmetadata.push(theme.fg(\"customMessageText\", `tool ${info.activeTool}`));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\tif (typeof info.assistantMessages === \"number\" && info.assistantMessages > 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `msgs ${info.assistantMessages}`));\n\t\t\t\t}\n\t\t\t\tif (info.agent) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `agent ${info.agent}`));\n\t\t\t\t}\n\t\t\t\tif (info.isolation && info.isolation !== \"none\") {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `iso ${info.isolation}`));\n\t\t\t\t}\n\t\t\t\t\tif (info.lockKey) {\n\t\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `lock ${info.lockKey}`));\n\t\t\t\t\t}\n\t\t\t\t\tif (metadata.length > 0) {\n\t\t\t\t\t\tthis.addChild(new Text(metadata.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"accent\", formatDelegateSummary(delegateSummary)), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof info.delegateIndex === \"number\" && info.delegateIndex > 0) {\n\t\t\t\t\t\tconst delegateTotal =\n\t\t\t\t\t\t\ttypeof info.delegateTotal === \"number\" && info.delegateTotal > 0\n\t\t\t\t\t\t\t\t? info.delegateTotal\n\t\t\t\t\t\t\t\t: info.delegateIndex;\n\t\t\t\t\t\tconst delegateParts: string[] = [theme.fg(\"accent\", `delegate ${info.delegateIndex}/${delegateTotal}`)];\n\t\t\t\t\t\tif (typeof info.delegateDescription === \"string\" && info.delegateDescription.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"customMessageText\", info.delegateDescription.trim()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof info.delegateProfile === \"string\" && info.delegateProfile.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"muted\", `(${info.delegateProfile.trim()})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(delegateParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\t\t\t\t\tconst selected = selectDelegateItemsForDisplay(info.delegateItems);\n\t\t\t\t\t\tconst headerParts = [theme.fg(\"muted\", \"delegates\")];\n\t\t\t\t\t\tif (selected.compacted) {\n\t\t\t\t\t\t\theaderParts.push(theme.fg(\"accent\", \"compact\"));\n\t\t\t\t\t\t\tif (selected.hiddenDonePending > 0) {\n\t\t\t\t\t\t\t\theaderParts.push(theme.fg(\"muted\", `hidden ${selected.hiddenDonePending} done/pending`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(headerParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t\tif (selected.visibleItems.length === 0 && selected.compacted) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"no running/failed delegates\"), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of selected.visibleItems) {\n\t\t\t\t\t\t\tconst marker = (() => {\n\t\t\t\t\t\t\t\tswitch (item.status) {\n\t\t\t\t\t\t\t\t\tcase \"done\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"success\", \"[x]\");\n\t\t\t\t\t\t\t\t\tcase \"running\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"accent\", \"[>]\");\n\t\t\t\t\t\t\t\t\tcase \"failed\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"warning\", \"[!]\");\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"muted\", \"[ ]\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})();\n\t\t\t\t\t\t\tconst label = `${item.index}. ${item.description} (${item.profile})`;\n\t\t\t\t\t\t\tconst textColor =\n\t\t\t\t\t\t\t\titem.status === \"done\"\n\t\t\t\t\t\t\t\t\t? \"muted\"\n\t\t\t\t\t\t\t\t\t: item.status === \"running\"\n\t\t\t\t\t\t\t\t\t\t? \"customMessageText\"\n\t\t\t\t\t\t\t\t\t\t: item.status === \"failed\"\n\t\t\t\t\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t\t\t\t\t: \"muted\";\n\t\t\t\t\t\t\tthis.addChild(new Text(`${marker} ${theme.fg(textColor, label)}`, 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (selected.overflow > 0) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `... +${selected.overflow} more`), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (info.phaseState) {\n\t\t\t\t\t\tthis.addChild(new Text(renderPhaseTimeline(info.phaseState), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"done\": {\n\t\t\t\tconst checkmark = theme.fg(\"success\", \"+\");\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (info.outputLength !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"customMessageText\", formatBytes(info.outputLength)) + theme.fg(\"muted\", \" output\"));\n\t\t\t\t}\n\t\t\t\tif (info.durationMs !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", formatDuration(info.durationMs)));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tparts.push(theme.fg(\"muted\", `delegates ${delegateSummary.done}/${delegateSummary.total} done`));\n\t\t\t\t\t\tif (delegateSummary.failed > 0) {\n\t\t\t\t\t\t\tparts.push(theme.fg(\"warning\", `${delegateSummary.failed} failed`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tif (typeof info.waitMs === \"number\" && info.waitMs > 0) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", `queue ${formatDuration(info.waitMs)}`));\n\t\t\t\t}\n\t\t\t\tconst detail = parts.length > 0 ? \" \" + parts.join(theme.fg(\"dim\", \", \")) : \"\";\n\t\t\t\tthis.addChild(new Text(`${checkmark}${detail}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst cross = theme.fg(\"error\", \"x\");\n\t\t\t\tconst message = info.errorMessage ? info.errorMessage : \"error\";\n\t\t\t\tconst errorText = theme.fg(\"error\", ` ${message}`);\n\t\t\t\tthis.addChild(new Text(`${cross}${errorText}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/subagent-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { Box, Spacer, Text } from \"@mariozechner/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\n\nexport type SubagentPhaseState = \"queued\" | \"starting\" | \"running\" | \"responding\";\nexport type SubagentDelegateStatus = \"pending\" | \"running\" | \"done\" | \"failed\";\n\nexport interface SubagentDelegateItem {\n\tindex: number;\n\tdescription: string;\n\tprofile: string;\n\tstatus: SubagentDelegateStatus;\n}\n\nexport interface SubagentInfo {\n\t/** Human-readable description of the subagent's task, e.g. \"Exploring TypeScript files\" */\n\tdescription: string;\n\t/** Profile name, e.g. \"explore\" | \"plan\" | \"fix\" */\n\tprofile: string;\n\t/** Current lifecycle state of the subagent */\n\tstatus: \"running\" | \"done\" | \"error\";\n\t/** Byte length of the subagent's output, populated when status is \"done\" */\n\toutputLength?: number;\n\t/** Wall-clock elapsed time in milliseconds, populated when status is \"done\" */\n\tdurationMs?: number;\n\t/** Error message, populated when status is \"error\" */\n\terrorMessage?: string;\n\t/** Current phase summary for in-progress work */\n\tphase?: string;\n\t/** Current phase state in the execution timeline */\n\tphaseState?: SubagentPhaseState;\n\t/** Effective working directory for the subagent */\n\tcwd?: string;\n\t/** Optional custom agent label */\n\tagent?: string;\n\t/** Optional lock domain key */\n\tlockKey?: string;\n\t/** Isolation mode for this run */\n\tisolation?: \"none\" | \"worktree\";\n\t/** Current active subagent tool (e.g. read, bash, write) */\n\tactiveTool?: string;\n\t/** Number of subagent tool calls started */\n\ttoolCallsStarted?: number;\n\t/** Number of subagent tool calls completed */\n\ttoolCallsCompleted?: number;\n\t/** Number of assistant messages produced inside subagent */\n\tassistantMessages?: number;\n\t/** Queue delay before execution started (ms) */\n\twaitMs?: number;\n\t/** Number of delegated child subtasks launched by this subagent */\n\tdelegatedTasks?: number;\n\t/** Number of delegated child subtasks finished successfully */\n\tdelegatedSucceeded?: number;\n\t/** Number of delegated child subtasks that failed */\n\tdelegatedFailed?: number;\n\t/** Currently active delegated subtask index (1-based) */\n\tdelegateIndex?: number;\n\t/** Total delegated subtasks in the current batch */\n\tdelegateTotal?: number;\n\t/** Currently active delegated subtask description */\n\tdelegateDescription?: string;\n\t/** Currently active delegated subtask profile */\n\tdelegateProfile?: string;\n\t/** Delegate task mini-list with per-item status */\n\tdelegateItems?: SubagentDelegateItem[];\n}\n\ntype DelegateSummary = {\n\ttotal: number;\n\tdone: number;\n\tfailed: number;\n\trunning: number;\n\tpending: number;\n};\n\n/**\n * Format a byte count as a compact human-readable string.\n * Mirrors the formatting conventions used elsewhere in the footer (k/M suffixes).\n */\nfunction formatBytes(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\n/**\n * Format a millisecond duration as a compact human-readable string.\n * Keeps the unit explicit so users can immediately scan the value at a glance.\n */\nfunction formatDuration(ms: number): string {\n\tif (ms < 1000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n\tconst minutes = Math.floor(ms / 60_000);\n\tconst seconds = ((ms % 60_000) / 1000).toFixed(0);\n\treturn `${minutes}m ${seconds}s`;\n}\n\nfunction formatElapsedClock(ms: number): string {\n\tconst totalSeconds = Math.max(0, Math.floor(ms / 1000));\n\tconst hours = Math.floor(totalSeconds / 3600);\n\tconst minutes = Math.floor((totalSeconds % 3600) / 60);\n\tconst seconds = totalSeconds % 60;\n\tconst pad2 = (value: number): string => value.toString().padStart(2, \"0\");\n\tif (hours > 0) {\n\t\treturn `${pad2(hours)}:${pad2(minutes)}:${pad2(seconds)}`;\n\t}\n\treturn `${pad2(minutes)}:${pad2(seconds)}`;\n}\n\nfunction shortenPath(path: string): string {\n\tconst home = homedir();\n\treturn path.startsWith(home) ? `~${path.slice(home.length)}` : path;\n}\n\nfunction formatToolProgress(started?: number, completed?: number): string | undefined {\n\tif (typeof started !== \"number\" || started < 0) return undefined;\n\tif (typeof completed === \"number\" && completed >= 0) {\n\t\treturn `tools ${completed}/${started}`;\n\t}\n\treturn `tools ${started}`;\n}\n\nfunction formatSubagentBadge(agent?: string): string {\n\tif (typeof agent !== \"string\") return \"[subagent]\";\n\tconst normalized = agent.trim();\n\tif (!normalized) return \"[subagent]\";\n\treturn `[subagent:${normalized}]`;\n}\n\nfunction renderPhaseTimeline(phaseState: SubagentPhaseState): string {\n\tconst phases: SubagentPhaseState[] = [\"queued\", \"starting\", \"running\", \"responding\"];\n\tconst currentIndex = phases.indexOf(phaseState);\n\tif (currentIndex < 0) return \"\";\n\n\tconst segments = phases.map((phase, index) => {\n\t\tconst marker = index < currentIndex ? \"[x]\" : index === currentIndex ? \"[>]\" : \"[ ]\";\n\t\tconst text = `${marker} ${phase}`;\n\t\tif (index < currentIndex) return theme.fg(\"success\", text);\n\t\tif (index === currentIndex) return theme.fg(\"accent\", text);\n\t\treturn theme.fg(\"muted\", text);\n\t});\n\treturn `${theme.fg(\"muted\", \"flow\")} ${segments.join(theme.fg(\"dim\", \" -> \"))}`;\n}\n\nfunction summarizeDelegates(info: SubagentInfo): DelegateSummary | undefined {\n\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\tlet done = 0;\n\t\tlet failed = 0;\n\t\tlet running = 0;\n\t\tlet pending = 0;\n\t\tfor (const item of info.delegateItems) {\n\t\t\tswitch (item.status) {\n\t\t\t\tcase \"done\":\n\t\t\t\t\tdone += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tfailed += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"running\":\n\t\t\t\t\trunning += 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tpending += 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn { total: info.delegateItems.length, done, failed, running, pending };\n\t}\n\tif (typeof info.delegatedTasks === \"number\" && info.delegatedTasks > 0) {\n\t\tconst total = info.delegatedTasks;\n\t\tconst done = typeof info.delegatedSucceeded === \"number\" ? Math.max(0, info.delegatedSucceeded) : 0;\n\t\tconst failed = typeof info.delegatedFailed === \"number\" ? Math.max(0, info.delegatedFailed) : 0;\n\t\tconst running = Math.max(0, total - done - failed);\n\t\tconst pending = 0;\n\t\treturn { total, done, failed, running, pending };\n\t}\n\treturn undefined;\n}\n\nfunction formatDelegateSummary(summary: DelegateSummary): string {\n\tconst parts: string[] = [`delegates ${summary.done}/${summary.total} done`];\n\tif (summary.failed > 0) {\n\t\tparts.push(`${summary.failed} failed`);\n\t}\n\tif (summary.running > 0) {\n\t\tparts.push(`${summary.running} running`);\n\t}\n\treturn parts.join(\", \");\n}\n\nfunction selectDelegateItemsForDisplay(items: SubagentDelegateItem[]): {\n\tvisibleItems: SubagentDelegateItem[];\n\tcompacted: boolean;\n\thiddenDonePending: number;\n\toverflow: number;\n} {\n\tconst compactThreshold = 6;\n\tconst maxRows = 5;\n\tif (items.length > compactThreshold) {\n\t\tconst critical = items.filter((item) => item.status === \"running\" || item.status === \"failed\");\n\t\tconst visibleItems = critical.slice(0, maxRows);\n\t\treturn {\n\t\t\tvisibleItems,\n\t\t\tcompacted: true,\n\t\t\thiddenDonePending: Math.max(0, items.length - critical.length),\n\t\t\toverflow: Math.max(0, critical.length - visibleItems.length),\n\t\t};\n\t}\n\tconst visibleItems = items.slice(0, maxRows);\n\treturn {\n\t\tvisibleItems,\n\t\tcompacted: false,\n\t\thiddenDonePending: 0,\n\t\toverflow: Math.max(0, items.length - visibleItems.length),\n\t};\n}\n\n/**\n * Component that surfaces a running or completed subagent (task tool invocation).\n *\n * Visual structure\n * ----------------\n * Line 1 (header): [subagent] <profile> · <description>\n * Line 2 (status):\n * running → ... <phase>\n * @ <cwd> · tool <active> · tools <done>/<started>\n * delegates <done>/<total> done, <failed> failed\n * delegate <i>/<n> · <description> · (<profile>)\n * delegates list with status markers (compact mode on large runs)\n * flow [x] queued -> [>] running -> [ ] responding\n * done → + <outputSize> output, <duration>, tools <done>/<started>, queue <wait>\n * error → x <errorMessage or \"error\">\n *\n * Theming follows the customMessage palette so the block sits visually alongside\n * other agent-injected messages (task plan, skill invocation, custom messages).\n */\nexport class SubagentMessageComponent extends Box {\n\tconstructor(info: SubagentInfo) {\n\t\tsuper(1, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\tthis.renderContent(info);\n\t}\n\n\t/**\n\t * Replace the rendered content with updated subagent info.\n\t * Call this whenever status, outputLength, durationMs, or errorMessage changes.\n\t */\n\tupdate(info: SubagentInfo): void {\n\t\tthis.clear();\n\t\tthis.renderContent(info);\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t}\n\n\tprivate renderContent(info: SubagentInfo): void {\n\t\t// --- Header line ---\n\t\t// [subagent] or [subagent:<agent>] <profile> · <description>\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m${formatSubagentBadge(info.agent)}\\x1b[22m`);\n\t\tconst profileBadge = theme.fg(\"accent\", info.profile);\n\t\tconst dot = theme.fg(\"dim\", \" \\u00B7 \"); // middle dot separator\n\t\tconst description = theme.fg(\"customMessageText\", info.description);\n\t\tthis.addChild(new Text(`${label} ${profileBadge}${dot}${description}`, 0, 0));\n\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// --- Status line ---\n\t\tswitch (info.status) {\n\t\t\t\tcase \"running\": {\n\t\t\t\t// Ellipsis prefix signals in-progress work without a spinner dependency\n\t\t\t\tconst indicator = theme.fg(\"accent\", \"...\");\n\t\t\t\tconst phase = info.phase?.trim() ? info.phase.trim() : \"running\";\n\t\t\t\tconst statusText = theme.fg(\"muted\", ` ${phase}`);\n\t\t\t\tthis.addChild(new Text(`${indicator}${statusText}`, 0, 0));\n\n\t\t\t\tconst metadata: string[] = [];\n\t\t\t\tif (info.cwd) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `@ ${shortenPath(info.cwd)}`));\n\t\t\t\t}\n\t\t\t\tif (info.activeTool) {\n\t\t\t\t\tmetadata.push(theme.fg(\"customMessageText\", `tool ${info.activeTool}`));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\tif (typeof info.assistantMessages === \"number\" && info.assistantMessages > 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `msgs ${info.assistantMessages}`));\n\t\t\t\t}\n\t\t\t\tif (info.agent) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `agent ${info.agent}`));\n\t\t\t\t}\n\t\t\t\tif (typeof info.durationMs === \"number\" && info.durationMs >= 0) {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `elapsed ${formatElapsedClock(info.durationMs)}`));\n\t\t\t\t}\n\t\t\t\tif (info.isolation && info.isolation !== \"none\") {\n\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `iso ${info.isolation}`));\n\t\t\t\t}\n\t\t\t\t\tif (info.lockKey) {\n\t\t\t\t\t\tmetadata.push(theme.fg(\"muted\", `lock ${info.lockKey}`));\n\t\t\t\t\t}\n\t\t\t\t\tif (metadata.length > 0) {\n\t\t\t\t\t\tthis.addChild(new Text(metadata.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"accent\", formatDelegateSummary(delegateSummary)), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof info.delegateIndex === \"number\" && info.delegateIndex > 0) {\n\t\t\t\t\t\tconst delegateTotal =\n\t\t\t\t\t\t\ttypeof info.delegateTotal === \"number\" && info.delegateTotal > 0\n\t\t\t\t\t\t\t\t? info.delegateTotal\n\t\t\t\t\t\t\t\t: info.delegateIndex;\n\t\t\t\t\t\tconst delegateParts: string[] = [theme.fg(\"accent\", `delegate ${info.delegateIndex}/${delegateTotal}`)];\n\t\t\t\t\t\tif (typeof info.delegateDescription === \"string\" && info.delegateDescription.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"customMessageText\", info.delegateDescription.trim()));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof info.delegateProfile === \"string\" && info.delegateProfile.trim().length > 0) {\n\t\t\t\t\t\t\tdelegateParts.push(theme.fg(\"muted\", `(${info.delegateProfile.trim()})`));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(delegateParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(info.delegateItems) && info.delegateItems.length > 0) {\n\t\t\t\t\t\tconst selected = selectDelegateItemsForDisplay(info.delegateItems);\n\t\t\t\t\t\tconst headerParts = [theme.fg(\"muted\", \"delegates\")];\n\t\t\t\t\t\tif (selected.compacted) {\n\t\t\t\t\t\t\theaderParts.push(theme.fg(\"accent\", \"compact\"));\n\t\t\t\t\t\t\tif (selected.hiddenDonePending > 0) {\n\t\t\t\t\t\t\t\theaderParts.push(theme.fg(\"muted\", `hidden ${selected.hiddenDonePending} done/pending`));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.addChild(new Text(headerParts.join(theme.fg(\"dim\", \" \\u00B7 \")), 0, 0));\n\t\t\t\t\t\tif (selected.visibleItems.length === 0 && selected.compacted) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", \"no running/failed delegates\"), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (const item of selected.visibleItems) {\n\t\t\t\t\t\t\tconst marker = (() => {\n\t\t\t\t\t\t\t\tswitch (item.status) {\n\t\t\t\t\t\t\t\t\tcase \"done\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"success\", \"[x]\");\n\t\t\t\t\t\t\t\t\tcase \"running\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"accent\", \"[>]\");\n\t\t\t\t\t\t\t\t\tcase \"failed\":\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"warning\", \"[!]\");\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\treturn theme.fg(\"muted\", \"[ ]\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})();\n\t\t\t\t\t\t\tconst label = `${item.index}. ${item.description} (${item.profile})`;\n\t\t\t\t\t\t\tconst textColor =\n\t\t\t\t\t\t\t\titem.status === \"done\"\n\t\t\t\t\t\t\t\t\t? \"muted\"\n\t\t\t\t\t\t\t\t\t: item.status === \"running\"\n\t\t\t\t\t\t\t\t\t\t? \"customMessageText\"\n\t\t\t\t\t\t\t\t\t\t: item.status === \"failed\"\n\t\t\t\t\t\t\t\t\t\t\t? \"warning\"\n\t\t\t\t\t\t\t\t\t\t\t: \"muted\";\n\t\t\t\t\t\t\tthis.addChild(new Text(`${marker} ${theme.fg(textColor, label)}`, 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (selected.overflow > 0) {\n\t\t\t\t\t\t\tthis.addChild(new Text(theme.fg(\"muted\", `... +${selected.overflow} more`), 0, 0));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (info.phaseState) {\n\t\t\t\t\t\tthis.addChild(new Text(renderPhaseTimeline(info.phaseState), 0, 0));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"done\": {\n\t\t\t\tconst checkmark = theme.fg(\"success\", \"+\");\n\t\t\t\tconst parts: string[] = [];\n\t\t\t\tif (info.outputLength !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"customMessageText\", formatBytes(info.outputLength)) + theme.fg(\"muted\", \" output\"));\n\t\t\t\t}\n\t\t\t\tif (info.durationMs !== undefined) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", formatDuration(info.durationMs)));\n\t\t\t\t}\n\t\t\t\tconst toolProgress = formatToolProgress(info.toolCallsStarted, info.toolCallsCompleted);\n\t\t\t\tif (toolProgress) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", toolProgress));\n\t\t\t\t}\n\t\t\t\t\tconst delegateSummary = summarizeDelegates(info);\n\t\t\t\t\tif (delegateSummary) {\n\t\t\t\t\t\tparts.push(theme.fg(\"muted\", `delegates ${delegateSummary.done}/${delegateSummary.total} done`));\n\t\t\t\t\t\tif (delegateSummary.failed > 0) {\n\t\t\t\t\t\t\tparts.push(theme.fg(\"warning\", `${delegateSummary.failed} failed`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tif (typeof info.waitMs === \"number\" && info.waitMs > 0) {\n\t\t\t\t\tparts.push(theme.fg(\"muted\", `queue ${formatDuration(info.waitMs)}`));\n\t\t\t\t}\n\t\t\t\tconst detail = parts.length > 0 ? \" \" + parts.join(theme.fg(\"dim\", \", \")) : \"\";\n\t\t\t\tthis.addChild(new Text(`${checkmark}${detail}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"error\": {\n\t\t\t\tconst cross = theme.fg(\"error\", \"x\");\n\t\t\t\tconst message = info.errorMessage ? info.errorMessage : \"error\";\n\t\t\t\tconst errorText = theme.fg(\"error\", ` ${message}`);\n\t\t\t\tthis.addChild(new Text(`${cross}${errorText}`, 0, 0));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -50,11 +50,16 @@ export declare class InteractiveMode {
|
|
|
50
50
|
private pendingWorkingMessage;
|
|
51
51
|
private readonly defaultWorkingMessage;
|
|
52
52
|
private activeProfileName;
|
|
53
|
+
private profilePromptSuffix;
|
|
53
54
|
private permissionMode;
|
|
54
55
|
private permissionAllowRules;
|
|
55
56
|
private permissionDenyRules;
|
|
56
57
|
private permissionPromptLock;
|
|
57
58
|
private sessionAllowedToolSignatures;
|
|
59
|
+
private contractService;
|
|
60
|
+
private singularService;
|
|
61
|
+
private singularLastEffectiveContract;
|
|
62
|
+
private swarmActiveRunId;
|
|
58
63
|
private lastSigintTime;
|
|
59
64
|
private lastEscapeTime;
|
|
60
65
|
private changelogMarkdown;
|
|
@@ -64,6 +69,7 @@ export declare class InteractiveMode {
|
|
|
64
69
|
private streamingMessage;
|
|
65
70
|
private pendingTools;
|
|
66
71
|
private subagentComponents;
|
|
72
|
+
private subagentElapsedTimer;
|
|
67
73
|
private pendingInternalUserDisplayAliases;
|
|
68
74
|
private pendingAssistantOrchestrationContexts;
|
|
69
75
|
private activeAssistantOrchestrationContext;
|
|
@@ -83,6 +89,7 @@ export declare class InteractiveMode {
|
|
|
83
89
|
private shutdownRequested;
|
|
84
90
|
private iosmAutomationRun;
|
|
85
91
|
private iosmVerificationSession;
|
|
92
|
+
private singularAnalysisSession;
|
|
86
93
|
private extensionSelector;
|
|
87
94
|
private extensionInput;
|
|
88
95
|
private extensionEditor;
|
|
@@ -100,6 +107,9 @@ export declare class InteractiveMode {
|
|
|
100
107
|
private get sessionManager();
|
|
101
108
|
private get settingsManager();
|
|
102
109
|
constructor(session: AgentSession, options?: InteractiveModeOptions);
|
|
110
|
+
private syncRuntimePromptSuffix;
|
|
111
|
+
private getContractStateSafe;
|
|
112
|
+
private getProfileToolNames;
|
|
103
113
|
private getToolPermissionSignature;
|
|
104
114
|
private matchesPermissionRule;
|
|
105
115
|
private withPermissionDialogLock;
|
|
@@ -113,6 +123,9 @@ export declare class InteractiveMode {
|
|
|
113
123
|
private getMcpArgumentCompletions;
|
|
114
124
|
private getMemoryArgumentCompletions;
|
|
115
125
|
private getSemanticArgumentCompletions;
|
|
126
|
+
private getContractArgumentCompletions;
|
|
127
|
+
private getSingularArgumentCompletions;
|
|
128
|
+
private getSwarmArgumentCompletions;
|
|
116
129
|
private setupAutocomplete;
|
|
117
130
|
init(): Promise<void>;
|
|
118
131
|
private buildStartupHeaderContent;
|
|
@@ -252,6 +265,10 @@ export declare class InteractiveMode {
|
|
|
252
265
|
private setupKeyHandlers;
|
|
253
266
|
private handleClipboardImagePaste;
|
|
254
267
|
private setupEditorSubmitHandler;
|
|
268
|
+
private updateRunningSubagentDisplay;
|
|
269
|
+
private ensureSubagentElapsedTimer;
|
|
270
|
+
private clearSubagentElapsedTimer;
|
|
271
|
+
private stopSubagentElapsedTimerIfIdle;
|
|
255
272
|
private subscribeToAgent;
|
|
256
273
|
private handleEvent;
|
|
257
274
|
/** Extract text content from a user message */
|
|
@@ -377,9 +394,45 @@ export declare class InteractiveMode {
|
|
|
377
394
|
private ensureOpenRouterSemanticCredentials;
|
|
378
395
|
private selectSemanticModelFromCatalog;
|
|
379
396
|
private runSemanticSetupWizard;
|
|
397
|
+
private resolveSemanticAutoIndexWriteScope;
|
|
398
|
+
private updateSemanticAutoIndexSetting;
|
|
380
399
|
private runSemanticInteractiveMenu;
|
|
381
400
|
private reportSemanticError;
|
|
382
401
|
private handleSemanticCommand;
|
|
402
|
+
private parseContractScopeOptions;
|
|
403
|
+
private cloneContract;
|
|
404
|
+
private formatContractSection;
|
|
405
|
+
private formatContractFieldPreview;
|
|
406
|
+
private showContractState;
|
|
407
|
+
private editContractFieldValue;
|
|
408
|
+
private formatContractEditorSummary;
|
|
409
|
+
private editContractScope;
|
|
410
|
+
private runContractInteractiveMenu;
|
|
411
|
+
private handleContractCommand;
|
|
412
|
+
private normalizeSingularComplexity;
|
|
413
|
+
private normalizeSingularBlastRadius;
|
|
414
|
+
private normalizeSingularRecommendation;
|
|
415
|
+
private normalizeSingularStageFit;
|
|
416
|
+
private toTrimmedString;
|
|
417
|
+
private toTrimmedStringList;
|
|
418
|
+
private normalizeSingularImpactAnalysis;
|
|
419
|
+
private buildSingularContractPromptSection;
|
|
420
|
+
private resolveSingularRepoScaleMode;
|
|
421
|
+
private buildSingularSemanticGuidanceFromStatus;
|
|
422
|
+
private buildSingularSemanticGuidance;
|
|
423
|
+
private buildSingularAgentPrompt;
|
|
424
|
+
private extractLabeledValue;
|
|
425
|
+
private parseSingularListSection;
|
|
426
|
+
private parseSingularOptionsFromText;
|
|
427
|
+
private parseSingularAgentAnalysisFromText;
|
|
428
|
+
private runSingularAgentFeasibilityPass;
|
|
429
|
+
private formatSingularRunReport;
|
|
430
|
+
private buildSingularExecutionDraft;
|
|
431
|
+
private resolveRecommendedSingularOptionId;
|
|
432
|
+
private promptSingularDecision;
|
|
433
|
+
private showSingularLastSummary;
|
|
434
|
+
private runSingularAnalysis;
|
|
435
|
+
private handleSingularCommand;
|
|
383
436
|
private parseCheckpointNameFromLabel;
|
|
384
437
|
private buildCheckpointLabel;
|
|
385
438
|
private normalizeCheckpointName;
|
|
@@ -403,6 +456,34 @@ export declare class InteractiveMode {
|
|
|
403
456
|
private resolveIosmSnapshot;
|
|
404
457
|
private runIosmRefreshPass;
|
|
405
458
|
private parseIosmAutomationSlashCommand;
|
|
459
|
+
private getSwarmHelpText;
|
|
460
|
+
private buildSwarmRecommendationFromOrchestrate;
|
|
461
|
+
private isEffectiveContractReady;
|
|
462
|
+
private parseContractListInput;
|
|
463
|
+
private buildAutoDraftContractFromTask;
|
|
464
|
+
private runSwarmContractGuidedInterview;
|
|
465
|
+
private ensureSwarmEffectiveContract;
|
|
466
|
+
private maybeWarnSwarmSemantic;
|
|
467
|
+
private ensureSwarmProjectIndex;
|
|
468
|
+
private parseSwarmCommand;
|
|
469
|
+
private buildSwarmBootstrapState;
|
|
470
|
+
private buildSwarmRunMeta;
|
|
471
|
+
private resolveSwarmTaskProfile;
|
|
472
|
+
private estimateSwarmTaskCostUsd;
|
|
473
|
+
private deriveSwarmTaskDelegateParallelHint;
|
|
474
|
+
private parseSwarmSpawnCandidates;
|
|
475
|
+
private loadSingularAnalysisByRunId;
|
|
476
|
+
private dispatchSwarmTaskWithAgent;
|
|
477
|
+
private executeSwarmRun;
|
|
478
|
+
private runSwarmFromTask;
|
|
479
|
+
private runSwarmFromSingular;
|
|
480
|
+
private loadSwarmRunBundle;
|
|
481
|
+
private computeSwarmCriticalPathLength;
|
|
482
|
+
private computeSwarmDependentCounts;
|
|
483
|
+
private formatSwarmWatch;
|
|
484
|
+
private runSwarmResume;
|
|
485
|
+
private runSwarmRetry;
|
|
486
|
+
private handleSwarmCommand;
|
|
406
487
|
private parseOrchestrateSlashCommand;
|
|
407
488
|
private handleOrchestrateSlashCommand;
|
|
408
489
|
private handleAgentsSlashCommand;
|