@fleetagent/pi-coding-agent 0.0.10 → 0.0.12

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 (116) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/cli/args.d.ts +3 -2
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +20 -8
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session.d.ts +10 -2
  7. package/dist/core/agent-session.d.ts.map +1 -1
  8. package/dist/core/agent-session.js +75 -14
  9. package/dist/core/agent-session.js.map +1 -1
  10. package/dist/core/bash-executor.d.ts +2 -0
  11. package/dist/core/bash-executor.d.ts.map +1 -1
  12. package/dist/core/bash-executor.js +1 -0
  13. package/dist/core/bash-executor.js.map +1 -1
  14. package/dist/core/extensions/index.d.ts +1 -1
  15. package/dist/core/extensions/index.d.ts.map +1 -1
  16. package/dist/core/extensions/index.js.map +1 -1
  17. package/dist/core/extensions/loader.d.ts.map +1 -1
  18. package/dist/core/extensions/loader.js +86 -0
  19. package/dist/core/extensions/loader.js.map +1 -1
  20. package/dist/core/extensions/runner.d.ts +3 -0
  21. package/dist/core/extensions/runner.d.ts.map +1 -1
  22. package/dist/core/extensions/runner.js +27 -0
  23. package/dist/core/extensions/runner.js.map +1 -1
  24. package/dist/core/extensions/types.d.ts +55 -2
  25. package/dist/core/extensions/types.d.ts.map +1 -1
  26. package/dist/core/extensions/types.js.map +1 -1
  27. package/dist/core/pi-agent.d.ts.map +1 -1
  28. package/dist/core/pi-agent.js +1 -0
  29. package/dist/core/pi-agent.js.map +1 -1
  30. package/dist/core/prompt-templates.d.ts +5 -0
  31. package/dist/core/prompt-templates.d.ts.map +1 -1
  32. package/dist/core/prompt-templates.js +115 -0
  33. package/dist/core/prompt-templates.js.map +1 -1
  34. package/dist/core/resource-loader.d.ts +15 -0
  35. package/dist/core/resource-loader.d.ts.map +1 -1
  36. package/dist/core/resource-loader.js +355 -40
  37. package/dist/core/resource-loader.js.map +1 -1
  38. package/dist/core/rules.d.ts +6 -0
  39. package/dist/core/rules.d.ts.map +1 -1
  40. package/dist/core/rules.js +231 -10
  41. package/dist/core/rules.js.map +1 -1
  42. package/dist/core/skills.d.ts +6 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +231 -10
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/slash-commands.d.ts.map +1 -1
  47. package/dist/core/slash-commands.js +1 -1
  48. package/dist/core/slash-commands.js.map +1 -1
  49. package/dist/core/source-info.d.ts +2 -0
  50. package/dist/core/source-info.d.ts.map +1 -1
  51. package/dist/core/source-info.js +6 -0
  52. package/dist/core/source-info.js.map +1 -1
  53. package/dist/core/tools/bash.d.ts.map +1 -1
  54. package/dist/core/tools/bash.js +11 -8
  55. package/dist/core/tools/bash.js.map +1 -1
  56. package/dist/core/tools/edit.d.ts.map +1 -1
  57. package/dist/core/tools/edit.js +5 -5
  58. package/dist/core/tools/edit.js.map +1 -1
  59. package/dist/core/tools/find.d.ts.map +1 -1
  60. package/dist/core/tools/find.js +2 -2
  61. package/dist/core/tools/find.js.map +1 -1
  62. package/dist/core/tools/grep.d.ts.map +1 -1
  63. package/dist/core/tools/grep.js +2 -2
  64. package/dist/core/tools/grep.js.map +1 -1
  65. package/dist/core/tools/index.d.ts +1 -1
  66. package/dist/core/tools/index.d.ts.map +1 -1
  67. package/dist/core/tools/index.js +1 -1
  68. package/dist/core/tools/index.js.map +1 -1
  69. package/dist/core/tools/ls.d.ts.map +1 -1
  70. package/dist/core/tools/ls.js +2 -2
  71. package/dist/core/tools/ls.js.map +1 -1
  72. package/dist/core/tools/operations.d.ts +49 -4
  73. package/dist/core/tools/operations.d.ts.map +1 -1
  74. package/dist/core/tools/operations.js +340 -4
  75. package/dist/core/tools/operations.js.map +1 -1
  76. package/dist/core/tools/read.d.ts +2 -0
  77. package/dist/core/tools/read.d.ts.map +1 -1
  78. package/dist/core/tools/read.js +14 -6
  79. package/dist/core/tools/read.js.map +1 -1
  80. package/dist/core/tools/render-utils.d.ts +9 -0
  81. package/dist/core/tools/render-utils.d.ts.map +1 -1
  82. package/dist/core/tools/render-utils.js +16 -0
  83. package/dist/core/tools/render-utils.js.map +1 -1
  84. package/dist/core/tools/write.d.ts.map +1 -1
  85. package/dist/core/tools/write.js +3 -2
  86. package/dist/core/tools/write.js.map +1 -1
  87. package/dist/index.d.ts +2 -2
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/main.d.ts.map +1 -1
  92. package/dist/main.js +36 -19
  93. package/dist/main.js.map +1 -1
  94. package/dist/modes/interactive/interactive-mode.d.ts +3 -1
  95. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  96. package/dist/modes/interactive/interactive-mode.js +61 -28
  97. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  98. package/dist/modes/rpc/rpc-client.d.ts +11 -4
  99. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  100. package/dist/modes/rpc/rpc-client.js +6 -6
  101. package/dist/modes/rpc/rpc-client.js.map +1 -1
  102. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  103. package/dist/modes/rpc/rpc-mode.js +11 -7
  104. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  105. package/dist/modes/rpc/rpc-types.d.ts +10 -4
  106. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  107. package/dist/modes/rpc/rpc-types.js.map +1 -1
  108. package/docs/extensions.md +83 -4
  109. package/docs/rpc.md +31 -0
  110. package/docs/usage.md +5 -0
  111. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  112. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  113. package/examples/extensions/sandbox/package.json +1 -1
  114. package/examples/extensions/with-deps/package.json +1 -1
  115. package/npm-shrinkwrap.json +12 -12
  116. package/package.json +4 -4
