@felan-ai/felan 0.12.7 → 0.12.9
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 +4 -0
- package/README.md +86 -4
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +5 -1
- package/dist/application.js.map +1 -1
- package/dist/extensions.d.ts +9 -2
- package/dist/extensions.d.ts.map +1 -1
- package/dist/extensions.js +9 -1
- package/dist/extensions.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lock.d.ts +15 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +169 -0
- package/dist/lock.js.map +1 -0
- package/dist/memory/control.d.ts +8 -0
- package/dist/memory/control.d.ts.map +1 -0
- package/dist/memory/control.js +106 -0
- package/dist/memory/control.js.map +1 -0
- package/dist/memory/coordinator.d.ts +38 -0
- package/dist/memory/coordinator.d.ts.map +1 -0
- package/dist/memory/coordinator.js +396 -0
- package/dist/memory/coordinator.js.map +1 -0
- package/dist/memory/dreamer.d.ts +41 -0
- package/dist/memory/dreamer.d.ts.map +1 -0
- package/dist/memory/dreamer.js +531 -0
- package/dist/memory/dreamer.js.map +1 -0
- package/dist/memory/lease.d.ts +13 -0
- package/dist/memory/lease.d.ts.map +1 -0
- package/dist/memory/lease.js +188 -0
- package/dist/memory/lease.js.map +1 -0
- package/dist/memory/project.d.ts +7 -0
- package/dist/memory/project.d.ts.map +1 -0
- package/dist/memory/project.js +41 -0
- package/dist/memory/project.js.map +1 -0
- package/dist/memory/store.d.ts +52 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +344 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/runtime.d.ts +5 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +68 -10
- package/dist/runtime.js.map +1 -1
- package/dist/settings.d.ts +3 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +61 -27
- package/dist/settings.js.map +1 -1
- package/dist/startup-header.d.ts +1 -0
- package/dist/startup-header.d.ts.map +1 -1
- package/dist/startup-header.js +40 -0
- package/dist/startup-header.js.map +1 -1
- package/dist/subagents/agent-navigator.d.ts.map +1 -1
- package/dist/subagents/agent-navigator.js +11 -2
- package/dist/subagents/agent-navigator.js.map +1 -1
- package/dist/subagents/agent-transcript.d.ts.map +1 -1
- package/dist/subagents/agent-transcript.js +14 -2
- package/dist/subagents/agent-transcript.js.map +1 -1
- package/dist/subagents/catalog.d.ts.map +1 -1
- package/dist/subagents/catalog.js +4 -2
- package/dist/subagents/catalog.js.map +1 -1
- package/dist/subagents/host.d.ts +6 -0
- package/dist/subagents/host.d.ts.map +1 -1
- package/dist/subagents/host.js +11 -7
- package/dist/subagents/host.js.map +1 -1
- package/dist/tool-activity/presentation.d.ts.map +1 -1
- package/dist/tool-activity/presentation.js +205 -4
- package/dist/tool-activity/presentation.js.map +1 -1
- package/dist/tool-activity/runtime-view.d.ts +1 -0
- package/dist/tool-activity/runtime-view.d.ts.map +1 -1
- package/dist/tool-activity/runtime-view.js +13 -2
- package/dist/tool-activity/runtime-view.js.map +1 -1
- package/dist/tool-activity/state.d.ts +3 -1
- package/dist/tool-activity/state.d.ts.map +1 -1
- package/dist/tool-activity/state.js +6 -1
- package/dist/tool-activity/state.js.map +1 -1
- package/package.json +8 -7
package/NOTICE
CHANGED
|
@@ -6,6 +6,10 @@ This package composes the MIT-licensed @felan-ai/agent-core and Felan extension
|
|
|
6
6
|
packages listed in package.json. Their package-level LICENSE and NOTICE files
|
|
7
7
|
contain the applicable attribution and source provenance.
|
|
8
8
|
|
|
9
|
+
The local-first memory integration is original MIT-licensed Felan code from
|
|
10
|
+
@felan-ai/ext-memory. Its package-level LICENSE and NOTICE contain the
|
|
11
|
+
applicable attribution.
|
|
12
|
+
|
|
9
13
|
The terminal application uses @earendil-works/pi-coding-agent and
|
|
10
14
|
@earendil-works/pi-tui 0.84.2 from https://github.com/earendil-works/pi,
|
|
11
15
|
licensed under the MIT License.
|
package/README.md
CHANGED
|
@@ -15,6 +15,72 @@ global settings from `~/.felan/settings.json` and does not load Pi project
|
|
|
15
15
|
settings. Pi project trust does not apply to Felan's fixed resource policy, so
|
|
16
16
|
Felan starts without a project trust prompt.
|
|
17
17
|
|
|
18
|
+
Local memory is enabled by default and works without a Felan account or cloud
|
|
19
|
+
connection. It consolidates settled root-session evidence into an inspectable
|
|
20
|
+
Markdown wiki. The canonical project store is outside the customer repository:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
$FELAN_AGENT_DIR/memory/v1/projects/<project-hash>/
|
|
24
|
+
state.json
|
|
25
|
+
current/summary.md
|
|
26
|
+
current/index.md
|
|
27
|
+
current/pages/...
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The project hash is derived from the canonical Git root, or the canonical cwd
|
|
31
|
+
when no repository exists. Root-session storage receives a non-authoritative
|
|
32
|
+
copy at `storage/sessions/<root-id>/.memory`; child sessions can read that copy
|
|
33
|
+
but ordinary edits never publish it. Felan does not create `<repository>/.memory`
|
|
34
|
+
and does not synchronize local memory with cloud team memory.
|
|
35
|
+
Each session receives one hidden persisted memory-context entry at startup;
|
|
36
|
+
provider calls reuse it, and compaction or tree navigation restores it only if
|
|
37
|
+
it is no longer on the active branch. That entry is excluded from memory
|
|
38
|
+
evidence processing. Once it loads successfully, the welcome screen's
|
|
39
|
+
`[Context]` section lists the projected `.memory/summary.md` path alongside
|
|
40
|
+
project instructions so the loaded summary can be opened directly. The summary
|
|
41
|
+
is orientation only: substantive memory-backed answers should follow the
|
|
42
|
+
projected absolute `index.md` links to relevant pages and cite page paths and
|
|
43
|
+
their `Sources` session IDs.
|
|
44
|
+
|
|
45
|
+
Use `/memory status`, `/memory run`, `/memory enable`, `/memory disable`, or
|
|
46
|
+
`/memory open` to inspect and control local processing. A missing local model
|
|
47
|
+
credential never prevents startup or recall of existing memory; processing
|
|
48
|
+
remains pending until a configured model is available. Processing is idle
|
|
49
|
+
batched while Felan runs and catches up on the next launch after shutdown. The
|
|
50
|
+
enable/disable commands persist `felanTui.memoryProcessing` and do not remove
|
|
51
|
+
the memory recall extension.
|
|
52
|
+
|
|
53
|
+
After checkpoints are recorded, the TUI coordinator owns idle batching,
|
|
54
|
+
startup recovery, retries, and shutdown cancellation. Each batch runs one
|
|
55
|
+
disposable headless Pi memory-dreamer session against staging. It reads the
|
|
56
|
+
immutable `.dreaming/input` manifest and transcripts, edits staged `.memory`
|
|
57
|
+
files in place, and returns only a concise completion summary. The worker has
|
|
58
|
+
no normal Felan extensions, skills, repository context, credentials, or
|
|
59
|
+
process execution; its active tools are limited to `read`, `ls`, `edit`, and
|
|
60
|
+
`write`. The worker has no separate turn, tool-call, or per-file I/O budgets;
|
|
61
|
+
the only execution failsafe is a one-hour wall-clock timeout. The coordinator
|
|
62
|
+
validates and publishes the staged filesystem output, so model, validation,
|
|
63
|
+
cancellation, timeout, or publication failures leave evidence pending for
|
|
64
|
+
retry. The worker uses the active root-session model when it is authenticated;
|
|
65
|
+
if that model is unavailable, it falls back to another authenticated available
|
|
66
|
+
model. With no authenticated model, evidence remains pending. The portable
|
|
67
|
+
`@felan-ai/ext-memory` extension only recalls memory and records root
|
|
68
|
+
checkpoints; it does not schedule dreaming.
|
|
69
|
+
|
|
70
|
+
Evidence ingestion is separate from the worker's file-tool policy. The host
|
|
71
|
+
opens each checkpoint's append-only JSONL session with a bounded snapshot and
|
|
72
|
+
streams only the visible active-branch delta; abandoned branches, hidden
|
|
73
|
+
memory-context entries, and unrelated large tool output are not staged. Source
|
|
74
|
+
files may be much larger than the evidence sent to the model. After redaction,
|
|
75
|
+
each staged transcript is capped at 256 KiB. A changed, missing, or malformed
|
|
76
|
+
checkpoint source remains pending without blocking valid checkpoints in the
|
|
77
|
+
same batch; it is retried by `/memory run`, a newer cursor, or a later launch.
|
|
78
|
+
The dreamer updates affected pages and cross-links, preserves valid historical
|
|
79
|
+
source entries, marks superseded or conflicting claims, and performs a bounded
|
|
80
|
+
semantic maintenance pass before publication. Root-index links in each session
|
|
81
|
+
projection are rebased to that projection's absolute `.memory` path; canonical
|
|
82
|
+
memory remains unchanged.
|
|
83
|
+
|
|
18
84
|
Felan suppresses Pi's version notification, bundled changelog, package update
|
|
19
85
|
notifications, and install/update telemetry. Update behavior is owned by the
|
|
20
86
|
Felan application.
|
|
@@ -61,6 +127,7 @@ All built-in extensions are enabled by default. Toggle them in
|
|
|
61
127
|
"backgroundBash": true,
|
|
62
128
|
"codex": true,
|
|
63
129
|
"rtkOptimizer": true,
|
|
130
|
+
"memory": true,
|
|
64
131
|
"powerline": false
|
|
65
132
|
}
|
|
66
133
|
}
|
|
@@ -79,8 +146,12 @@ confirmation.
|
|
|
79
146
|
The local transcript groups adjacent tool calls by default, with one concise
|
|
80
147
|
action row per call beneath each group title. Press `Ctrl+O` to show bounded
|
|
81
148
|
result previews. Use `/tools` or `Alt+T` to inspect the complete arguments and
|
|
82
|
-
result for one call.
|
|
83
|
-
|
|
149
|
+
result for one root-session call. Selected subagent transcripts use the same
|
|
150
|
+
grouped or full tool rendering and `Ctrl+O` previews. Subagent completion
|
|
151
|
+
notices stay on one summary line by default; `Ctrl+O` shows a bounded preview
|
|
152
|
+
and `Alt+A` opens full agent details. Grouped reads from projected or canonical
|
|
153
|
+
local memory appear as `Memory Recall`; conservative read-only Codex commands
|
|
154
|
+
receive the same label without hiding mutating or arbitrary shell commands.
|
|
84
155
|
To restore Pi's original ungrouped rendering, set:
|
|
85
156
|
|
|
86
157
|
```json
|
|
@@ -225,8 +296,10 @@ child in a full-width interactive rail beneath the powerline status rows, or
|
|
|
225
296
|
beneath the editor when powerline is disabled. Press Down at the editor's newest
|
|
226
297
|
prompt to enter the rail, use Up/Down to select a child, press Up on the first
|
|
227
298
|
child to return to the editor, and press Enter to open that child in the agent
|
|
228
|
-
navigator.
|
|
229
|
-
|
|
299
|
+
navigator. Each child row and the selected-child header show the resolved
|
|
300
|
+
provider/model when available. Use `/agents` or `Alt+A` to open the navigator
|
|
301
|
+
directly, follow live transcripts with the same tool presentation as the main
|
|
302
|
+
agent, send steering messages, or stop active work.
|
|
230
303
|
Runtime shutdown awaits active-child cancellation before Pi teardown.
|
|
231
304
|
Completed-child continuation uses the same child ID and Pi session file while
|
|
232
305
|
replacing the latest result. The default list also
|
|
@@ -240,6 +313,15 @@ Local agent definitions are loaded only from bundled Felan definitions,
|
|
|
240
313
|
bundled definitions; within one scope the Felan-specific directory overrides
|
|
241
314
|
the shared `.agents` directory. Pi ambient agent discovery remains disabled.
|
|
242
315
|
|
|
316
|
+
The bundled definitions have role-specific model settings: `general` inherits the
|
|
317
|
+
parent model and thinking for implementation or investigation, `explore` uses the
|
|
318
|
+
`low` model tier with thinking `off` for cheap read-only exploration, and `reviewer`
|
|
319
|
+
inherits the parent model and thinking for quality-sensitive review. A definition's
|
|
320
|
+
`model` and `thinking` settings take precedence over `Agent` arguments. When a
|
|
321
|
+
definition omits either setting, the corresponding argument is used; if both omit
|
|
322
|
+
it, the parent setting is inherited. A custom definition with id `explore` replaces
|
|
323
|
+
the bundled definition and can choose its own settings.
|
|
324
|
+
|
|
243
325
|
Each definition is a Markdown file with flat `key: value` frontmatter and a
|
|
244
326
|
required prompt body. `description` is required; `id` defaults to the filename.
|
|
245
327
|
Optional fields are `model`, `thinking`, `max_turns`, `timeout_seconds`, and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,cAAc,CAAC;AAItB,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,CA+CrF"}
|
package/dist/application.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
1
2
|
import { InteractiveMode } from '@earendil-works/pi-coding-agent';
|
|
2
3
|
import { createLocalFelanRuntime, } from './runtime.js';
|
|
3
4
|
import { installFelanStartupHeader } from './startup-header.js';
|
|
@@ -15,7 +16,10 @@ export async function runLocalFelan(options = {}) {
|
|
|
15
16
|
...(options.initialMessage === undefined ? {} : { initialMessage: options.initialMessage }),
|
|
16
17
|
...(options.verbose === undefined ? {} : { verbose: options.verbose }),
|
|
17
18
|
});
|
|
18
|
-
installFelanStartupHeader(mode, {
|
|
19
|
+
installFelanStartupHeader(mode, {
|
|
20
|
+
expanded: options.verbose === true,
|
|
21
|
+
memorySummaryPath: () => join(runtime.services.agentDir, 'storage', 'sessions', encodeURIComponent(runtime.session.sessionManager.getSessionId()), '.memory', 'summary.md'),
|
|
22
|
+
});
|
|
19
23
|
await mode.run();
|
|
20
24
|
}
|
|
21
25
|
finally {
|
package/dist/application.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,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;AAOhF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC3D,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE;YACvE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,yBAAyB,CAAC,IAAI,EAAE,
|
|
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;AAOhF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAgC,EAAE;IACpE,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAC3D,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACrE,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,GAAG,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,6BAA6B,CAAC,OAAO,CAAC,EAAE;YACvE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SACvE,CAAC,CAAC;QACH,yBAAyB,CAAC,IAAI,EAAE;YAC9B,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;YAClC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,EACzB,SAAS,EACT,UAAU,EACV,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,EACjE,SAAS,EACT,YAAY,CACb;SACF,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;YACvD,CAAC;YACD,IAAI,0BAA0B,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,0BAA0B,CAAC;YACjE,CAAC;YACD,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,mBAAmB,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/extensions.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { ExtensionPackageImporter, ModelRuntime } from '@felan-ai/agent-core';
|
|
2
|
+
import { type MemoryHost, type MemoryRole } from '@felan-ai/ext-memory';
|
|
2
3
|
import { type SubagentHost } from '@felan-ai/ext-subagents';
|
|
3
4
|
import { type LocalSubagentNavigatorHost } from './subagents/agent-navigator.js';
|
|
4
5
|
export declare const askUserExtensionPackage = "@felan-ai/ext-ask-user";
|
|
5
6
|
export declare const mcpExtensionPackage = "@felan-ai/ext-mcp";
|
|
6
7
|
export declare const powerlineExtensionPackage = "@felan-ai/ext-powerline";
|
|
7
8
|
export declare const subagentsExtensionPackage = "@felan-ai/ext-subagents";
|
|
9
|
+
export declare const memoryExtensionPackage = "@felan-ai/ext-memory";
|
|
8
10
|
export declare const builtinExtensionPackages: {
|
|
9
11
|
readonly subagents: "@felan-ai/ext-subagents";
|
|
10
12
|
readonly askUser: "@felan-ai/ext-ask-user";
|
|
@@ -17,12 +19,17 @@ export declare const builtinExtensionPackages: {
|
|
|
17
19
|
readonly rtkOptimizer: "@felan-ai/ext-rtk-optimizer";
|
|
18
20
|
readonly markitdown: "@felan-ai/ext-markitdown";
|
|
19
21
|
readonly context: "@felan-ai/ext-context";
|
|
22
|
+
readonly memory: "@felan-ai/ext-memory";
|
|
20
23
|
readonly powerline: "@felan-ai/ext-powerline";
|
|
21
24
|
};
|
|
22
|
-
export declare const localExtensionPackages: ("@felan-ai/ext-subagents" | "@felan-ai/ext-ask-user" | "@felan-ai/ext-
|
|
25
|
+
export declare const localExtensionPackages: ("@felan-ai/ext-subagents" | "@felan-ai/ext-ask-user" | "@felan-ai/ext-tasks" | "@felan-ai/ext-prewalk" | "@felan-ai/ext-mcp" | "@felan-ai/ext-web-access" | "@felan-ai/ext-background-bash" | "@felan-ai/ext-codex" | "@felan-ai/ext-rtk-optimizer" | "@felan-ai/ext-markitdown" | "@felan-ai/ext-context" | "@felan-ai/ext-memory" | "@felan-ai/ext-powerline")[];
|
|
23
26
|
export type BuiltinExtensionName = keyof typeof builtinExtensionPackages;
|
|
24
27
|
export type BuiltinExtensionSettings = Partial<Record<BuiltinExtensionName, boolean>>;
|
|
25
28
|
export declare function resolveBuiltinExtensionPackages(settings: unknown): readonly string[];
|
|
26
29
|
export declare const importLocalExtension: ExtensionPackageImporter;
|
|
27
|
-
export
|
|
30
|
+
export interface LocalMemoryExtensionBinding {
|
|
31
|
+
readonly role: MemoryRole;
|
|
32
|
+
readonly host: MemoryHost;
|
|
33
|
+
}
|
|
34
|
+
export declare function createLocalExtensionImporter(host: SubagentHost & LocalSubagentNavigatorHost, modelRuntime: ModelRuntime, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>, memoryBinding?: LocalMemoryExtensionBinding): ExtensionPackageImporter;
|
|
28
35
|
//# sourceMappingURL=extensions.d.ts.map
|
package/dist/extensions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGnF,OAAO,EAAyB,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/F,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,gCAAgC,CAAC;AAExC,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AACvD,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAC7D,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;CAe3B,CAAC;AACX,eAAO,MAAM,sBAAsB,qWAA0C,CAAC;AAE9E,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AACzE,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAAC;AAItF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAYpF;AAED,eAAO,MAAM,oBAAoB,EAAE,wBAKlC,CAAC;AAEF,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,YAAY,GAAG,0BAA0B,EAC/C,YAAY,EAAE,YAAY,EAC1B,eAAe,GAAE,wBAA+C,EAChE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAClC,aAAa,CAAC,EAAE,2BAA2B,GAC1C,wBAAwB,CA0C1B"}
|
package/dist/extensions.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createAskUserExtension } from '@felan-ai/ext-ask-user';
|
|
2
2
|
import { createTuiAskUserHost } from '@felan-ai/ext-ask-user/tui';
|
|
3
|
+
import { createMemoryExtension } from '@felan-ai/ext-memory';
|
|
3
4
|
import { createPowerlineExtension } from '@felan-ai/ext-powerline';
|
|
4
5
|
import { createSubagentsExtension, } from '@felan-ai/ext-subagents';
|
|
5
6
|
import { createLocalMcpExtension } from './mcp/index.js';
|
|
@@ -9,6 +10,7 @@ export const askUserExtensionPackage = '@felan-ai/ext-ask-user';
|
|
|
9
10
|
export const mcpExtensionPackage = '@felan-ai/ext-mcp';
|
|
10
11
|
export const powerlineExtensionPackage = '@felan-ai/ext-powerline';
|
|
11
12
|
export const subagentsExtensionPackage = '@felan-ai/ext-subagents';
|
|
13
|
+
export const memoryExtensionPackage = '@felan-ai/ext-memory';
|
|
12
14
|
export const builtinExtensionPackages = {
|
|
13
15
|
subagents: subagentsExtensionPackage,
|
|
14
16
|
askUser: askUserExtensionPackage,
|
|
@@ -22,6 +24,7 @@ export const builtinExtensionPackages = {
|
|
|
22
24
|
// Append conversion diagnostics after result optimization, then restore the source path for progressive context.
|
|
23
25
|
markitdown: '@felan-ai/ext-markitdown',
|
|
24
26
|
context: '@felan-ai/ext-context',
|
|
27
|
+
memory: memoryExtensionPackage,
|
|
25
28
|
powerline: powerlineExtensionPackage,
|
|
26
29
|
};
|
|
27
30
|
export const localExtensionPackages = Object.values(builtinExtensionPackages);
|
|
@@ -47,7 +50,7 @@ export const importLocalExtension = async (packageName) => {
|
|
|
47
50
|
}
|
|
48
51
|
return import(packageName);
|
|
49
52
|
};
|
|
50
|
-
export function createLocalExtensionImporter(host, modelRuntime, importExtension = importLocalExtension, shutdownHost) {
|
|
53
|
+
export function createLocalExtensionImporter(host, modelRuntime, importExtension = importLocalExtension, shutdownHost, memoryBinding) {
|
|
51
54
|
let powerlineLoaded = false;
|
|
52
55
|
let agentRailRenderer;
|
|
53
56
|
const powerline = createPowerlineExtension(createLocalSubscriptionUsageHost(modelRuntime), {
|
|
@@ -84,6 +87,11 @@ export function createLocalExtensionImporter(host, modelRuntime, importExtension
|
|
|
84
87
|
powerlineLoaded = true;
|
|
85
88
|
return { default: powerline };
|
|
86
89
|
}
|
|
90
|
+
if (packageName === memoryExtensionPackage) {
|
|
91
|
+
if (!memoryBinding)
|
|
92
|
+
throw new Error('Local memory extension requires a host binding');
|
|
93
|
+
return { default: createMemoryExtension(memoryBinding) };
|
|
94
|
+
}
|
|
87
95
|
return importExtension(packageName);
|
|
88
96
|
};
|
|
89
97
|
}
|
package/dist/extensions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EACL,wBAAwB,GAEzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,8BAA8B,GAG/B,MAAM,gCAAgC,CAAC;AAExC,MAAM,CAAC,MAAM,uBAAuB,GAAG,wBAAwB,CAAC;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AACnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,yBAAyB;IACpC,OAAO,EAAE,uBAAuB;IAChC,KAAK,EAAE,qBAAqB;IAC5B,OAAO,EAAE,uBAAuB;IAChC,GAAG,EAAE,mBAAmB;IACxB,SAAS,EAAE,0BAA0B;IACrC,cAAc,EAAE,+BAA+B;IAC/C,KAAK,EAAE,qBAAqB;IAC5B,YAAY,EAAE,6BAA6B;IAC3C,iHAAiH;IACjH,UAAU,EAAE,0BAA0B;IACtC,OAAO,EAAE,uBAAuB;IAChC,SAAS,EAAE,yBAAyB;CAC5B,CAAC;AACX,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAK9E,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEtF,MAAM,UAAU,+BAA+B,CAAC,QAAiB;IAC/D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC;IAC1D,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAEhF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;QAC3G,IAAI,OAAO,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,oBAAoB,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC;SAC5C,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAA6B,KAAK,EAAE,WAAW,EAAE,EAAE;IAClF,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;AAC7B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,10 @@ export { createLocalFelanRuntime, createLocalModelRuntime, createLocalSessionRun
|
|
|
8
8
|
export { LocalSubagentHost } from './subagents/host.js';
|
|
9
9
|
export type { CreateLocalSubagentHostOptions, LocalSubagentSettings, LocalSubagentView, } from './subagents/host.js';
|
|
10
10
|
export type { CreateLocalFelanRuntimeOptions, CreateLocalSessionRuntimeFactoryOptions, LocalFelanRuntime, } from './runtime.js';
|
|
11
|
+
export { LocalMemoryCoordinator } from './memory/coordinator.js';
|
|
12
|
+
export { localMemoryProjectDirectory, resolveLocalMemoryProject } from './memory/project.js';
|
|
13
|
+
export type { LocalMemoryCoordinatorOptions, LocalMemorySessionHostOptions, } from './memory/coordinator.js';
|
|
14
|
+
export type { LocalMemoryProject } from './memory/project.js';
|
|
11
15
|
export type { LocalAgentRuntimeFactory, LocalAgentRuntimeFactoryRequest, } from './runtime-factory.js';
|
|
12
16
|
export { createLocalSettingsManager, getFelanSettings } from './settings.js';
|
|
13
17
|
export type { FelanSettings } from './settings.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,8BAA8B,EAC9B,uCAAuC,EACvC,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,8BAA8B,EAC9B,uCAAuC,EACvC,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,YAAY,EACV,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EACV,wBAAwB,EACxB,+BAA+B,GAChC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EACL,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,8 @@ export { runCli } from './cli-main.js';
|
|
|
3
3
|
export { builtinExtensionPackages, importLocalExtension, localExtensionPackages, resolveBuiltinExtensionPackages, } from './extensions.js';
|
|
4
4
|
export { createLocalFelanRuntime, createLocalModelRuntime, createLocalSessionRuntimeFactory, getLocalAgentDir, getLocalSkillPaths, } from './runtime.js';
|
|
5
5
|
export { LocalSubagentHost } from './subagents/host.js';
|
|
6
|
+
export { LocalMemoryCoordinator } from './memory/coordinator.js';
|
|
7
|
+
export { localMemoryProjectDirectory, resolveLocalMemoryProject } from './memory/project.js';
|
|
6
8
|
export { createLocalSettingsManager, getFelanSettings } from './settings.js';
|
|
7
9
|
export { LOCAL_APPEND_SYSTEM_PROMPT_FILENAME, loadLocalAppendSystemPrompt, } from './system-prompt.js';
|
|
8
10
|
export { FELAN_VERSION } from './version.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAWxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAU7F,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EACL,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/lock.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type LockOptions } from 'proper-lockfile';
|
|
2
|
+
export type LocalFileLockOptions = Omit<LockOptions, 'onCompromised'> & {
|
|
3
|
+
readonly preservePathOnRelease?: boolean;
|
|
4
|
+
};
|
|
5
|
+
export interface LocalFileLock {
|
|
6
|
+
readonly compromised: AbortSignal;
|
|
7
|
+
isCompromised(): boolean;
|
|
8
|
+
isCurrent(): Promise<boolean>;
|
|
9
|
+
throwIfCompromised(message?: string): void;
|
|
10
|
+
retire(staleMs: number): Promise<void>;
|
|
11
|
+
release(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare function withLocalFileLock<T>(path: string, options: LocalFileLockOptions, operation: (lock: LocalFileLock) => Promise<T>): Promise<T>;
|
|
14
|
+
export declare function acquireLocalFileLock(path: string, options?: LocalFileLockOptions): Promise<LocalFileLock>;
|
|
15
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"AAEA,OAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG;IACtE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,aAAa,IAAI,OAAO,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC,CAcZ;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAqDxB"}
|
package/dist/lock.js
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import * as nodeFs from 'node:fs';
|
|
2
|
+
import { lstat, utimes } from 'node:fs/promises';
|
|
3
|
+
import lockfile, {} from 'proper-lockfile';
|
|
4
|
+
export async function withLocalFileLock(path, options, operation) {
|
|
5
|
+
const lock = await acquireLocalFileLock(path, {
|
|
6
|
+
...options,
|
|
7
|
+
preservePathOnRelease: true,
|
|
8
|
+
});
|
|
9
|
+
try {
|
|
10
|
+
lock.throwIfCompromised();
|
|
11
|
+
const result = await operation(lock);
|
|
12
|
+
lock.throwIfCompromised();
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
await lock.release();
|
|
17
|
+
await lock.retire(options.stale ?? 10_000);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function acquireLocalFileLock(path, options = {}) {
|
|
21
|
+
const controller = new AbortController();
|
|
22
|
+
let compromiseError;
|
|
23
|
+
const lockPath = options.lockfilePath ?? `${path}.lock`;
|
|
24
|
+
const { preservePathOnRelease = false, ...lockOptions } = options;
|
|
25
|
+
const identityRef = {};
|
|
26
|
+
const releaseLock = await lockfile.lock(path, {
|
|
27
|
+
...lockOptions,
|
|
28
|
+
fs: createGuardedFs(lockPath, identityRef, preservePathOnRelease),
|
|
29
|
+
onCompromised: (error) => {
|
|
30
|
+
compromiseError ??= error;
|
|
31
|
+
controller.abort(error);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const lockIdentity = await readLockIdentity(lockPath);
|
|
35
|
+
if (!lockIdentity) {
|
|
36
|
+
const error = new Error('Local file lock disappeared during acquisition');
|
|
37
|
+
compromiseError = error;
|
|
38
|
+
controller.abort(error);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
identityRef.current = lockIdentity;
|
|
42
|
+
const isCurrent = async () => {
|
|
43
|
+
if (compromiseError)
|
|
44
|
+
return false;
|
|
45
|
+
const current = await readLockIdentity(lockPath);
|
|
46
|
+
return current !== undefined && sameLockIdentity(current, lockIdentity);
|
|
47
|
+
};
|
|
48
|
+
let released = false;
|
|
49
|
+
return {
|
|
50
|
+
compromised: controller.signal,
|
|
51
|
+
isCompromised: () => compromiseError !== undefined,
|
|
52
|
+
isCurrent,
|
|
53
|
+
throwIfCompromised(message) {
|
|
54
|
+
if (!compromiseError)
|
|
55
|
+
return;
|
|
56
|
+
if (message === undefined)
|
|
57
|
+
throw compromiseError;
|
|
58
|
+
throw new Error(message, { cause: compromiseError });
|
|
59
|
+
},
|
|
60
|
+
async retire(staleMs) {
|
|
61
|
+
if (!preservePathOnRelease || !(await isCurrent()))
|
|
62
|
+
return;
|
|
63
|
+
const retiredAt = new Date(Date.now() - Math.max(staleMs, 2_000) - 1_000);
|
|
64
|
+
await utimes(lockPath, retiredAt, retiredAt).catch(() => { });
|
|
65
|
+
},
|
|
66
|
+
async release() {
|
|
67
|
+
if (released)
|
|
68
|
+
return;
|
|
69
|
+
released = true;
|
|
70
|
+
try {
|
|
71
|
+
await releaseLock();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (!compromiseError && await isCurrent())
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function createGuardedFs(lockPath, identityRef, preservePathOnRelease) {
|
|
81
|
+
const guarded = {
|
|
82
|
+
...nodeFs,
|
|
83
|
+
rmdir(path, callback) {
|
|
84
|
+
if (path !== lockPath) {
|
|
85
|
+
nodeFs.rmdir(path, callback);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (!identityRef.current) {
|
|
89
|
+
nodeFs.rmdir(path, (error) => {
|
|
90
|
+
// A populated stale lock is still owned. Let proper-lockfile's
|
|
91
|
+
// follow-up mkdir report ELOCKED instead of surfacing ENOTEMPTY.
|
|
92
|
+
callback(isNotEmpty(error) ? null : error);
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (preservePathOnRelease) {
|
|
97
|
+
callback(null);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
nodeFs.lstat(path, (error, stats) => {
|
|
101
|
+
if (error) {
|
|
102
|
+
if (isMissing(error)) {
|
|
103
|
+
callback(null);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
callback(error);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!sameLockIdentity(stats, identityRef.current)) {
|
|
110
|
+
callback(null);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
nodeFs.rmdir(path, callback);
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
rmdirSync(path) {
|
|
117
|
+
if (path !== lockPath) {
|
|
118
|
+
nodeFs.rmdirSync(path);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!identityRef.current) {
|
|
122
|
+
try {
|
|
123
|
+
nodeFs.rmdirSync(path);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (!isNotEmpty(error))
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (preservePathOnRelease)
|
|
132
|
+
return;
|
|
133
|
+
let stats;
|
|
134
|
+
try {
|
|
135
|
+
stats = nodeFs.lstatSync(path);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
if (isMissing(error))
|
|
139
|
+
return;
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
if (!sameLockIdentity(stats, identityRef.current))
|
|
143
|
+
return;
|
|
144
|
+
nodeFs.rmdirSync(path);
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
return guarded;
|
|
148
|
+
}
|
|
149
|
+
async function readLockIdentity(path) {
|
|
150
|
+
try {
|
|
151
|
+
const stats = await lstat(path);
|
|
152
|
+
return { dev: stats.dev, ino: stats.ino, birthtimeMs: stats.birthtimeMs };
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (isMissing(error))
|
|
156
|
+
return undefined;
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function sameLockIdentity(left, right) {
|
|
161
|
+
return left.dev === right.dev && left.ino === right.ino && left.birthtimeMs === right.birthtimeMs;
|
|
162
|
+
}
|
|
163
|
+
function isMissing(error) {
|
|
164
|
+
return typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ENOENT';
|
|
165
|
+
}
|
|
166
|
+
function isNotEmpty(error) {
|
|
167
|
+
return typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 'ENOTEMPTY';
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=lock.js.map
|
package/dist/lock.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../src/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FelanExtension } from '@felan-ai/agent-core';
|
|
2
|
+
import { LocalMemoryCoordinator } from './coordinator.js';
|
|
3
|
+
export interface CreateLocalMemoryControlExtensionOptions {
|
|
4
|
+
readonly coordinator: LocalMemoryCoordinator;
|
|
5
|
+
readonly agentDir: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function createLocalMemoryControlExtension(options: CreateLocalMemoryControlExtensionOptions): FelanExtension;
|
|
8
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../../src/memory/control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,cAAc,CAgFhB"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import open from 'open';
|
|
2
|
+
import { setLocalMemoryProcessingEnabled } from '../settings.js';
|
|
3
|
+
import { LocalMemoryCoordinator } from './coordinator.js';
|
|
4
|
+
export function createLocalMemoryControlExtension(options) {
|
|
5
|
+
return (pi) => {
|
|
6
|
+
let activeContext;
|
|
7
|
+
let activeSessionId;
|
|
8
|
+
let unsubscribeStatus;
|
|
9
|
+
let statusRefresh = 0;
|
|
10
|
+
const refreshActiveStatus = async () => {
|
|
11
|
+
const refresh = ++statusRefresh;
|
|
12
|
+
const ctx = activeContext;
|
|
13
|
+
if (!ctx)
|
|
14
|
+
return;
|
|
15
|
+
const status = await options.coordinator.status(ctx.cwd);
|
|
16
|
+
if (activeContext !== ctx || refresh !== statusRefresh)
|
|
17
|
+
return;
|
|
18
|
+
updateStatus(ctx, status);
|
|
19
|
+
};
|
|
20
|
+
pi.registerCommand('memory', {
|
|
21
|
+
description: 'Inspect, run, enable, disable, or open local project memory',
|
|
22
|
+
handler: async (args, ctx) => {
|
|
23
|
+
const command = args.trim().toLowerCase() || 'status';
|
|
24
|
+
if (command === 'status') {
|
|
25
|
+
await showStatus(options.coordinator, ctx.cwd, ctx);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (command === 'run' || command === 'process') {
|
|
29
|
+
const status = await options.coordinator.runNow(ctx.cwd);
|
|
30
|
+
updateStatus(ctx, status);
|
|
31
|
+
notify(ctx, formatStatus(status));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (command === 'enable' || command === 'on') {
|
|
35
|
+
await setMemoryEnabled(options, true);
|
|
36
|
+
notify(ctx, 'Local memory processing enabled.');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (command === 'disable' || command === 'off') {
|
|
40
|
+
await setMemoryEnabled(options, false);
|
|
41
|
+
notify(ctx, 'Local memory processing disabled. Existing memory remains readable.');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (command === 'open') {
|
|
45
|
+
if (!ctx.hasUI || ctx.mode !== 'tui') {
|
|
46
|
+
notify(ctx, '/memory open requires interactive TUI mode.', 'warning');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const directory = await options.coordinator.canonicalDirectory(ctx.cwd);
|
|
50
|
+
await open(directory);
|
|
51
|
+
notify(ctx, 'Opened canonical local memory.', 'info');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
notify(ctx, 'Usage: /memory status|run|enable|disable|open', 'warning');
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
pi.on('session_start', async (_event, ctx) => {
|
|
58
|
+
activeContext = ctx;
|
|
59
|
+
activeSessionId = ctx.sessionManager.getSessionId();
|
|
60
|
+
unsubscribeStatus?.();
|
|
61
|
+
unsubscribeStatus = options.coordinator.subscribeStatusChanges(() => {
|
|
62
|
+
void refreshActiveStatus().catch(() => { });
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
await refreshActiveStatus();
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
});
|
|
69
|
+
pi.on('session_shutdown', (_event, ctx) => {
|
|
70
|
+
if (activeSessionId !== ctx.sessionManager.getSessionId())
|
|
71
|
+
return;
|
|
72
|
+
statusRefresh += 1;
|
|
73
|
+
activeContext = undefined;
|
|
74
|
+
activeSessionId = undefined;
|
|
75
|
+
unsubscribeStatus?.();
|
|
76
|
+
unsubscribeStatus = undefined;
|
|
77
|
+
ctx.ui.setStatus('memory', undefined);
|
|
78
|
+
});
|
|
79
|
+
pi.on('model_select', ({ model }) => {
|
|
80
|
+
options.coordinator.setSelectedModel(model);
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function setMemoryEnabled(options, enabled) {
|
|
85
|
+
options.coordinator.setEnabled(enabled);
|
|
86
|
+
await setLocalMemoryProcessingEnabled(options.agentDir, enabled);
|
|
87
|
+
}
|
|
88
|
+
async function showStatus(coordinator, cwd, ctx, quiet = false) {
|
|
89
|
+
const status = await coordinator.status(cwd);
|
|
90
|
+
const message = formatStatus(status);
|
|
91
|
+
updateStatus(ctx, status);
|
|
92
|
+
if (!quiet)
|
|
93
|
+
notify(ctx, message);
|
|
94
|
+
}
|
|
95
|
+
function updateStatus(ctx, status) {
|
|
96
|
+
ctx.ui.setStatus('memory', status.pendingCheckpoints > 0 ? `Memory: ${status.pendingCheckpoints} pending` : undefined);
|
|
97
|
+
}
|
|
98
|
+
function formatStatus(status) {
|
|
99
|
+
const enabled = status.enabled ? 'enabled' : 'disabled';
|
|
100
|
+
const pending = `${status.pendingCheckpoints} pending`;
|
|
101
|
+
return `Local memory: ${enabled}, ${status.state}, ${pending}${status.message ? ` — ${status.message}` : ''}`;
|
|
102
|
+
}
|
|
103
|
+
function notify(ctx, message, level = 'info') {
|
|
104
|
+
ctx.ui.notify(message, level);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=control.js.map
|