@earendil-works/pi-coding-agent 0.78.0 → 0.79.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.
Files changed (203) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +26 -6
  3. package/dist/cli/args.d.ts +1 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +15 -2
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +9 -1
  9. package/dist/config.js.map +1 -1
  10. package/dist/core/agent-session-runtime.d.ts +3 -1
  11. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  12. package/dist/core/agent-session-runtime.js +1 -0
  13. package/dist/core/agent-session-runtime.js.map +1 -1
  14. package/dist/core/agent-session-services.d.ts +2 -1
  15. package/dist/core/agent-session-services.d.ts.map +1 -1
  16. package/dist/core/agent-session-services.js +2 -2
  17. package/dist/core/agent-session-services.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +3 -1
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +7 -1
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-storage.d.ts.map +1 -1
  23. package/dist/core/auth-storage.js +4 -3
  24. package/dist/core/auth-storage.js.map +1 -1
  25. package/dist/core/compaction/branch-summarization.d.ts +3 -1
  26. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  27. package/dist/core/compaction/branch-summarization.js +9 -3
  28. package/dist/core/compaction/branch-summarization.js.map +1 -1
  29. package/dist/core/compaction/utils.d.ts +1 -1
  30. package/dist/core/compaction/utils.d.ts.map +1 -1
  31. package/dist/core/compaction/utils.js +1 -1
  32. package/dist/core/compaction/utils.js.map +1 -1
  33. package/dist/core/export-html/template.js +19 -6
  34. package/dist/core/extensions/index.d.ts +1 -1
  35. package/dist/core/extensions/index.d.ts.map +1 -1
  36. package/dist/core/extensions/index.js.map +1 -1
  37. package/dist/core/extensions/loader.d.ts +1 -1
  38. package/dist/core/extensions/loader.d.ts.map +1 -1
  39. package/dist/core/extensions/loader.js +4 -4
  40. package/dist/core/extensions/loader.js.map +1 -1
  41. package/dist/core/extensions/runner.d.ts +9 -3
  42. package/dist/core/extensions/runner.d.ts.map +1 -1
  43. package/dist/core/extensions/runner.js +41 -1
  44. package/dist/core/extensions/runner.js.map +1 -1
  45. package/dist/core/extensions/types.d.ts +25 -2
  46. package/dist/core/extensions/types.d.ts.map +1 -1
  47. package/dist/core/extensions/types.js.map +1 -1
  48. package/dist/core/footer-data-provider.d.ts +2 -0
  49. package/dist/core/footer-data-provider.d.ts.map +1 -1
  50. package/dist/core/footer-data-provider.js +29 -1
  51. package/dist/core/footer-data-provider.js.map +1 -1
  52. package/dist/core/model-registry.d.ts.map +1 -1
  53. package/dist/core/model-registry.js +1 -0
  54. package/dist/core/model-registry.js.map +1 -1
  55. package/dist/core/model-resolver.d.ts.map +1 -1
  56. package/dist/core/model-resolver.js +3 -0
  57. package/dist/core/model-resolver.js.map +1 -1
  58. package/dist/core/package-manager.d.ts +3 -0
  59. package/dist/core/package-manager.d.ts.map +1 -1
  60. package/dist/core/package-manager.js +47 -13
  61. package/dist/core/package-manager.js.map +1 -1
  62. package/dist/core/provider-attribution.d.ts +4 -0
  63. package/dist/core/provider-attribution.d.ts.map +1 -0
  64. package/dist/core/provider-attribution.js +72 -0
  65. package/dist/core/provider-attribution.js.map +1 -0
  66. package/dist/core/provider-display-names.d.ts.map +1 -1
  67. package/dist/core/provider-display-names.js +3 -0
  68. package/dist/core/provider-display-names.js.map +1 -1
  69. package/dist/core/resource-loader.d.ts +13 -2
  70. package/dist/core/resource-loader.d.ts.map +1 -1
  71. package/dist/core/resource-loader.js +129 -54
  72. package/dist/core/resource-loader.js.map +1 -1
  73. package/dist/core/sdk.d.ts.map +1 -1
  74. package/dist/core/sdk.js +7 -33
  75. package/dist/core/sdk.js.map +1 -1
  76. package/dist/core/session-manager.d.ts.map +1 -1
  77. package/dist/core/session-manager.js +92 -68
  78. package/dist/core/session-manager.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +10 -2
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +71 -30
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/slash-commands.d.ts.map +1 -1
  84. package/dist/core/slash-commands.js +1 -0
  85. package/dist/core/slash-commands.js.map +1 -1
  86. package/dist/core/tools/bash.d.ts.map +1 -1
  87. package/dist/core/tools/bash.js +1 -1
  88. package/dist/core/tools/bash.js.map +1 -1
  89. package/dist/core/tools/find.d.ts.map +1 -1
  90. package/dist/core/tools/find.js +1 -1
  91. package/dist/core/tools/find.js.map +1 -1
  92. package/dist/core/tools/grep.d.ts.map +1 -1
  93. package/dist/core/tools/grep.js +1 -1
  94. package/dist/core/tools/grep.js.map +1 -1
  95. package/dist/core/tools/ls.d.ts.map +1 -1
  96. package/dist/core/tools/ls.js +1 -1
  97. package/dist/core/tools/ls.js.map +1 -1
  98. package/dist/core/tools/read.d.ts.map +1 -1
  99. package/dist/core/tools/read.js +1 -1
  100. package/dist/core/tools/read.js.map +1 -1
  101. package/dist/core/tools/write.d.ts.map +1 -1
  102. package/dist/core/tools/write.js +1 -1
  103. package/dist/core/tools/write.js.map +1 -1
  104. package/dist/core/trust-manager.d.ts +10 -0
  105. package/dist/core/trust-manager.d.ts.map +1 -0
  106. package/dist/core/trust-manager.js +133 -0
  107. package/dist/core/trust-manager.js.map +1 -0
  108. package/dist/index.d.ts +5 -4
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +2 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/main.d.ts.map +1 -1
  113. package/dist/main.js +195 -6
  114. package/dist/main.js.map +1 -1
  115. package/dist/modes/index.d.ts +1 -1
  116. package/dist/modes/index.d.ts.map +1 -1
  117. package/dist/modes/index.js.map +1 -1
  118. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  119. package/dist/modes/interactive/components/bash-execution.js +2 -2
  120. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  121. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/footer.js +7 -0
  123. package/dist/modes/interactive/components/footer.js.map +1 -1
  124. package/dist/modes/interactive/components/index.d.ts +1 -0
  125. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/index.js +1 -0
  127. package/dist/modes/interactive/components/index.js.map +1 -1
  128. package/dist/modes/interactive/components/login-dialog.d.ts +0 -1
  129. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  130. package/dist/modes/interactive/components/login-dialog.js +3 -12
  131. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  132. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/tool-execution.js +22 -0
  134. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  135. package/dist/modes/interactive/components/trust-selector.d.ts +20 -0
  136. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  137. package/dist/modes/interactive/components/trust-selector.js +86 -0
  138. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  139. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  140. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  141. package/dist/modes/interactive/interactive-mode.js +87 -1
  142. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  143. package/dist/modes/print-mode.d.ts.map +1 -1
  144. package/dist/modes/print-mode.js +1 -0
  145. package/dist/modes/print-mode.js.map +1 -1
  146. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  147. package/dist/modes/rpc/rpc-mode.js +1 -0
  148. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  149. package/dist/package-manager-cli.d.ts.map +1 -1
  150. package/dist/package-manager-cli.js +55 -8
  151. package/dist/package-manager-cli.js.map +1 -1
  152. package/dist/utils/git.d.ts.map +1 -1
  153. package/dist/utils/git.js +54 -22
  154. package/dist/utils/git.js.map +1 -1
  155. package/dist/utils/open-browser.d.ts +9 -0
  156. package/dist/utils/open-browser.d.ts.map +1 -0
  157. package/dist/utils/open-browser.js +22 -0
  158. package/dist/utils/open-browser.js.map +1 -0
  159. package/docs/containerization.md +111 -0
  160. package/docs/docs.json +8 -0
  161. package/docs/extensions.md +58 -12
  162. package/docs/index.md +2 -0
  163. package/docs/packages.md +3 -1
  164. package/docs/prompt-templates.md +1 -1
  165. package/docs/providers.md +5 -0
  166. package/docs/rpc.md +1 -1
  167. package/docs/sdk.md +5 -0
  168. package/docs/security.md +57 -0
  169. package/docs/settings.md +10 -0
  170. package/docs/skills.md +1 -1
  171. package/docs/terminal-setup.md +36 -2
  172. package/docs/themes.md +1 -1
  173. package/docs/tmux.md +4 -2
  174. package/docs/tui.md +10 -1
  175. package/docs/usage.md +16 -4
  176. package/examples/extensions/README.md +2 -0
  177. package/examples/extensions/custom-header.ts +1 -1
  178. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  179. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  180. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  181. package/examples/extensions/doom-overlay/index.ts +1 -1
  182. package/examples/extensions/gondolin/index.ts +531 -0
  183. package/examples/extensions/gondolin/package-lock.json +185 -0
  184. package/examples/extensions/gondolin/package.json +19 -0
  185. package/examples/extensions/handoff.ts +1 -1
  186. package/examples/extensions/interactive-shell.ts +1 -1
  187. package/examples/extensions/overlay-qa-tests.ts +152 -81
  188. package/examples/extensions/project-trust.ts +64 -0
  189. package/examples/extensions/qna.ts +1 -1
  190. package/examples/extensions/question.ts +1 -1
  191. package/examples/extensions/questionnaire.ts +1 -1
  192. package/examples/extensions/sandbox/package-lock.json +2 -2
  193. package/examples/extensions/sandbox/package.json +1 -1
  194. package/examples/extensions/snake.ts +1 -1
  195. package/examples/extensions/space-invaders.ts +1 -1
  196. package/examples/extensions/summarize.ts +1 -1
  197. package/examples/extensions/tic-tac-toe.ts +1 -1
  198. package/examples/extensions/todo.ts +1 -1
  199. package/examples/extensions/tools.ts +5 -0
  200. package/examples/extensions/with-deps/package-lock.json +2 -2
  201. package/examples/extensions/with-deps/package.json +1 -1
  202. package/npm-shrinkwrap.json +12 -12
  203. package/package.json +5 -8