@@ -13,7 +13,7 @@
13
13
  * Modes use this class and add their own I/O layer on top.
14
14
  */
15
15
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
16
- import { basename, dirname } from "node:path";
16
+ import { basename, dirname, sep } from "node:path";
17
17
  import { clampThinkingLevel, cleanupSessionResources, getSupportedThinkingLevels, isContextOverflow, modelsAreEqual, resetApiProviders, streamSimple, validateToolArguments, } from "@fleetagent/pi-ai";
18
18
  import { theme } from "../modes/interactive/theme/theme.js";
19
19
  import { stripFrontmatter } from "../utils/frontmatter.js";
@@ -30,10 +30,10 @@ import { emitSessionShutdownEvent } from "./extensions/runner.js";
30
30
  import { STRUCTURED_RESPONSE_INTERNAL_CUSTOM_TYPE } from "./messages.js";
31
31
  import { expandPromptTemplate } from "./prompt-templates.js";
32
32
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
33
- import { createSyntheticSourceInfo } from "./source-info.js";
33
+ import { createSyntheticSourceInfo, getSourceBackend } from "./source-info.js";
34
34
  import { buildSystemPrompt } from "./system-prompt.js";
35
35
  import { createLocalBashOperations } from "./tools/bash.js";
36
- import { createAllToolDefinitions, DeferredSshToolOperations, LocalToolOperations, } from "./tools/index.js";
36
+ import { createAllToolDefinitions, DeferredRemoteToolOperations, LocalToolOperations, } from "./tools/index.js";
37
37
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
38
38
  /**
39
39
  * Parse a skill block from message text.
@@ -134,6 +134,7 @@ export class AgentSession {
134
134
  _allowedToolNames;
135
135
  _baseToolsOverride;
136
136
  _toolOperations;
137
+ _localResourceToolOperations;
137
138
  _sessionStartEvent;
138
139
  _extensionUIContext;
139
140
  _extensionCommandContextActions;
@@ -180,18 +181,64 @@ export class AgentSession {
180
181
  get modelRegistry() {
181
182
  return this._modelRegistry;
182
183
  }
184
+ getToolOperations() {
185
+ const shellPath = this.settingsManager.getShellPath();
186
+ return this._toolOperations ?? createLocalBashOperations({ cwd: this.session.getCwd(), shellPath });
187
+ }
183
188
  getToolBackendInfo() {
184
- return this._toolOperations?.getBackendInfo?.() ?? { type: "local", cwd: this._cwd };
189
+ return this.getToolOperations().getBackendInfo?.() ?? { type: "local", cwd: this._cwd };
190
+ }
191
+ _getLocalResourceToolOperations(shellPath) {
192
+ this._localResourceToolOperations ??= new LocalToolOperations(this._cwd, { shellPath });
193
+ return this._localResourceToolOperations;
194
+ }
195
+ _getReadOperationsForPath(absolutePath, shellPath) {
196
+ const isSameOrChild = (target, root) => {
197
+ const normalizedRoot = resolvePath(root);
198
+ if (target === normalizedRoot)
199
+ return true;
200
+ const prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;
201
+ return target.startsWith(prefix);
202
+ };
203
+ const resources = [
204
+ ...this._resourceLoader.getSkills().skills.map((skill) => ({
205
+ path: skill.filePath,
206
+ baseDir: skill.baseDir,
207
+ sourceInfo: skill.sourceInfo,
208
+ })),
209
+ ...this._resourceLoader.getRules().rules.map((rule) => ({
210
+ path: rule.filePath,
211
+ baseDir: rule.baseDir,
212
+ sourceInfo: rule.sourceInfo,
213
+ })),
214
+ ...this._resourceLoader.getPrompts().prompts.map((prompt) => ({
215
+ path: prompt.filePath,
216
+ baseDir: dirname(prompt.filePath),
217
+ sourceInfo: prompt.sourceInfo,
218
+ })),
219
+ ];
220
+ for (const resource of resources) {
221
+ if (getSourceBackend(resource.sourceInfo) !== "local")
222
+ continue;
223
+ const resourcePath = resolvePath(resource.path);
224
+ const baseDir = resolvePath(resource.baseDir);
225
+ if (absolutePath === resourcePath || isSameOrChild(absolutePath, baseDir)) {
226
+ return this._getLocalResourceToolOperations(shellPath);
227
+ }
228
+ }
229
+ return undefined;
185
230
  }
186
- async configureSshSandbox(options) {
187
- if (!(this._toolOperations instanceof DeferredSshToolOperations)) {
188
- throw new Error("SSH sandbox can only be configured when Pi is started with --ssh-deferred");
231
+ async configureRemoteSandbox(options) {
232
+ if (!(this._toolOperations instanceof DeferredRemoteToolOperations)) {
233
+ throw new Error("Remote backend can only be configured when Pi is started with --remote-deferred");
189
234
  }
190
- return this._toolOperations.configure(options);
235
+ return options.type === "ssh"
236
+ ? this._toolOperations.configure({ remote: options.remote, cwd: options.cwd })
237
+ : this._toolOperations.configureRemote(options.url);
191
238
  }
192
- clearSshSandbox() {
193
- if (!(this._toolOperations instanceof DeferredSshToolOperations)) {
194
- throw new Error("SSH sandbox can only be cleared when Pi is started with --ssh-deferred");
239
+ clearRemoteSandbox() {
240
+ if (!(this._toolOperations instanceof DeferredRemoteToolOperations)) {
241
+ throw new Error("Remote backend can only be cleared when Pi is started with --remote-deferred");
195
242
  }
196
243
  this._toolOperations.clear();
197
244
  }
@@ -554,6 +601,8 @@ export class AgentSession {
554
601
  this.abortBranchSummary();
555
602
  this.abortBash();
556
603
  this.agent.abort();
604
+ void this._localResourceToolOperations?.dispose?.();
605
+ this._localResourceToolOperations = undefined;
557
606
  }
558
607
  catch {
559
608
  // Dispose must succeed even if an abort hook throws.
@@ -1137,7 +1186,7 @@ export class AgentSession {
1137
1186
  if (!skill)
1138
1187
  return text; // Unknown skill, pass through
1139
1188
  try {
1140
- const content = readFileSync(skill.filePath, "utf-8");
1189
+ const content = skill.content ?? readFileSync(skill.filePath, "utf-8");
1141
1190
  const body = stripFrontmatter(content).trim();
1142
1191
  const skillBlock = `<skill name="${skill.name}" location="${skill.filePath}">\nReferences are relative to ${skill.baseDir}.\n\n${body}\n</skill>`;
1143
1192
  return args ? `${skillBlock}\n\n${args}` : skillBlock;
@@ -1162,7 +1211,7 @@ export class AgentSession {
1162
1211
  if (!rule)
1163
1212
  return text; // Unknown rule, pass through
1164
1213
  try {
1165
- const content = readFileSync(rule.filePath, "utf-8");
1214
+ const content = rule.content ?? readFileSync(rule.filePath, "utf-8");
1166
1215
  const body = stripFrontmatter(content).trim();
1167
1216
  const ruleBlock = `<rule name="${rule.name}" location="${rule.filePath}">\nReferences are relative to ${rule.baseDir}.\n\n${body}\n</rule>`;
1168
1217
  return args ? `${ruleBlock}\n\n${args}` : ruleBlock;
@@ -2063,6 +2112,7 @@ export class AgentSession {
2063
2112
  this.agent.state.model = refreshedModel;
2064
2113
  }
2065
2114
  _bindExtensionCore(runner) {
2115
+ const getToolOperations = () => this.getToolOperations();
2066
2116
  const getCommands = () => {
2067
2117
  const extensionCommands = runner.getRegisteredCommands().map((command) => ({
2068
2118
  name: command.invocationName,
@@ -2154,6 +2204,14 @@ export class AgentSession {
2154
2204
  this._requestExtensionCompaction(options);
2155
2205
  },
2156
2206
  getSystemPrompt: () => this.systemPrompt,
2207
+ getToolOperations,
2208
+ getToolBackendInfo: () => this.getToolBackendInfo(),
2209
+ execToolBackend: (command, options) => {
2210
+ const operations = getToolOperations();
2211
+ const prefix = this.settingsManager.getShellCommandPrefix();
2212
+ const resolvedCommand = prefix ? `${prefix}\n${command}` : command;
2213
+ return executeBashWithOperations(resolvedCommand, options?.cwd ?? operations.cwd, operations, options);
2214
+ },
2157
2215
  }, {
2158
2216
  registerProvider: (name, config) => {
2159
2217
  this._modelRegistry.registerProvider(name, config);
@@ -2252,7 +2310,10 @@ export class AgentSession {
2252
2310
  createToolDefinitionFromAgentTool(tool),
2253
2311
  ]))
2254
2312
  : createAllToolDefinitions(operations, {
2255
- read: { autoResizeImages },
2313
+ read: {
2314
+ autoResizeImages,
2315
+ operationsForPath: (path) => this._getReadOperationsForPath(path, shellPath),
2316
+ },
2256
2317
  bash: { commandPrefix: shellCommandPrefix },
2257
2318
  });
2258
2319
  this._baseToolDefinitions = new Map(Object.entries(baseToolDefinitions).map(([name, tool]) => [name, tool]));