@felan-ai/felan 0.13.6 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +28 -1
- package/dist/application.js.map +1 -1
- package/dist/cwd-command.d.ts +13 -0
- package/dist/cwd-command.d.ts.map +1 -0
- package/dist/cwd-command.js +178 -0
- package/dist/cwd-command.js.map +1 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,cAAc,CAAC;AAMtB,MAAM,WAAW,oBAAqB,SAAQ,8BAA8B;IAC1E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF"}
|
package/dist/application.js
CHANGED
|
@@ -4,7 +4,22 @@ import { createLocalFelanRuntime, } from './runtime.js';
|
|
|
4
4
|
import { installFelanStartupHeader } from './startup-header.js';
|
|
5
5
|
import { createToolActivityRuntimeView } from './tool-activity/runtime-view.js';
|
|
6
6
|
import { checkForFelanUpdate } from './update.js';
|
|
7
|
+
import { CwdChangeRequested, installFelanCwdCommand } from './cwd-command.js';
|
|
7
8
|
export async function runLocalFelan(options = {}) {
|
|
9
|
+
let nextOptions = options;
|
|
10
|
+
while (true) {
|
|
11
|
+
const nextCwd = await runLocalFelanSession(nextOptions);
|
|
12
|
+
if (nextCwd === undefined)
|
|
13
|
+
return;
|
|
14
|
+
const { continueRecent: _continueRecent, initialMessage: _initialMessage, memoryCoordinator: _memoryCoordinator, sessionManager: _sessionManager, skillPaths: _skillPaths, ...restartOptions } = nextOptions;
|
|
15
|
+
nextOptions = {
|
|
16
|
+
...restartOptions,
|
|
17
|
+
cwd: nextCwd,
|
|
18
|
+
continueRecent: false,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function runLocalFelanSession(options) {
|
|
8
23
|
const runtime = await createLocalFelanRuntime(options);
|
|
9
24
|
const previousPiAgentDir = process.env.PI_CODING_AGENT_DIR;
|
|
10
25
|
const previousPiSkipVersionCheck = process.env.PI_SKIP_VERSION_CHECK;
|
|
@@ -17,6 +32,11 @@ export async function runLocalFelan(options = {}) {
|
|
|
17
32
|
...(options.initialMessage === undefined ? {} : { initialMessage: options.initialMessage }),
|
|
18
33
|
...(options.verbose === undefined ? {} : { verbose: options.verbose }),
|
|
19
34
|
});
|
|
35
|
+
installFelanCwdCommand(mode, {
|
|
36
|
+
getCwd: () => runtime.cwd,
|
|
37
|
+
isIdle: () => runtime.session.isIdle,
|
|
38
|
+
...(options.homeDir === undefined ? {} : { homeDir: options.homeDir }),
|
|
39
|
+
});
|
|
20
40
|
installFelanStartupHeader(mode, {
|
|
21
41
|
expanded: options.verbose === true,
|
|
22
42
|
memorySummaryPath: () => join(runtime.services.agentDir, 'storage', 'sessions', encodeURIComponent(runtime.session.sessionManager.getSessionId()), '.memory', 'summary.md'),
|
|
@@ -35,7 +55,14 @@ export async function runLocalFelan(options = {}) {
|
|
|
35
55
|
})
|
|
36
56
|
.catch(() => { });
|
|
37
57
|
try {
|
|
38
|
-
|
|
58
|
+
try {
|
|
59
|
+
await mode.run();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (error instanceof CwdChangeRequested)
|
|
63
|
+
return error.cwd;
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
39
66
|
}
|
|
40
67
|
finally {
|
|
41
68
|
modeActive = false;
|
package/dist/application.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EACL,uBAAuB,GAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { InteractiveMode } from '@earendil-works/pi-coding-agent';
|
|
2
|
+
export interface InstallFelanCwdCommandOptions {
|
|
3
|
+
readonly getCwd: () => string;
|
|
4
|
+
readonly isIdle: () => boolean;
|
|
5
|
+
readonly homeDir?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class CwdChangeRequested extends Error {
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
constructor(cwd: string);
|
|
10
|
+
}
|
|
11
|
+
export declare function installFelanCwdCommand(mode: InteractiveMode, options: InstallFelanCwdCommandOptions): void;
|
|
12
|
+
export declare function resolveCwdCommandTarget(command: string, cwd: string, homeDir?: string): string;
|
|
13
|
+
//# sourceMappingURL=cwd-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwd-command.d.ts","sourceRoot":"","sources":["../src/cwd-command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAsBvE,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM;gBAAX,GAAG,EAAE,MAAM;CAIjC;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,6BAA6B,GACrC,IAAI,CA2DN;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAkB,GAC1B,MAAM,CAgCR"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
const CWD_COMMAND = '/cwd';
|
|
5
|
+
const CWD_DESCRIPTION = 'Start a new session in another directory';
|
|
6
|
+
export class CwdChangeRequested extends Error {
|
|
7
|
+
cwd;
|
|
8
|
+
constructor(cwd) {
|
|
9
|
+
super(`Start a new session in ${cwd}`);
|
|
10
|
+
this.cwd = cwd;
|
|
11
|
+
this.name = 'CwdChangeRequested';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function installFelanCwdCommand(mode, options) {
|
|
15
|
+
const internals = mode;
|
|
16
|
+
if (typeof internals.createBaseAutocompleteProvider !== 'function'
|
|
17
|
+
|| typeof internals.getUserInput !== 'function'
|
|
18
|
+
|| typeof internals.setupEditorSubmitHandler !== 'function') {
|
|
19
|
+
throw new Error('The installed Pi version does not expose a compatible built-in command surface');
|
|
20
|
+
}
|
|
21
|
+
const createBaseAutocompleteProvider = internals.createBaseAutocompleteProvider.bind(mode);
|
|
22
|
+
internals.createBaseAutocompleteProvider = () => new CwdAutocompleteProvider(createBaseAutocompleteProvider());
|
|
23
|
+
let requestedCwd;
|
|
24
|
+
const getUserInput = internals.getUserInput.bind(mode);
|
|
25
|
+
internals.getUserInput = async () => {
|
|
26
|
+
const input = await getUserInput();
|
|
27
|
+
if (requestedCwd === undefined)
|
|
28
|
+
return input;
|
|
29
|
+
const cwd = requestedCwd;
|
|
30
|
+
requestedCwd = undefined;
|
|
31
|
+
throw new CwdChangeRequested(cwd);
|
|
32
|
+
};
|
|
33
|
+
const setupEditorSubmitHandler = internals.setupEditorSubmitHandler.bind(mode);
|
|
34
|
+
internals.setupEditorSubmitHandler = () => {
|
|
35
|
+
setupEditorSubmitHandler();
|
|
36
|
+
const submit = internals.defaultEditor.onSubmit;
|
|
37
|
+
if (typeof submit !== 'function') {
|
|
38
|
+
throw new Error('The installed Pi version did not install a compatible command submit handler');
|
|
39
|
+
}
|
|
40
|
+
internals.defaultEditor.onSubmit = (text) => {
|
|
41
|
+
if (!isCwdCommand(text)) {
|
|
42
|
+
submit(text);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!options.isIdle()) {
|
|
46
|
+
mode.showWarning('Wait for the current response to finish before changing directories');
|
|
47
|
+
internals.editor.setText(text);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
requestedCwd = resolveCwdCommandTarget(text, options.getCwd(), options.homeDir ?? homedir());
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
internals.defaultEditor.addToHistory(text);
|
|
55
|
+
internals.editor.setText(text);
|
|
56
|
+
mode.showError(error instanceof Error ? error.message : String(error));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
submit(text);
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function resolveCwdCommandTarget(command, cwd, homeDir = homedir()) {
|
|
64
|
+
const argument = cwdCommandArgument(command);
|
|
65
|
+
const expanded = argument === '~'
|
|
66
|
+
? homeDir
|
|
67
|
+
: argument.startsWith('~/') || argument.startsWith('~\\')
|
|
68
|
+
? resolve(homeDir, argument.slice(2))
|
|
69
|
+
: argument;
|
|
70
|
+
const target = resolve(cwd, expanded);
|
|
71
|
+
let canonicalTarget;
|
|
72
|
+
try {
|
|
73
|
+
canonicalTarget = realpathSync(target);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
const code = errorCode(error);
|
|
77
|
+
if (code === 'ENOENT' || code === 'ENOTDIR') {
|
|
78
|
+
throw new Error(`Directory does not exist: ${argument}`);
|
|
79
|
+
}
|
|
80
|
+
if (code === 'EACCES' || code === 'EPERM') {
|
|
81
|
+
throw new Error(`Directory is not accessible: ${argument}`);
|
|
82
|
+
}
|
|
83
|
+
throw new Error(`Cannot use directory ${argument}: ${errorMessage(error)}`);
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
if (!statSync(canonicalTarget).isDirectory()) {
|
|
87
|
+
throw new Error(`Not a directory: ${argument}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error instanceof Error && error.message === `Not a directory: ${argument}`)
|
|
92
|
+
throw error;
|
|
93
|
+
throw new Error(`Cannot use directory ${argument}: ${errorMessage(error)}`);
|
|
94
|
+
}
|
|
95
|
+
return canonicalTarget;
|
|
96
|
+
}
|
|
97
|
+
function isCwdCommand(text) {
|
|
98
|
+
const trimmed = text.trim();
|
|
99
|
+
return trimmed === CWD_COMMAND || trimmed.startsWith(`${CWD_COMMAND} `);
|
|
100
|
+
}
|
|
101
|
+
function cwdCommandArgument(command) {
|
|
102
|
+
const trimmed = command.trim();
|
|
103
|
+
if (!isCwdCommand(trimmed))
|
|
104
|
+
throw new Error(`Usage: ${CWD_COMMAND} <directory>`);
|
|
105
|
+
let argument = trimmed.slice(CWD_COMMAND.length).trim();
|
|
106
|
+
if (!argument)
|
|
107
|
+
throw new Error(`Usage: ${CWD_COMMAND} <directory>`);
|
|
108
|
+
const quote = argument[0];
|
|
109
|
+
if (quote === '"' || quote === "'") {
|
|
110
|
+
if (argument.length < 2 || argument.at(-1) !== quote) {
|
|
111
|
+
throw new Error('Directory path has an unterminated quote');
|
|
112
|
+
}
|
|
113
|
+
argument = argument.slice(1, -1);
|
|
114
|
+
}
|
|
115
|
+
if (!argument)
|
|
116
|
+
throw new Error(`Usage: ${CWD_COMMAND} <directory>`);
|
|
117
|
+
return argument;
|
|
118
|
+
}
|
|
119
|
+
function errorCode(error) {
|
|
120
|
+
return typeof error === 'object' && error !== null && 'code' in error
|
|
121
|
+
? String(error.code)
|
|
122
|
+
: undefined;
|
|
123
|
+
}
|
|
124
|
+
function errorMessage(error) {
|
|
125
|
+
return error instanceof Error ? error.message : String(error);
|
|
126
|
+
}
|
|
127
|
+
class CwdAutocompleteProvider {
|
|
128
|
+
current;
|
|
129
|
+
triggerCharacters;
|
|
130
|
+
constructor(current) {
|
|
131
|
+
this.current = current;
|
|
132
|
+
this.triggerCharacters = current.triggerCharacters ?? [];
|
|
133
|
+
}
|
|
134
|
+
async getSuggestions(lines, cursorLine, cursorCol, options) {
|
|
135
|
+
const currentLine = lines[cursorLine] ?? '';
|
|
136
|
+
const textBeforeCursor = currentLine.slice(0, cursorCol);
|
|
137
|
+
const argumentPrefix = getCwdArgumentPrefix(textBeforeCursor);
|
|
138
|
+
if (argumentPrefix !== undefined) {
|
|
139
|
+
const suggestions = await this.current.getSuggestions([argumentPrefix], 0, argumentPrefix.length, { ...options, force: true });
|
|
140
|
+
if (!suggestions)
|
|
141
|
+
return null;
|
|
142
|
+
const directories = suggestions.items.filter(({ label }) => label.endsWith('/'));
|
|
143
|
+
return directories.length === 0
|
|
144
|
+
? null
|
|
145
|
+
: { items: directories, prefix: suggestions.prefix };
|
|
146
|
+
}
|
|
147
|
+
const suggestions = await this.current.getSuggestions(lines, cursorLine, cursorCol, options);
|
|
148
|
+
const commandPrefix = getCommandPrefix(textBeforeCursor);
|
|
149
|
+
if (commandPrefix === undefined || !'cwd'.startsWith(commandPrefix.toLowerCase())) {
|
|
150
|
+
return suggestions;
|
|
151
|
+
}
|
|
152
|
+
if (suggestions?.items.some(({ value }) => value === 'cwd'))
|
|
153
|
+
return suggestions;
|
|
154
|
+
return {
|
|
155
|
+
items: [
|
|
156
|
+
...(suggestions?.items ?? []),
|
|
157
|
+
{ value: 'cwd', label: 'cwd', description: CWD_DESCRIPTION },
|
|
158
|
+
],
|
|
159
|
+
prefix: suggestions?.prefix ?? textBeforeCursor,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
|
|
163
|
+
return this.current.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
|
|
164
|
+
}
|
|
165
|
+
shouldTriggerFileCompletion(lines, cursorLine, cursorCol) {
|
|
166
|
+
return this.current.shouldTriggerFileCompletion?.(lines, cursorLine, cursorCol) ?? false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
function getCommandPrefix(textBeforeCursor) {
|
|
170
|
+
if (!textBeforeCursor.startsWith('/') || /\s/u.test(textBeforeCursor))
|
|
171
|
+
return undefined;
|
|
172
|
+
return textBeforeCursor.slice(1);
|
|
173
|
+
}
|
|
174
|
+
function getCwdArgumentPrefix(textBeforeCursor) {
|
|
175
|
+
const match = /^\/cwd\s+(.*)$/u.exec(textBeforeCursor);
|
|
176
|
+
return match?.[1];
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=cwd-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwd-command.js","sourceRoot":"","sources":["../src/cwd-command.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@felan-ai/felan",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.7",
|
|
4
4
|
"description": "Local Felan terminal agent",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -35,19 +35,19 @@
|
|
|
35
35
|
"open": "11.0.0",
|
|
36
36
|
"proper-lockfile": "4.1.2",
|
|
37
37
|
"@felan-ai/agent-core": "0.4.12",
|
|
38
|
+
"@felan-ai/ext-background-bash": "0.3.7",
|
|
38
39
|
"@felan-ai/ext-browser": "0.1.0",
|
|
40
|
+
"@felan-ai/ext-codex": "0.1.6",
|
|
39
41
|
"@felan-ai/ext-ask-user": "0.1.3",
|
|
40
|
-
"@felan-ai/ext-background-bash": "0.3.7",
|
|
41
|
-
"@felan-ai/ext-codex": "0.1.5",
|
|
42
42
|
"@felan-ai/ext-mcp": "0.1.2",
|
|
43
43
|
"@felan-ai/ext-subagents": "0.4.0",
|
|
44
44
|
"@felan-ai/ext-tasks": "0.1.3",
|
|
45
|
+
"@felan-ai/ext-context": "0.3.2",
|
|
45
46
|
"@felan-ai/ext-felan-api": "0.1.0",
|
|
47
|
+
"@felan-ai/ext-markitdown": "0.1.0",
|
|
46
48
|
"@felan-ai/ext-output-style": "0.1.0",
|
|
47
|
-
"@felan-ai/ext-context": "0.3.2",
|
|
48
49
|
"@felan-ai/ext-memory": "0.1.0",
|
|
49
50
|
"@felan-ai/ext-powerline": "0.4.2",
|
|
50
|
-
"@felan-ai/ext-markitdown": "0.1.0",
|
|
51
51
|
"@felan-ai/ext-prewalk": "0.3.5",
|
|
52
52
|
"@felan-ai/ext-rtk-optimizer": "0.1.1",
|
|
53
53
|
"@felan-ai/ext-web-access": "0.2.0"
|