@@ -0,0 +1,86 @@
1
+ import { Container, getKeybindings, Spacer, Text } from "@earendil-works/pi-tui";
2
+ import { theme } from "../theme/theme.js";
3
+ import { DynamicBorder } from "./dynamic-border.js";
4
+ import { keyHint, rawKeyHint } from "./keybinding-hints.js";
5
+ const TRUST_OPTIONS = [
6
+ { label: "Trust", trusted: true },
7
+ { label: "Do not trust", trusted: false },
8
+ ];
9
+ function formatDecision(decision) {
10
+ if (decision === true) {
11
+ return "trusted";
12
+ }
13
+ if (decision === false) {
14
+ return "untrusted";
15
+ }
16
+ return "none";
17
+ }
18
+ export class TrustSelectorComponent extends Container {
19
+ selectedIndex;
20
+ listContainer;
21
+ savedDecision;
22
+ onSelectCallback;
23
+ onCancelCallback;
24
+ constructor(options) {
25
+ super();
26
+ this.savedDecision = options.savedDecision;
27
+ this.selectedIndex = Math.max(0, TRUST_OPTIONS.findIndex((option) => option.trusted === options.savedDecision));
28
+ this.onSelectCallback = options.onSelect;
29
+ this.onCancelCallback = options.onCancel;
30
+ this.addChild(new DynamicBorder());
31
+ this.addChild(new Spacer(1));
32
+ this.addChild(new Text(theme.fg("accent", theme.bold("Project trust")), 1, 0));
33
+ this.addChild(new Text(theme.fg("muted", options.cwd), 1, 0));
34
+ this.addChild(new Spacer(1));
35
+ this.addChild(new Text(theme.fg("muted", `Saved decision: ${formatDecision(options.savedDecision)}`), 1, 0));
36
+ this.addChild(new Text(theme.fg("muted", `Current session: ${options.projectTrusted ? "trusted" : "untrusted"}`), 1, 0));
37
+ this.addChild(new Spacer(1));
38
+ this.listContainer = new Container();
39
+ this.addChild(this.listContainer);
40
+ this.addChild(new Spacer(1));
41
+ this.addChild(new Text(rawKeyHint("↑↓", "navigate") +
42
+ " " +
43
+ keyHint("tui.select.confirm", "save") +
44
+ " " +
45
+ keyHint("tui.select.cancel", "cancel"), 1, 0));
46
+ this.addChild(new Spacer(1));
47
+ this.addChild(new DynamicBorder());
48
+ this.updateList();
49
+ }
50
+ updateList() {
51
+ this.listContainer.clear();
52
+ for (let i = 0; i < TRUST_OPTIONS.length; i++) {
53
+ const option = TRUST_OPTIONS[i];
54
+ if (!option) {
55
+ continue;
56
+ }
57
+ const isSelected = i === this.selectedIndex;
58
+ const isCurrent = option.trusted === this.savedDecision;
59
+ const checkmark = isCurrent ? theme.fg("success", " ✓") : "";
60
+ const prefix = isSelected ? theme.fg("accent", "→ ") : " ";
61
+ const label = isSelected ? theme.fg("accent", option.label) : theme.fg("text", option.label);
62
+ this.listContainer.addChild(new Text(`${prefix}${label}${checkmark}`, 1, 0));
63
+ }
64
+ }
65
+ handleInput(keyData) {
66
+ const kb = getKeybindings();
67
+ if (kb.matches(keyData, "tui.select.up") || keyData === "k") {
68
+ this.selectedIndex = Math.max(0, this.selectedIndex - 1);
69
+ this.updateList();
70
+ }
71
+ else if (kb.matches(keyData, "tui.select.down") || keyData === "j") {
72
+ this.selectedIndex = Math.min(TRUST_OPTIONS.length - 1, this.selectedIndex + 1);
73
+ this.updateList();
74
+ }
75
+ else if (kb.matches(keyData, "tui.select.confirm") || keyData === "\n") {
76
+ const selected = TRUST_OPTIONS[this.selectedIndex];
77
+ if (selected) {
78
+ this.onSelectCallback(selected.trusted);
79
+ }
80
+ }
81
+ else if (kb.matches(keyData, "tui.select.cancel")) {
82
+ this.onCancelCallback();
83
+ }
84
+ }
85
+ }
86
+ //# sourceMappingURL=trust-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/trust-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { Container, getKeybindings, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { ProjectTrustDecision } from \"../../../core/trust-manager.ts\";\nimport { theme } from \"../theme/theme.ts\";\nimport { DynamicBorder } from \"./dynamic-border.ts\";\nimport { keyHint, rawKeyHint } from \"./keybinding-hints.ts\";\n\ninterface TrustOption {\n\tlabel: string;\n\ttrusted: boolean;\n}\n\nexport interface TrustSelectorOptions {\n\tcwd: string;\n\tsavedDecision: ProjectTrustDecision;\n\tprojectTrusted: boolean;\n\tonSelect: (trusted: boolean) => void;\n\tonCancel: () => void;\n}\n\nconst TRUST_OPTIONS: TrustOption[] = [\n\t{ label: \"Trust\", trusted: true },\n\t{ label: \"Do not trust\", trusted: false },\n];\n\nfunction formatDecision(decision: ProjectTrustDecision): string {\n\tif (decision === true) {\n\t\treturn \"trusted\";\n\t}\n\tif (decision === false) {\n\t\treturn \"untrusted\";\n\t}\n\treturn \"none\";\n}\n\nexport class TrustSelectorComponent extends Container {\n\tprivate selectedIndex: number;\n\tprivate readonly listContainer: Container;\n\tprivate readonly savedDecision: ProjectTrustDecision;\n\tprivate readonly onSelectCallback: (trusted: boolean) => void;\n\tprivate readonly onCancelCallback: () => void;\n\n\tconstructor(options: TrustSelectorOptions) {\n\t\tsuper();\n\n\t\tthis.savedDecision = options.savedDecision;\n\t\tthis.selectedIndex = Math.max(\n\t\t\t0,\n\t\t\tTRUST_OPTIONS.findIndex((option) => option.trusted === options.savedDecision),\n\t\t);\n\t\tthis.onSelectCallback = options.onSelect;\n\t\tthis.onCancelCallback = options.onCancel;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"accent\", theme.bold(\"Project trust\")), 1, 0));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", options.cwd), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(theme.fg(\"muted\", `Saved decision: ${formatDecision(options.savedDecision)}`), 1, 0));\n\t\tthis.addChild(\n\t\t\tnew Text(theme.fg(\"muted\", `Current session: ${options.projectTrusted ? \"trusted\" : \"untrusted\"}`), 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\trawKeyHint(\"↑↓\", \"navigate\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.confirm\", \"save\") +\n\t\t\t\t\t\" \" +\n\t\t\t\t\tkeyHint(\"tui.select.cancel\", \"cancel\"),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < TRUST_OPTIONS.length; i++) {\n\t\t\tconst option = TRUST_OPTIONS[i];\n\t\t\tif (!option) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst isCurrent = option.trusted === this.savedDecision;\n\t\t\tconst checkmark = isCurrent ? theme.fg(\"success\", \" ✓\") : \"\";\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst label = isSelected ? theme.fg(\"accent\", option.label) : theme.fg(\"text\", option.label);\n\t\t\tthis.listContainer.addChild(new Text(`${prefix}${label}${checkmark}`, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getKeybindings();\n\t\tif (kb.matches(keyData, \"tui.select.up\") || keyData === \"k\") {\n\t\t\tthis.selectedIndex = Math.max(0, this.selectedIndex - 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.down\") || keyData === \"j\") {\n\t\t\tthis.selectedIndex = Math.min(TRUST_OPTIONS.length - 1, this.selectedIndex + 1);\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"tui.select.confirm\") || keyData === \"\\n\") {\n\t\t\tconst selected = TRUST_OPTIONS[this.selectedIndex];\n\t\t\tif (selected) {\n\t\t\t\tthis.onSelectCallback(selected.trusted);\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"tui.select.cancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
@@ -16,6 +16,8 @@ export interface InteractiveModeOptions {
16
16
  migratedProviders?: string[];
17
17
  /** Warning message if session model couldn't be restored */
18
18
  modelFallbackMessage?: string;
19
+ /** Cwd to trust after reload if it gained a .pi directory during this implicitly trusted session. */
20
+ autoTrustOnReloadCwd?: string;
19
21
  /** Initial message to send on startup (can include @file content) */
20
22
  initialMessage?: string;
21
23
  /** Images to attach to the initial message */
@@ -90,6 +92,7 @@ export declare class InteractiveMode {
90
92
  private builtInHeader;
91
93
  private customHeader;
92
94
  private options;
95
+ private autoTrustOnReloadCwd;
93
96
  private get session();
94
97
  private get agent();
95
98
  private get sessionManager();
@@ -191,6 +194,7 @@ export declare class InteractiveMode {
191
194
  /**
192
195
  * Create the ExtensionUIContext for extensions.
193
196
  */
197
+ private createProjectTrustContext;
194
198
  private createExtensionUIContext;
195
199
  /**
196
200
  * Show a selector for extensions.
@@ -255,6 +259,7 @@ export declare class InteractiveMode {
255
259
  */
256
260
  private renderSessionContext;
257
261
  renderInitialMessages(): void;
262
+ private renderProjectTrustWarningIfNeeded;
258
263
  getUserInput(): Promise<string>;
259
264
  private rebuildChatFromMessages;
260
265
  private handleCtrlC;
@@ -325,6 +330,8 @@ export declare class InteractiveMode {
325
330
  private getModelCandidates;
326
331
  private updateAvailableProviderCount;
327
332
  private maybeWarnAboutAnthropicSubscriptionAuth;
333
+ private maybeSaveImplicitProjectTrustAfterReload;
334
+ private showTrustSelector;
328
335
  private showModelSelector;
329
336
  private showModelsSelector;
330
337
  private showUserMessageSelector;