@codemem/pi-extension 0.46.0-rc.2 → 0.46.0-rc.4

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/README.md CHANGED
@@ -32,9 +32,9 @@ Build first so `dist/index.js` exists (`pnpm --filter @codemem/pi-extension buil
32
32
  ## What it does
33
33
 
34
34
  - **Ingest** — captures pi session events (`session_start`/`session_shutdown`, user/assistant messages, tool calls/results) into codemem with `source: "pi"` via `POST /api/pi-hooks` (compat alias over the canonical ingest envelope), falling back to `codemem pi-hook-ingest` (spool when offline).
35
- - **Injection** — on `before_agent_start`, appends a `## codemem memories` block to the **turn-local** `systemPrompt` (never the persistent `message` channel).
35
+ - **Injection** — on pi's `context` event, appends a `## codemem memories` block to the latest user message of the **request copy** (never the system prompt, never the saved session). Older user messages replay the exact bytes already injected for them, and a new pack is fetched only for the latest undecided message, so the provider's prefix cache stays stable. Already-shown items are cut from new packs when the pack response carries renderer spans. A contract-valid HTTP or `pack --json` response, including a zero-item pack, ends that fetch; `{}` and error-shaped bodies fall through. Those span-bearing successes log `inject.pack.ok source=pi` to the plugin log, the same line `pi-hook-inject` writes when it is the fallback. Decisions live in memory: a restart fetches again.
36
36
  - **Tools** — registers the 14 `memory_*` tools natively (HTTP preferred, CLI fallback). Every HTTP operation first proves the viewer is target-aware (`GET /api/prompt-pack-profile` must report this process's `db_path` + `identity_target`) and re-sends the target on the query, so a foreign or stale older viewer on the port is never trusted (409 or unproven → targeted CLI path). Non-idempotent `memory_remember` does NOT CLI-replay on ambiguous HTTP failures (timeout/5xx/reset after send). No `pi-mcp-adapter` needed. Skipped when `pi.tools_mode` is `mcp-adapter`.
37
- - **Compaction** — pi-only observe-only boundary: `session_before_compact` flushes extraction; never returns a custom compaction summary.
37
+ - **Compaction** — `session_before_compact` still only flushes extraction and never returns a custom summary. The next context skips a new pack fetch only after `session_compact` with `willRetry`, which is Pi's automatic overflow resume. Manual, threshold, cancelled, and failed compactions do not skip that fetch, and a later user message clears a skip that was not the immediate resume.
38
38
  - **Fork/resume** — re-keys stream identity on every `session_start`; durable cursors via `pi.appendEntry`.
39
39
  - **Cross-agent** — one shared, project-scoped store. Memories from OpenCode/Claude/Codex inject into pi and the reverse.
40
40
  - **Dashboard** — pi rows appear in the source-agnostic feed/sessions/projects tabs with no extra setup.
@@ -50,7 +50,7 @@ Read from `~/.config/codemem/config.json` under the `pi` object, with `CODEMEM_P
50
50
  | Key / env | Default | Meaning |
51
51
  | --- | --- | --- |
52
52
  | `pi.tools_mode` / `CODEMEM_PI_TOOLS_MODE` | `native` | `native` registers tools here; `mcp-adapter` skips native registration (use pi-mcp-adapter + `codemem mcp`) |
53
- | `pi.inject_prompts` / `CODEMEM_PI_INJECT_PROMPTS` | `true` | Append pack to system prompt on each turn |
53
+ | `pi.inject_prompts` / `CODEMEM_PI_INJECT_PROMPTS` | `true` | Attach the memory pack to the latest user message on each model request |
54
54
  | `pi.file_context` / `CODEMEM_PI_FILE_CONTEXT` | `true` | Attach file-related memories when pi `read`s a tracked file |
55
55
 
56
56
  Shared viewer / inject knobs (same as other clients):
@@ -65,6 +65,7 @@ Shared viewer / inject knobs (same as other clients):
65
65
  | `CODEMEM_INJECT_LIMIT` | `8` | Pack item limit |
66
66
  | `CODEMEM_INJECT_TOKEN_BUDGET` | `800` | Pack token budget |
67
67
  | `CODEMEM_INJECT_MAX_CHARS` | `16000` | Max injection block chars |
68
+ | `CODEMEM_INJECT_RETAINED_TOKEN_BUDGET` | uncapped | Optional approximate token ceiling for blocks already injected in the session (estimated as `ceil(chars / 4)`). Unset, zero, negative, and invalid values mean no cap; when enabled, a full ceiling attaches nothing new, fetches nothing, and never removes or truncates blocks already attached |
68
69
 
69
70
  Example config:
70
71
 
package/dist/client.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * Never opens the store or imports @codemem/core.
4
4
  */
5
5
  import type { PiExtensionConfig } from "./config.js";
6
- import { type ViewerRuntime } from "./viewer.js";
6
+ import { type RenderedPackItem, type ViewerRuntime } from "./viewer.js";
7
7
  /** pi AgentToolResult shape (content + required details). */
8
8
  export type ToolResultContent = {
9
9
  content: Array<{
@@ -36,10 +36,17 @@ export type ExecCodememFn = (args: string[], opts?: {
36
36
  * already the full `## codemem memories` block (CLI pi-hook-inject) or bare
37
37
  * pack text (HTTP /api/pack, CLI pack --json) that must be framed via
38
38
  * formatPiInjectionBlock. Never sniff the memory text to decide framing.
39
+ *
40
+ * `renderedItems` + `itemCount` exist only on span-bearing transports (HTTP
41
+ * /api/pack, CLI pack --json) and are absent on plain-text pi-hook-inject.
39
42
  */
40
43
  export type PackFetch = {
41
44
  text: string;
42
45
  preformatted: boolean;
46
+ /** Renderer item spans for injection dedup; undefined without span data. */
47
+ renderedItems?: RenderedPackItem[];
48
+ /** metrics.total_items from the same span-bearing response. */
49
+ itemCount?: number;
43
50
  };
44
51
  /** CLI budget for pack/inject and file-context queries (was a 3s probe). */
45
52
  export declare const CLI_PACK_TIMEOUT_MS = 8000;
@@ -77,8 +84,18 @@ export declare class PiCodememClient {
77
84
  ingest(payload: Record<string, unknown>, signal?: AbortSignal): Promise<IngestOutcome>;
78
85
  private tryHttpIngest;
79
86
  private tryCliIngest;
80
- /** Profile-proven POST /api/pack, then CLI pi-hook-inject / pack --json fallback. */
81
- fetchPackText(context: string, signal?: AbortSignal): Promise<PackFetch>;
87
+ /**
88
+ * Profile-proven POST /api/pack, then CLI pack --json / pi-hook-inject fallback.
89
+ * A contract-valid span-bearing response ends the chain, including a zero-item
90
+ * pack. `{}` and error-shaped bodies are not success and fall through.
91
+ * Plain-text pi-hook-inject runs only when no contract-valid response is
92
+ * obtainable. Span-bearing successes log `inject.pack.ok source=pi`.
93
+ * `opts.tokenBudget` sizes the pack request (default injectTokenBudget).
94
+ */
95
+ fetchPackText(context: string, signal?: AbortSignal, opts?: {
96
+ tokenBudget?: number;
97
+ }): Promise<PackFetch>;
98
+ /** Null when the viewer is unproven/unavailable; a proven success ends the pack chain. */
82
99
  private tryHttpPack;
83
100
  execCodemem(args: string[], opts?: {
84
101
  stdin?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,9 +10,13 @@
10
10
  *
11
11
  * Surfaces:
12
12
  * - Ingest → POST /api/pi-hooks → CLI pi-hook-ingest
13
- * - Injection → before_agent_start systemPrompt append only (never message)
13
+ * - Injection → context event: cached framed block replayed onto older user
14
+ * messages, one new pack appended to the latest user message of the request
15
+ * copy (never the system prompt, never the saved session)
14
16
  * - Tools → pi.registerTool × 14 when pi.tools_mode === "native"
15
- * - session_before_compact → flush signal only (never return compaction)
17
+ * - session_before_compact → flush only; it does not skip the next pack fetch
18
+ * - session_compact with willRetry → one-shot replay skip for the immediate resume
19
+ * - session_compact_failed, agent_settled, a non-resume compact, or a later user message clears that skip
16
20
  */
17
21
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
18
22
  import { type ExecCodememFn } from "./client.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAEX,YAAY,EAQZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEN,KAAK,aAAa,EAIlB,MAAM,aAAa,CAAC;AAsBrB,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEhE;AA0ZD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA2BjE;AA2CD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAEX,YAAY,EASZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEN,KAAK,aAAa,EAIlB,MAAM,aAAa,CAAC;AAuBrB,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEhE;AAkaD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8CjE;AA2CD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACN,yBAAyB,EACzB,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}