@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.
- package/CHANGELOG.md +37 -0
- package/dist/cli/args.d.ts +3 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +20 -8
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +10 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +75 -14
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +2 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +1 -0
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +86 -0
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +27 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +55 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/pi-agent.d.ts.map +1 -1
- package/dist/core/pi-agent.js +1 -0
- package/dist/core/pi-agent.js.map +1 -1
- package/dist/core/prompt-templates.d.ts +5 -0
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +115 -0
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/resource-loader.d.ts +15 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +355 -40
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/rules.d.ts +6 -0
- package/dist/core/rules.d.ts.map +1 -1
- package/dist/core/rules.js +231 -10
- package/dist/core/rules.js.map +1 -1
- package/dist/core/skills.d.ts +6 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +231 -10
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/source-info.d.ts +2 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +6 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -8
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +2 -2
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +2 -2
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +2 -2
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/operations.d.ts +49 -4
- package/dist/core/tools/operations.d.ts.map +1 -1
- package/dist/core/tools/operations.js +340 -4
- package/dist/core/tools/operations.js.map +1 -1
- package/dist/core/tools/read.d.ts +2 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +14 -6
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +9 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +16 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +3 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +36 -19
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +61 -28
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +11 -4
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +6 -6
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +11 -7
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +10 -4
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/docs/extensions.md +83 -4
- package/docs/rpc.md +31 -0
- package/docs/usage.md +5 -0
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- 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,
|
|
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.
|
|
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
|
|
187
|
-
if (!(this._toolOperations instanceof
|
|
188
|
-
throw new Error("
|
|
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
|
|
235
|
+
return options.type === "ssh"
|
|
236
|
+
? this._toolOperations.configure({ remote: options.remote, cwd: options.cwd })
|
|
237
|
+
: this._toolOperations.configureRemote(options.url);
|
|
191
238
|
}
|
|
192
|
-
|
|
193
|
-
if (!(this._toolOperations instanceof
|
|
194
|
-
throw new Error("
|
|
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: {
|
|
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]));
|