@felan-ai/felan 0.1.0-alpha.3 → 0.2.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.
- package/NOTICE +1 -1
- package/README.md +69 -11
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +25 -2
- package/dist/application.js.map +1 -1
- package/dist/extensions.d.ts +13 -1
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +46 -5
- package/dist/extensions.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/runtime.d.ts +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +159 -124
- package/dist/runtime.js.map +1 -1
- package/dist/settings.d.ts +7 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +15 -3
- package/dist/settings.js.map +1 -1
- package/dist/subagents/catalog.d.ts +8 -0
- package/dist/subagents/catalog.d.ts.map +1 -0
- package/dist/subagents/catalog.js +132 -0
- package/dist/subagents/catalog.js.map +1 -0
- package/dist/subagents/host.d.ts +86 -0
- package/dist/subagents/host.d.ts.map +1 -0
- package/dist/subagents/host.js +994 -0
- package/dist/subagents/host.js.map +1 -0
- package/dist/subagents/presenter.d.ts +11 -0
- package/dist/subagents/presenter.d.ts.map +1 -0
- package/dist/subagents/presenter.js +34 -0
- package/dist/subagents/presenter.js.map +1 -0
- package/dist/subagents/store.d.ts +17 -0
- package/dist/subagents/store.d.ts.map +1 -0
- package/dist/subagents/store.js +34 -0
- package/dist/subagents/store.js.map +1 -0
- package/dist/system-prompt.d.ts +4 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +22 -0
- package/dist/system-prompt.js.map +1 -0
- package/package.json +8 -7
package/dist/runtime.js
CHANGED
|
@@ -1,38 +1,82 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
1
2
|
import { mkdir } from 'node:fs/promises';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
4
|
import { join, resolve } from 'node:path';
|
|
4
|
-
import { AGENT_CORE_VERSION, HostAgentRuntime, ModelRuntime, SessionManager,
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
5
|
+
import { AGENT_CORE_VERSION, HostAgentRuntime, ModelRuntime, SessionManager, createAgentCoreSessionRuntimeFactory, createAgentSessionRuntime, } from '@felan-ai/agent-core';
|
|
6
|
+
import { bindSubagentSession } from '@felan-ai/ext-subagents';
|
|
7
|
+
import { resolveModelScopeWithDiagnostics, } from '@earendil-works/pi-coding-agent';
|
|
8
|
+
import { createLocalExtensionImporter, importLocalExtension, resolveBuiltinExtensionPackages, } from './extensions.js';
|
|
9
|
+
import { createLocalSettingsManager, getFelanSettings } from './settings.js';
|
|
10
|
+
import { loadLocalAppendSystemPrompt } from './system-prompt.js';
|
|
11
|
+
import { LocalSubagentHost, } from './subagents/host.js';
|
|
12
|
+
const localSubagentHost = Symbol('localSubagentHost');
|
|
13
|
+
const localSubagentShutdown = Symbol('localSubagentShutdown');
|
|
8
14
|
export function getLocalAgentDir() {
|
|
9
|
-
return resolve(process.env.FELAN_AGENT_DIR ?? join(homedir(), '.felan'
|
|
15
|
+
return resolve(process.env.FELAN_AGENT_DIR ?? join(homedir(), '.felan'));
|
|
16
|
+
}
|
|
17
|
+
export function getLocalSkillPaths(cwd, homeDir = homedir()) {
|
|
18
|
+
return [...new Set([
|
|
19
|
+
resolve(cwd, '.agents', 'skills'),
|
|
20
|
+
resolve(homeDir, '.agents', 'skills'),
|
|
21
|
+
])].filter((path) => existsSync(path));
|
|
10
22
|
}
|
|
11
23
|
export function createLocalSessionRuntimeFactory(options) {
|
|
12
|
-
const
|
|
24
|
+
const sessions = new WeakMap();
|
|
25
|
+
const createCoreRuntime = createAgentCoreSessionRuntimeFactory(async ({ cwd, sessionManager }) => {
|
|
13
26
|
const settingsManager = createLocalSettingsManager(cwd, options.agentDir);
|
|
27
|
+
const felanSettings = getFelanSettings(settingsManager);
|
|
14
28
|
const modelPatterns = settingsManager.getEnabledModels();
|
|
15
29
|
const modelScope = modelPatterns && modelPatterns.length > 0
|
|
16
30
|
? await resolveModelScopeWithDiagnostics(modelPatterns, options.modelRuntime)
|
|
17
31
|
: { scopedModels: [], diagnostics: [] };
|
|
32
|
+
const extensionPackages = options.extensionPackages
|
|
33
|
+
?? resolveBuiltinExtensionPackages(felanSettings.builtinExtensions);
|
|
34
|
+
const importExtension = options.importExtension ?? importLocalExtension;
|
|
35
|
+
const skillPaths = options.skillPaths ?? getLocalSkillPaths(cwd);
|
|
36
|
+
const subagentSettings = options.subagentSettings ?? felanSettings.felanSubagents;
|
|
37
|
+
const appendSystemPrompt = await loadLocalAppendSystemPrompt(options.agentDir);
|
|
38
|
+
const host = await LocalSubagentHost.create({
|
|
39
|
+
sessionId: sessionManager.getSessionId(),
|
|
40
|
+
cwd,
|
|
41
|
+
agentDir: options.agentDir,
|
|
42
|
+
modelRuntime: options.modelRuntime,
|
|
43
|
+
settingsManager,
|
|
44
|
+
extensionPackages,
|
|
45
|
+
importExtension,
|
|
46
|
+
skillPaths,
|
|
47
|
+
...(options.runtimeFactory === undefined ? {} : { runtimeFactory: options.runtimeFactory }),
|
|
48
|
+
...(subagentSettings === undefined ? {} : { settings: subagentSettings }),
|
|
49
|
+
});
|
|
50
|
+
const shutdownState = { failed: false };
|
|
51
|
+
const shutdownHost = async () => {
|
|
52
|
+
try {
|
|
53
|
+
await host.shutdown();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
shutdownState.failed = true;
|
|
57
|
+
shutdownState.error = error;
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
sessions.set(sessionManager, { host, modelScope, shutdownState });
|
|
18
62
|
return {
|
|
19
|
-
applicationKind: 'tui',
|
|
20
63
|
runtime: options.runtimeFactory?.(cwd) ?? new HostAgentRuntime(cwd),
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
importExtension: options.importExtension ?? importLocalExtension,
|
|
64
|
+
extensionPackages,
|
|
65
|
+
importExtension: createLocalExtensionImporter(host, importExtension, shutdownHost),
|
|
24
66
|
modelRuntime: options.modelRuntime,
|
|
25
67
|
settingsManager,
|
|
68
|
+
skillPaths,
|
|
69
|
+
...(appendSystemPrompt === undefined ? {} : { appendSystemPrompt: [appendSystemPrompt] }),
|
|
26
70
|
...(modelScope.scopedModels.length === 0 ? {} : { scopedModels: modelScope.scopedModels }),
|
|
27
71
|
};
|
|
28
72
|
});
|
|
29
73
|
return async (request) => {
|
|
30
74
|
const result = await createCoreRuntime(request);
|
|
75
|
+
const { host, modelScope, shutdownState } = sessions.get(request.sessionManager);
|
|
76
|
+
bindSubagentSession({ host, session: result.session });
|
|
77
|
+
Object.defineProperty(result.services, localSubagentHost, { value: host });
|
|
78
|
+
Object.defineProperty(result.services, localSubagentShutdown, { value: shutdownState });
|
|
31
79
|
const settingsErrors = result.services.settingsManager.drainErrors();
|
|
32
|
-
const modelPatterns = result.services.settingsManager.getEnabledModels();
|
|
33
|
-
const modelScope = modelPatterns && modelPatterns.length > 0
|
|
34
|
-
? await resolveModelScopeWithDiagnostics(modelPatterns, options.modelRuntime)
|
|
35
|
-
: { diagnostics: [] };
|
|
36
80
|
return {
|
|
37
81
|
...result,
|
|
38
82
|
diagnostics: [
|
|
@@ -47,114 +91,6 @@ export function createLocalSessionRuntimeFactory(options) {
|
|
|
47
91
|
};
|
|
48
92
|
};
|
|
49
93
|
}
|
|
50
|
-
export function createLocalSessionHost(options, cwd) {
|
|
51
|
-
return {
|
|
52
|
-
createChildSession: async (request) => {
|
|
53
|
-
const sessionManager = SessionManager.inMemory(cwd);
|
|
54
|
-
const childSessionId = sessionManager.getSessionId();
|
|
55
|
-
const resolvedModel = request.model
|
|
56
|
-
? resolveCliModel({ cliModel: request.model, modelRuntime: options.modelRuntime })
|
|
57
|
-
: undefined;
|
|
58
|
-
if (resolvedModel?.error) {
|
|
59
|
-
return {
|
|
60
|
-
ok: false,
|
|
61
|
-
sessionId: childSessionId,
|
|
62
|
-
status: 'failed',
|
|
63
|
-
error: resolvedModel.error,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
const created = await createAgentCoreSession({
|
|
67
|
-
applicationKind: 'tui',
|
|
68
|
-
runtime: options.runtimeFactory?.(cwd) ?? new HostAgentRuntime(cwd),
|
|
69
|
-
host: createLocalSessionHost(options, cwd),
|
|
70
|
-
extensionPackages: options.extensionPackages ?? localExtensionPackages,
|
|
71
|
-
importExtension: options.importExtension ?? importLocalExtension,
|
|
72
|
-
modelRuntime: options.modelRuntime,
|
|
73
|
-
settingsManager: createLocalSettingsManager(cwd, options.agentDir),
|
|
74
|
-
sessionManager,
|
|
75
|
-
appendSystemPrompt: [`You are the ${request.personaId} child agent.`],
|
|
76
|
-
...(resolvedModel?.model === undefined ? {} : { model: resolvedModel.model }),
|
|
77
|
-
...(resolvedModel?.thinkingLevel === undefined
|
|
78
|
-
? {}
|
|
79
|
-
: { thinkingLevel: resolvedModel.thinkingLevel }),
|
|
80
|
-
});
|
|
81
|
-
try {
|
|
82
|
-
await created.session.bindExtensions({ mode: 'print' });
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
created.session.dispose();
|
|
86
|
-
throw error;
|
|
87
|
-
}
|
|
88
|
-
const runChild = async () => {
|
|
89
|
-
let timeout;
|
|
90
|
-
if (request.timeoutMinutes) {
|
|
91
|
-
timeout = setTimeout(() => void created.session.abort(), request.timeoutMinutes * 60_000);
|
|
92
|
-
timeout.unref();
|
|
93
|
-
}
|
|
94
|
-
try {
|
|
95
|
-
await created.session.prompt(request.prompt);
|
|
96
|
-
let assistant;
|
|
97
|
-
for (let index = created.session.messages.length - 1; index >= 0; index -= 1) {
|
|
98
|
-
const message = created.session.messages[index];
|
|
99
|
-
if (message?.role === 'assistant') {
|
|
100
|
-
assistant = message;
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (!assistant) {
|
|
105
|
-
return {
|
|
106
|
-
ok: false,
|
|
107
|
-
sessionId: childSessionId,
|
|
108
|
-
status: 'failed',
|
|
109
|
-
error: 'Child session completed without an assistant response',
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (assistant.stopReason === 'error' || assistant.stopReason === 'aborted') {
|
|
113
|
-
return {
|
|
114
|
-
ok: false,
|
|
115
|
-
sessionId: childSessionId,
|
|
116
|
-
status: 'failed',
|
|
117
|
-
error: assistant.errorMessage ?? `Child session ${assistant.stopReason}`,
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
const result = assistant.content
|
|
121
|
-
.filter((part) => part.type === 'text')
|
|
122
|
-
.map((part) => part.text)
|
|
123
|
-
.join('\n');
|
|
124
|
-
return {
|
|
125
|
-
ok: true,
|
|
126
|
-
sessionId: childSessionId,
|
|
127
|
-
status: 'completed',
|
|
128
|
-
result,
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
return {
|
|
133
|
-
ok: false,
|
|
134
|
-
sessionId: childSessionId,
|
|
135
|
-
status: 'failed',
|
|
136
|
-
error: error instanceof Error ? error.message : String(error),
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
if (timeout)
|
|
141
|
-
clearTimeout(timeout);
|
|
142
|
-
created.session.dispose();
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
if (!request.block) {
|
|
146
|
-
void runChild();
|
|
147
|
-
return {
|
|
148
|
-
ok: true,
|
|
149
|
-
sessionId: childSessionId,
|
|
150
|
-
status: 'running',
|
|
151
|
-
message: 'Child session started',
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
return runChild();
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
94
|
export async function createLocalModelRuntime(agentDir) {
|
|
159
95
|
return ModelRuntime.create({
|
|
160
96
|
authPath: join(agentDir, 'auth.json'),
|
|
@@ -167,7 +103,7 @@ export async function createLocalFelanRuntime(options = {}) {
|
|
|
167
103
|
await mkdir(agentDir, { recursive: true });
|
|
168
104
|
const modelRuntime = options.modelRuntime ?? await createLocalModelRuntime(agentDir);
|
|
169
105
|
const startupSettings = createLocalSettingsManager(cwd, agentDir);
|
|
170
|
-
const sessionDir = options.sessionDir ?? startupSettings.getSessionDir();
|
|
106
|
+
const sessionDir = options.sessionDir ?? startupSettings.getSessionDir() ?? join(agentDir, 'sessions');
|
|
171
107
|
const sessionManager = options.sessionManager
|
|
172
108
|
?? (options.continueRecent
|
|
173
109
|
? SessionManager.continueRecent(cwd, sessionDir)
|
|
@@ -176,11 +112,110 @@ export async function createLocalFelanRuntime(options = {}) {
|
|
|
176
112
|
agentDir,
|
|
177
113
|
modelRuntime,
|
|
178
114
|
...(options.runtimeFactory === undefined ? {} : { runtimeFactory: options.runtimeFactory }),
|
|
115
|
+
...(options.skillPaths === undefined ? {} : { skillPaths: options.skillPaths }),
|
|
116
|
+
...(options.subagentSettings === undefined ? {} : { subagentSettings: options.subagentSettings }),
|
|
179
117
|
});
|
|
180
|
-
|
|
118
|
+
const runtime = await createAgentSessionRuntime(createRuntime, {
|
|
181
119
|
cwd: sessionManager.getCwd(),
|
|
182
120
|
agentDir,
|
|
183
121
|
sessionManager,
|
|
184
122
|
});
|
|
123
|
+
return installLocalSubagentLifecycle(runtime);
|
|
124
|
+
}
|
|
125
|
+
function getRuntimeLocalSubagentHost(runtime) {
|
|
126
|
+
const host = runtime.services[localSubagentHost];
|
|
127
|
+
if (!host)
|
|
128
|
+
throw new Error('Local subagent host is unavailable');
|
|
129
|
+
return host;
|
|
130
|
+
}
|
|
131
|
+
function getRuntimeLocalSubagentShutdown(runtime) {
|
|
132
|
+
const state = runtime.services[localSubagentShutdown];
|
|
133
|
+
if (!state)
|
|
134
|
+
throw new Error('Local subagent shutdown state is unavailable');
|
|
135
|
+
return state;
|
|
136
|
+
}
|
|
137
|
+
function installLocalSubagentLifecycle(runtime) {
|
|
138
|
+
const listeners = new Set();
|
|
139
|
+
const localRuntime = runtime;
|
|
140
|
+
Object.defineProperties(localRuntime, {
|
|
141
|
+
localSubagentHost: { get: () => getRuntimeLocalSubagentHost(runtime) },
|
|
142
|
+
subscribeLocalSubagentHost: {
|
|
143
|
+
value: (listener) => {
|
|
144
|
+
listeners.add(listener);
|
|
145
|
+
return () => listeners.delete(listener);
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
const notifyHostReplacement = () => {
|
|
150
|
+
const host = localRuntime.localSubagentHost;
|
|
151
|
+
for (const listener of listeners)
|
|
152
|
+
listener(host);
|
|
153
|
+
};
|
|
154
|
+
const dispose = runtime.dispose.bind(runtime);
|
|
155
|
+
runtime.dispose = async () => {
|
|
156
|
+
const shutdownState = getRuntimeLocalSubagentShutdown(runtime);
|
|
157
|
+
const session = runtime.session;
|
|
158
|
+
const sessionDispose = session.dispose;
|
|
159
|
+
let piDisposalStarted = false;
|
|
160
|
+
const observedDispose = () => {
|
|
161
|
+
piDisposalStarted = true;
|
|
162
|
+
sessionDispose.call(session);
|
|
163
|
+
};
|
|
164
|
+
session.dispose = observedDispose;
|
|
165
|
+
let disposeFailed = false;
|
|
166
|
+
let disposeError;
|
|
167
|
+
try {
|
|
168
|
+
await dispose();
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
disposeFailed = true;
|
|
172
|
+
disposeError = error;
|
|
173
|
+
if (!piDisposalStarted) {
|
|
174
|
+
try {
|
|
175
|
+
observedDispose();
|
|
176
|
+
}
|
|
177
|
+
catch (fallbackError) {
|
|
178
|
+
throw new AggregateError([error, fallbackError], 'Local runtime shutdown and Pi disposal both failed');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
if (session.dispose === observedDispose)
|
|
184
|
+
session.dispose = sessionDispose;
|
|
185
|
+
}
|
|
186
|
+
if (disposeFailed)
|
|
187
|
+
throw disposeError;
|
|
188
|
+
if (shutdownState.failed)
|
|
189
|
+
throw shutdownState.error;
|
|
190
|
+
};
|
|
191
|
+
const switchSession = runtime.switchSession.bind(runtime);
|
|
192
|
+
runtime.switchSession = async (...args) => {
|
|
193
|
+
const result = await switchSession(...args);
|
|
194
|
+
if (!result.cancelled)
|
|
195
|
+
notifyHostReplacement();
|
|
196
|
+
return result;
|
|
197
|
+
};
|
|
198
|
+
const newSession = runtime.newSession.bind(runtime);
|
|
199
|
+
runtime.newSession = async (...args) => {
|
|
200
|
+
const result = await newSession(...args);
|
|
201
|
+
if (!result.cancelled)
|
|
202
|
+
notifyHostReplacement();
|
|
203
|
+
return result;
|
|
204
|
+
};
|
|
205
|
+
const fork = runtime.fork.bind(runtime);
|
|
206
|
+
runtime.fork = async (...args) => {
|
|
207
|
+
const result = await fork(...args);
|
|
208
|
+
if (!result.cancelled)
|
|
209
|
+
notifyHostReplacement();
|
|
210
|
+
return result;
|
|
211
|
+
};
|
|
212
|
+
const importFromJsonl = runtime.importFromJsonl.bind(runtime);
|
|
213
|
+
runtime.importFromJsonl = async (...args) => {
|
|
214
|
+
const result = await importFromJsonl(...args);
|
|
215
|
+
if (!result.cancelled)
|
|
216
|
+
notifyHostReplacement();
|
|
217
|
+
return result;
|
|
218
|
+
};
|
|
219
|
+
return localRuntime;
|
|
185
220
|
}
|
|
186
221
|
//# sourceMappingURL=runtime.js.map
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/settings.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { SettingsManager } from '@felan-ai/agent-core';
|
|
2
|
+
import type { BuiltinExtensionSettings } from './extensions.js';
|
|
3
|
+
import type { LocalSubagentSettings } from './subagents/host.js';
|
|
4
|
+
export interface FelanSettings {
|
|
5
|
+
readonly builtinExtensions?: BuiltinExtensionSettings;
|
|
6
|
+
readonly felanSubagents?: LocalSubagentSettings;
|
|
7
|
+
}
|
|
2
8
|
export declare function createLocalSettingsManager(cwd: string, agentDir: string): SettingsManager;
|
|
9
|
+
export declare function getFelanSettings(settingsManager: SettingsManager): FelanSettings;
|
|
3
10
|
//# sourceMappingURL=settings.d.ts.map
|
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IACtD,QAAQ,CAAC,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACjD;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAmCzF;AAED,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,eAAe,GAAG,aAAa,CAEhF"}
|
package/dist/settings.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import { VERSION as PI_VERSION } from '@earendil-works/pi-coding-agent';
|
|
1
2
|
import { SettingsManager } from '@felan-ai/agent-core';
|
|
2
3
|
export function createLocalSettingsManager(cwd, agentDir) {
|
|
3
|
-
const settingsManager = SettingsManager.create(cwd, agentDir);
|
|
4
|
+
const settingsManager = SettingsManager.create(cwd, agentDir, { projectTrusted: false });
|
|
5
|
+
// Felan's fixed resource policy makes Pi project trust unnecessary.
|
|
6
|
+
settingsManager.isProjectTrusted = () => true;
|
|
7
|
+
settingsManager.setProjectTrusted = () => { };
|
|
4
8
|
const filteredResources = {
|
|
5
9
|
packages: [],
|
|
6
10
|
extensions: [],
|
|
@@ -8,13 +12,18 @@ export function createLocalSettingsManager(cwd, agentDir) {
|
|
|
8
12
|
prompts: [],
|
|
9
13
|
themes: [],
|
|
10
14
|
};
|
|
15
|
+
const runtimeOverrides = {
|
|
16
|
+
...filteredResources,
|
|
17
|
+
enableInstallTelemetry: false,
|
|
18
|
+
lastChangelogVersion: PI_VERSION,
|
|
19
|
+
};
|
|
11
20
|
const reload = settingsManager.reload.bind(settingsManager);
|
|
12
21
|
const getGlobalSettings = settingsManager.getGlobalSettings.bind(settingsManager);
|
|
13
22
|
const getProjectSettings = settingsManager.getProjectSettings.bind(settingsManager);
|
|
14
|
-
settingsManager.applyOverrides(
|
|
23
|
+
settingsManager.applyOverrides(runtimeOverrides);
|
|
15
24
|
settingsManager.reload = async () => {
|
|
16
25
|
await reload();
|
|
17
|
-
settingsManager.applyOverrides(
|
|
26
|
+
settingsManager.applyOverrides(runtimeOverrides);
|
|
18
27
|
};
|
|
19
28
|
settingsManager.getGlobalSettings = () => ({
|
|
20
29
|
...getGlobalSettings(),
|
|
@@ -26,4 +35,7 @@ export function createLocalSettingsManager(cwd, agentDir) {
|
|
|
26
35
|
});
|
|
27
36
|
return settingsManager;
|
|
28
37
|
}
|
|
38
|
+
export function getFelanSettings(settingsManager) {
|
|
39
|
+
return settingsManager.getGlobalSettings();
|
|
40
|
+
}
|
|
29
41
|
//# sourceMappingURL=settings.js.map
|
package/dist/settings.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AASvD,MAAM,UAAU,0BAA0B,CAAC,GAAW,EAAE,QAAgB;IACtE,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,oEAAoE;IACpE,eAAe,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;IAC9C,eAAe,CAAC,iBAAiB,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAC7C,MAAM,iBAAiB,GAAG;QACxB,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,EAAE;QACd,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;KACX,CAAC;IACF,MAAM,gBAAgB,GAAG;QACvB,GAAG,iBAAiB;QACpB,sBAAsB,EAAE,KAAK;QAC7B,oBAAoB,EAAE,UAAU;KACjC,CAAC;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClF,MAAM,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAEpF,eAAe,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACjD,eAAe,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;QAClC,MAAM,MAAM,EAAE,CAAC;QACf,eAAe,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACnD,CAAC,CAAC;IACF,eAAe,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC,CAAC;QACzC,GAAG,iBAAiB,EAAE;QACtB,GAAG,iBAAiB;KACrB,CAAC,CAAC;IACH,eAAe,CAAC,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC;QAC1C,GAAG,kBAAkB,EAAE;QACvB,GAAG,iBAAiB;KACrB,CAAC,CAAC;IACH,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,eAAgC;IAC/D,OAAO,eAAe,CAAC,iBAAiB,EAAmB,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SubagentDescriptor } from '@felan-ai/ext-subagents';
|
|
2
|
+
export interface LocalSubagentDefinition {
|
|
3
|
+
readonly descriptor: SubagentDescriptor;
|
|
4
|
+
readonly prompt: string;
|
|
5
|
+
readonly capability: 'coding' | 'read-only';
|
|
6
|
+
}
|
|
7
|
+
export declare function discoverLocalSubagents(cwd: string, agentDir: string): Promise<readonly LocalSubagentDefinition[]>;
|
|
8
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/subagents/catalog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC7C;AAgCD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAS7C"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
2
|
+
import { basename, extname, join } from 'node:path';
|
|
3
|
+
const bundledDefinitions = [
|
|
4
|
+
{
|
|
5
|
+
descriptor: {
|
|
6
|
+
id: 'general',
|
|
7
|
+
description: 'General-purpose agent for implementation and investigation',
|
|
8
|
+
allowNesting: true,
|
|
9
|
+
},
|
|
10
|
+
prompt: 'You are a general-purpose Felan subagent. Complete the assigned task and report a concise result.',
|
|
11
|
+
capability: 'coding',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
descriptor: {
|
|
15
|
+
id: 'explore',
|
|
16
|
+
description: 'Read-focused agent for codebase exploration and analysis',
|
|
17
|
+
allowNesting: false,
|
|
18
|
+
},
|
|
19
|
+
prompt: 'You are a read-focused Felan subagent. Investigate the assigned task and report findings without modifying files.',
|
|
20
|
+
capability: 'read-only',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
descriptor: {
|
|
24
|
+
id: 'reviewer',
|
|
25
|
+
description: 'Code reviewer focused on correctness and regressions',
|
|
26
|
+
allowNesting: false,
|
|
27
|
+
},
|
|
28
|
+
prompt: 'You are a Felan code-review subagent. Inspect the assigned work for correctness, security, and regressions.',
|
|
29
|
+
capability: 'read-only',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
export async function discoverLocalSubagents(cwd, agentDir) {
|
|
33
|
+
const definitions = new Map(bundledDefinitions.map((definition) => [definition.descriptor.id, definition]));
|
|
34
|
+
for (const definition of await readDefinitions(join(agentDir, 'agents'))) {
|
|
35
|
+
definitions.set(definition.descriptor.id, definition);
|
|
36
|
+
}
|
|
37
|
+
for (const definition of await readDefinitions(join(cwd, '.felan', 'agents'))) {
|
|
38
|
+
definitions.set(definition.descriptor.id, definition);
|
|
39
|
+
}
|
|
40
|
+
return [...definitions.values()].map(freezeDefinition);
|
|
41
|
+
}
|
|
42
|
+
async function readDefinitions(directory) {
|
|
43
|
+
let files;
|
|
44
|
+
try {
|
|
45
|
+
files = (await readdir(directory, { withFileTypes: true }))
|
|
46
|
+
.filter((entry) => entry.isFile() && extname(entry.name) === '.md')
|
|
47
|
+
.map((entry) => entry.name)
|
|
48
|
+
.sort();
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (isMissing(error))
|
|
52
|
+
return [];
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
const definitions = [];
|
|
56
|
+
for (const file of files) {
|
|
57
|
+
definitions.push(parseDefinition(file, await readFile(join(directory, file), 'utf8')));
|
|
58
|
+
}
|
|
59
|
+
return definitions;
|
|
60
|
+
}
|
|
61
|
+
function parseDefinition(file, source) {
|
|
62
|
+
const { fields, body } = frontmatter(source);
|
|
63
|
+
const id = fields.id ?? basename(file, '.md');
|
|
64
|
+
if (!/^[a-z0-9][a-z0-9_-]*$/.test(id))
|
|
65
|
+
throw new Error(`Invalid Felan agent id in ${file}`);
|
|
66
|
+
const description = fields.description?.trim();
|
|
67
|
+
if (!description)
|
|
68
|
+
throw new Error(`Felan agent ${file} requires a description`);
|
|
69
|
+
if (!body.trim())
|
|
70
|
+
throw new Error(`Felan agent ${file} requires a prompt body`);
|
|
71
|
+
const thinking = parseThinking(fields.thinking, file);
|
|
72
|
+
const defaultMaxTurns = parsePositiveInteger(fields.max_turns, 'max_turns', file);
|
|
73
|
+
const defaultTimeoutSeconds = parsePositiveInteger(fields.timeout_seconds, 'timeout_seconds', file);
|
|
74
|
+
const capability = fields.capability ?? 'coding';
|
|
75
|
+
if (capability !== 'coding' && capability !== 'read-only') {
|
|
76
|
+
throw new Error(`Felan agent ${file} has an unknown capability`);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
descriptor: {
|
|
80
|
+
id,
|
|
81
|
+
description,
|
|
82
|
+
allowNesting: capability === 'coding' && fields.allow_nesting === 'true',
|
|
83
|
+
...(fields.model === undefined ? {} : { defaultModel: fields.model }),
|
|
84
|
+
...(thinking === undefined ? {} : { defaultThinking: thinking }),
|
|
85
|
+
...(defaultMaxTurns === undefined ? {} : { defaultMaxTurns }),
|
|
86
|
+
...(defaultTimeoutSeconds === undefined ? {} : { defaultTimeoutSeconds }),
|
|
87
|
+
},
|
|
88
|
+
prompt: body.trim(),
|
|
89
|
+
capability,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function frontmatter(source) {
|
|
93
|
+
if (!source.startsWith('---\n'))
|
|
94
|
+
return { fields: {}, body: source };
|
|
95
|
+
const end = source.indexOf('\n---\n', 4);
|
|
96
|
+
if (end < 0)
|
|
97
|
+
return { fields: {}, body: source };
|
|
98
|
+
const fields = {};
|
|
99
|
+
for (const line of source.slice(4, end).split('\n')) {
|
|
100
|
+
const separator = line.indexOf(':');
|
|
101
|
+
if (separator <= 0)
|
|
102
|
+
continue;
|
|
103
|
+
fields[line.slice(0, separator).trim()] = line.slice(separator + 1).trim();
|
|
104
|
+
}
|
|
105
|
+
return { fields, body: source.slice(end + 5) };
|
|
106
|
+
}
|
|
107
|
+
function parseThinking(value, file) {
|
|
108
|
+
if (!value)
|
|
109
|
+
return undefined;
|
|
110
|
+
if (!['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'].includes(value)) {
|
|
111
|
+
throw new Error(`Felan agent ${file} has invalid thinking`);
|
|
112
|
+
}
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
function parsePositiveInteger(value, field, file) {
|
|
116
|
+
if (value === undefined)
|
|
117
|
+
return undefined;
|
|
118
|
+
const parsed = Number(value);
|
|
119
|
+
if (!Number.isInteger(parsed) || parsed < 1)
|
|
120
|
+
throw new Error(`Felan agent ${file} has invalid ${field}`);
|
|
121
|
+
return parsed;
|
|
122
|
+
}
|
|
123
|
+
function freezeDefinition(definition) {
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
...definition,
|
|
126
|
+
descriptor: Object.freeze({ ...definition.descriptor }),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
function isMissing(error) {
|
|
130
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT';
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/subagents/catalog.ts"],"names":[],"mappings":"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"}
|