@felan-ai/felan 0.12.8 → 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.
Files changed (64) hide show
  1. package/NOTICE +4 -0
  2. package/README.md +79 -1
  3. package/dist/application.d.ts.map +1 -1
  4. package/dist/application.js +5 -1
  5. package/dist/application.js.map +1 -1
  6. package/dist/extensions.d.ts +9 -2
  7. package/dist/extensions.d.ts.map +1 -1
  8. package/dist/extensions.js +9 -1
  9. package/dist/extensions.js.map +1 -1
  10. package/dist/index.d.ts +4 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/lock.d.ts +15 -0
  15. package/dist/lock.d.ts.map +1 -0
  16. package/dist/lock.js +169 -0
  17. package/dist/lock.js.map +1 -0
  18. package/dist/memory/control.d.ts +8 -0
  19. package/dist/memory/control.d.ts.map +1 -0
  20. package/dist/memory/control.js +106 -0
  21. package/dist/memory/control.js.map +1 -0
  22. package/dist/memory/coordinator.d.ts +38 -0
  23. package/dist/memory/coordinator.d.ts.map +1 -0
  24. package/dist/memory/coordinator.js +396 -0
  25. package/dist/memory/coordinator.js.map +1 -0
  26. package/dist/memory/dreamer.d.ts +41 -0
  27. package/dist/memory/dreamer.d.ts.map +1 -0
  28. package/dist/memory/dreamer.js +531 -0
  29. package/dist/memory/dreamer.js.map +1 -0
  30. package/dist/memory/lease.d.ts +13 -0
  31. package/dist/memory/lease.d.ts.map +1 -0
  32. package/dist/memory/lease.js +188 -0
  33. package/dist/memory/lease.js.map +1 -0
  34. package/dist/memory/project.d.ts +7 -0
  35. package/dist/memory/project.d.ts.map +1 -0
  36. package/dist/memory/project.js +41 -0
  37. package/dist/memory/project.js.map +1 -0
  38. package/dist/memory/store.d.ts +52 -0
  39. package/dist/memory/store.d.ts.map +1 -0
  40. package/dist/memory/store.js +344 -0
  41. package/dist/memory/store.js.map +1 -0
  42. package/dist/runtime.d.ts +5 -1
  43. package/dist/runtime.d.ts.map +1 -1
  44. package/dist/runtime.js +68 -10
  45. package/dist/runtime.js.map +1 -1
  46. package/dist/settings.d.ts +3 -0
  47. package/dist/settings.d.ts.map +1 -1
  48. package/dist/settings.js +61 -27
  49. package/dist/settings.js.map +1 -1
  50. package/dist/startup-header.d.ts +1 -0
  51. package/dist/startup-header.d.ts.map +1 -1
  52. package/dist/startup-header.js +40 -0
  53. package/dist/startup-header.js.map +1 -1
  54. package/dist/subagents/catalog.d.ts.map +1 -1
  55. package/dist/subagents/catalog.js +4 -2
  56. package/dist/subagents/catalog.js.map +1 -1
  57. package/dist/subagents/host.d.ts +5 -0
  58. package/dist/subagents/host.d.ts.map +1 -1
  59. package/dist/subagents/host.js +10 -7
  60. package/dist/subagents/host.js.map +1 -1
  61. package/dist/tool-activity/presentation.d.ts.map +1 -1
  62. package/dist/tool-activity/presentation.js +204 -3
  63. package/dist/tool-activity/presentation.js.map +1 -1
  64. 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
  }
@@ -82,7 +149,9 @@ result previews. Use `/tools` or `Alt+T` to inspect the complete arguments and
82
149
  result for one root-session call. Selected subagent transcripts use the same
83
150
  grouped or full tool rendering and `Ctrl+O` previews. Subagent completion
84
151
  notices stay on one summary line by default; `Ctrl+O` shows a bounded preview
85
- and `Alt+A` opens full agent details.
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.
86
155
  To restore Pi's original ungrouped rendering, set:
87
156
 
88
157
  ```json
@@ -244,6 +313,15 @@ Local agent definitions are loaded only from bundled Felan definitions,
244
313
  bundled definitions; within one scope the Felan-specific directory overrides
245
314
  the shared `.agents` directory. Pi ambient agent discovery remains disabled.
246
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
+
247
325
  Each definition is a Markdown file with flat `key: value` frontmatter and a
248
326
  required prompt body. `description` is required; `id` defaults to the filename.
249
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":"AACA,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,CAqCrF"}
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"}
@@ -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, { expanded: options.verbose === true });
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 {
@@ -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,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;QACxE,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"}
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"}
@@ -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-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-powerline")[];
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 declare function createLocalExtensionImporter(host: SubagentHost & LocalSubagentNavigatorHost, modelRuntime: ModelRuntime, importExtension?: ExtensionPackageImporter, shutdownHost?: () => Promise<void>): ExtensionPackageImporter;
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
@@ -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;AAInF,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,wBAAwB;;;;;;;;;;;;;CAc3B,CAAC;AACX,eAAO,MAAM,sBAAsB,4UAA0C,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,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,GACjC,wBAAwB,CAsC1B"}
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"}
@@ -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
  }
@@ -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;AAEF,MAAM,UAAU,4BAA4B,CAC1C,IAA+C,EAC/C,YAA0B,EAC1B,kBAA4C,oBAAoB,EAChE,YAAkC;IAElC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,iBAAgD,CAAC;IACrD,MAAM,SAAS,GAAG,wBAAwB,CAAC,gCAAgC,CAAC,YAAY,CAAC,EAAE;QACzF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE;KACxD,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE;QAC3B,IAAI,WAAW,KAAK,uBAAuB,EAAE,CAAC;YAC5C,OAAO,EAAE,OAAO,EAAE,sBAAsB,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,WAAW,KAAK,mBAAmB,EAAE,CAAC;YACxC,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,CAAC;QAChD,CAAC;QACD,IAAI,WAAW,KAAK,yBAAyB,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE;oBACf,SAAS,CAAC,EAAE,CAAC,CAAC;oBACd,8BAA8B,CAAC,EAAE,EAAE,IAAI,EAAE;wBACvC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,eAAe;wBAC1C,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE;4BACjC,iBAAiB,GAAG,QAAQ,CAAC;wBAC/B,CAAC;qBACF,CAAC,CAAC;oBACH,IAAI,YAAY,EAAE,CAAC;wBACjB,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;4BACxC,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ;gCAAE,MAAM,YAAY,EAAE,CAAC;wBACtD,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAuD;aACzD,CAAC;QACJ,CAAC;QACD,IAAI,WAAW,KAAK,yBAAyB,EAAE,CAAC;YAC9C,eAAe,GAAG,IAAI,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,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';
@@ -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;AAexD,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"}
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
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/memory/control.ts"],"names":[],"mappings":"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"}