pi-continuous-learning 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -39,7 +39,7 @@ This installs the extension globally and makes the `pi-cl-analyze` CLI available
39
39
  ### Requirements
40
40
 
41
41
  - [Pi](https://github.com/nicholasgasior/pi-coding-agent) >= 0.62.0
42
- - An active Claude subscription (the analyzer uses Haiku via your existing Pi credentials no separate API key needed)
42
+ - An LLM provider configured with Pi (subscription or API key the analyzer defaults to Haiku; see [Configuration](#configuration) to change the model)
43
43
  - Node.js >= 18
44
44
 
45
45
  ## Usage
@@ -271,7 +271,7 @@ Only include the fields you want to change — missing fields use the defaults a
271
271
  | `min_confidence` | 0.5 | Instincts below this are not injected into prompts |
272
272
  | `max_instincts` | 20 | Maximum instincts injected per turn |
273
273
  | `max_injection_chars` | 4000 | Character budget for the injection block (~1000 tokens) |
274
- | `model` | `claude-haiku-4-5` | Model for the background analyzer |
274
+ | `model` | `claude-haiku-4-5` | Model for the background analyzer (lightweight models recommended to minimize cost) |
275
275
  | `timeout_seconds` | 120 | Per-project timeout for the analyzer LLM session |
276
276
 
277
277
  ## Storage
@@ -296,8 +296,7 @@ All data stays local on your machine:
296
296
  - All data stays on your machine — no external telemetry
297
297
  - Secrets (API keys, tokens, passwords) are scrubbed from observations before writing to disk
298
298
  - Only instincts (patterns) can be exported — never raw observations
299
- - The analyzer reuses your existing Pi/Claude subscription credentials
300
- - No separate API key required
299
+ - The analyzer uses your existing Pi LLM credentials — no additional keys needed
301
300
 
302
301
  ## Development
303
302
 
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-prompt.d.ts","sourceRoot":"","sources":["../../src/cli/analyze-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,IAAI,MAAM,CAsElD"}
1
+ {"version":3,"file":"analyze-prompt.d.ts","sourceRoot":"","sources":["../../src/cli/analyze-prompt.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,IAAI,MAAM,CA0FlD"}
@@ -30,6 +30,26 @@ Analyze observations for these categories:
30
30
  - Actions that consistently lead to errors or user corrections
31
31
  - Trigger: the bad pattern situation; Action: what to do instead
32
32
 
33
+ ### Turn Structure
34
+ - turn_start/turn_end events group tool calls into LLM response cycles
35
+ - Look for recurring tool sequences within turns (e.g. grep→read→edit)
36
+ - tool_count and error_count on turn_end summarize the turn
37
+ - High error_count turns suggest inefficient approaches
38
+
39
+ ### Context Pressure
40
+ - session_compact events signal context window pressure
41
+ - Frequent compaction correlated with specific tool patterns may indicate waste
42
+ - tokens_used on turn_end and agent_end tracks token consumption
43
+
44
+ ### User Shell Commands
45
+ - user_bash events capture manual shell commands the user runs
46
+ - Repeated commands after agent actions reveal verification patterns
47
+ - These are behaviors the agent should learn to do proactively
48
+
49
+ ### Model Preferences
50
+ - model_select events track when users switch models
51
+ - Patterns in model switching reveal task-complexity preferences
52
+
33
53
  ## Feedback Analysis
34
54
 
35
55
  Each observation may include an active_instincts field listing instinct IDs
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-prompt.js","sourceRoot":"","sources":["../../src/cli/analyze-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uGAoE8F,CAAC;AACxG,CAAC"}
1
+ {"version":3,"file":"analyze-prompt.js","sourceRoot":"","sources":["../../src/cli/analyze-prompt.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uGAwF8F,CAAC;AACxG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,+BAA+B,CAAC;AAuB3F,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CAgH/C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,+BAA+B,CAAC;AA8B3F,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,GAAG,IAAI,CA6J/C"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ import { ensureStorageLayout } from "./storage.js";
12
12
  import { cleanOldArchives } from "./observations.js";
13
13
  import { handleToolStart, handleToolEnd } from "./tool-observer.js";
14
14
  import { handleBeforeAgentStart, handleAgentEnd } from "./prompt-observer.js";
15
+ import { handleTurnStart, handleTurnEnd, handleUserBash, handleSessionCompact, handleModelSelect, } from "./session-observer.js";
15
16
  import { handleBeforeAgentStartInjection, handleAgentEndClearInstincts, } from "./instinct-injector.js";
16
17
  import { handleInstinctStatus, COMMAND_NAME as STATUS_CMD } from "./instinct-status.js";
17
18
  import { handleInstinctExport, COMMAND_NAME as EXPORT_CMD } from "./instinct-export.js";
@@ -90,6 +91,56 @@ export default function (pi) {
90
91
  logError(project?.id ?? null, "tool_execution_end", err);
91
92
  }
92
93
  });
94
+ pi.on("turn_start", (event, ctx) => {
95
+ try {
96
+ if (!project)
97
+ return;
98
+ handleTurnStart(event, ctx, project);
99
+ }
100
+ catch (err) {
101
+ logError(project?.id ?? null, "turn_start", err);
102
+ }
103
+ });
104
+ pi.on("turn_end", (event, ctx) => {
105
+ try {
106
+ if (!project)
107
+ return;
108
+ handleTurnEnd(event, ctx, project);
109
+ }
110
+ catch (err) {
111
+ logError(project?.id ?? null, "turn_end", err);
112
+ }
113
+ });
114
+ pi.on("user_bash", (event, ctx) => {
115
+ try {
116
+ if (!project)
117
+ return;
118
+ handleUserBash(event, ctx, project);
119
+ }
120
+ catch (err) {
121
+ logError(project?.id ?? null, "user_bash", err);
122
+ }
123
+ });
124
+ pi.on("session_compact", (event, ctx) => {
125
+ try {
126
+ if (!project)
127
+ return;
128
+ handleSessionCompact(event, ctx, project);
129
+ }
130
+ catch (err) {
131
+ logError(project?.id ?? null, "session_compact", err);
132
+ }
133
+ });
134
+ pi.on("model_select", (event, ctx) => {
135
+ try {
136
+ if (!project)
137
+ return;
138
+ handleModelSelect(event, ctx, project);
139
+ }
140
+ catch (err) {
141
+ logError(project?.id ?? null, "model_select", err);
142
+ }
143
+ });
93
144
  pi.registerCommand(STATUS_CMD, {
94
145
  description: "Show all instincts grouped by domain with confidence scores",
95
146
  handler: (args, ctx) => handleInstinctStatus(args, ctx, project?.id),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-observer.d.ts","sourceRoot":"","sources":["../src/prompt-observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;CACnB;AAOD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAW5D;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAoBN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAiBN"}
1
+ {"version":3,"file":"prompt-observer.d.ts","sourceRoot":"","sources":["../src/prompt-observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;CACnB;AAOD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAW5D;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,qBAAqB,EAC5B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAoBN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAqBN"}
@@ -46,12 +46,15 @@ export function handleAgentEnd(_event, ctx, project, baseDir) {
46
46
  try {
47
47
  if (shouldSkipObservation())
48
48
  return;
49
+ const contextUsage = ctx.getContextUsage();
50
+ const tokensUsed = contextUsage?.tokens ?? undefined;
49
51
  const observation = {
50
52
  timestamp: new Date().toISOString(),
51
53
  event: "agent_end",
52
54
  session: getSessionId(ctx),
53
55
  project_id: project.id,
54
56
  project_name: project.name,
57
+ ...(tokensUsed != null ? { tokens_used: tokensUsed } : {}),
55
58
  ...buildActiveInstincts(),
56
59
  };
57
60
  appendObservation(observation, project.id, baseDir);
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-observer.js","sourceRoot":"","sources":["../src/prompt-observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,SAAS,YAAY,CAAC,GAAqB;IACzC,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;IACxC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA4B,EAC5B,GAAqB,EACrB,OAAqB,EACrB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,qBAAqB,EAAE;YAAE,OAAO;QAEpC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAgB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,KAAK;YACL,GAAG,oBAAoB,EAAE;SAC1B,CAAC;QAEF,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,wCAAwC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,GAAqB,EACrB,OAAqB,EACrB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,qBAAqB,EAAE;YAAE,OAAO;QAEpC,MAAM,WAAW,GAAgB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,GAAG,oBAAoB,EAAE;SAC1B,CAAC;QAEF,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,gCAAgC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"prompt-observer.js","sourceRoot":"","sources":["../src/prompt-observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,SAAS,YAAY,CAAC,GAAqB;IACzC,OAAO,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;IACxC,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA4B,EAC5B,GAAqB,EACrB,OAAqB,EACrB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,qBAAqB,EAAE;YAAE,OAAO;QAEpC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAgB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,KAAK;YACL,GAAG,oBAAoB,EAAE;SAC1B,CAAC;QAEF,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,wCAAwC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,GAAqB,EACrB,OAAqB,EACrB,OAAgB;IAEhB,IAAI,CAAC;QACH,IAAI,qBAAqB,EAAE;YAAE,OAAO;QAEpC,MAAM,YAAY,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,YAAY,EAAE,MAAM,IAAI,SAAS,CAAC;QAErD,MAAM,WAAW,GAAgB;YAC/B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC;YAC1B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,YAAY,EAAE,OAAO,CAAC,IAAI;YAC1B,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,GAAG,oBAAoB,EAAE;SAC1B,CAAC;QAEF,iBAAiB,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,gCAAgC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
2
+ import type { ProjectEntry } from "./types.js";
3
+ export interface TurnStartEvent {
4
+ type: "turn_start";
5
+ turnIndex: number;
6
+ timestamp: number;
7
+ }
8
+ export interface TurnEndEvent {
9
+ type: "turn_end";
10
+ turnIndex: number;
11
+ message: unknown;
12
+ toolResults: unknown[];
13
+ }
14
+ export interface UserBashEvent {
15
+ type: "user_bash";
16
+ command: string;
17
+ excludeFromContext: boolean;
18
+ cwd: string;
19
+ }
20
+ export interface SessionCompactEvent {
21
+ type: "session_compact";
22
+ compactionEntry: unknown;
23
+ fromExtension: boolean;
24
+ }
25
+ export interface ModelSelectEvent {
26
+ type: "model_select";
27
+ model: {
28
+ id?: string;
29
+ name?: string;
30
+ };
31
+ previousModel: {
32
+ id?: string;
33
+ name?: string;
34
+ } | undefined;
35
+ source: "set" | "cycle" | "restore";
36
+ }
37
+ export declare function handleTurnStart(event: TurnStartEvent, ctx: ExtensionContext, project: ProjectEntry, baseDir?: string): void;
38
+ export declare function handleTurnEnd(event: TurnEndEvent, ctx: ExtensionContext, project: ProjectEntry, baseDir?: string): void;
39
+ export declare function handleUserBash(event: UserBashEvent, ctx: ExtensionContext, project: ProjectEntry, baseDir?: string): void;
40
+ export declare function handleSessionCompact(event: SessionCompactEvent, ctx: ExtensionContext, project: ProjectEntry, baseDir?: string): void;
41
+ export declare function handleModelSelect(event: ModelSelectEvent, ctx: ExtensionContext, project: ProjectEntry, baseDir?: string): void;
42
+ //# sourceMappingURL=session-observer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-observer.d.ts","sourceRoot":"","sources":["../src/session-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMtE,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,aAAa,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1D,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;CACrC;AAWD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAgBN;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAgCN;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAiBN;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAgBN;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAoBN"}
@@ -0,0 +1,115 @@
1
+ import { getCurrentActiveInstincts } from "./active-instincts.js";
2
+ import { appendObservation } from "./observations.js";
3
+ import { scrubSecrets } from "./scrubber.js";
4
+ import { logError } from "./error-logger.js";
5
+ function getSessionId(ctx) {
6
+ return ctx.sessionManager.getSessionId();
7
+ }
8
+ function buildActiveInstincts() {
9
+ const ids = getCurrentActiveInstincts();
10
+ return ids.length > 0 ? { active_instincts: ids } : {};
11
+ }
12
+ export function handleTurnStart(event, ctx, project, baseDir) {
13
+ try {
14
+ const observation = {
15
+ timestamp: new Date().toISOString(),
16
+ event: "turn_start",
17
+ session: getSessionId(ctx),
18
+ project_id: project.id,
19
+ project_name: project.name,
20
+ turn_index: event.turnIndex,
21
+ ...buildActiveInstincts(),
22
+ };
23
+ appendObservation(observation, project.id, baseDir);
24
+ }
25
+ catch (err) {
26
+ logError(project.id, "session-observer:handleTurnStart", err, baseDir);
27
+ }
28
+ }
29
+ export function handleTurnEnd(event, ctx, project, baseDir) {
30
+ try {
31
+ const toolCount = event.toolResults?.length ?? 0;
32
+ const errorCount = Array.isArray(event.toolResults)
33
+ ? event.toolResults.filter((r) => {
34
+ if (r && typeof r === "object" && "isError" in r) {
35
+ return r.isError;
36
+ }
37
+ return false;
38
+ }).length
39
+ : 0;
40
+ const contextUsage = ctx.getContextUsage();
41
+ const tokensUsed = contextUsage?.tokens ?? undefined;
42
+ const observation = {
43
+ timestamp: new Date().toISOString(),
44
+ event: "turn_end",
45
+ session: getSessionId(ctx),
46
+ project_id: project.id,
47
+ project_name: project.name,
48
+ turn_index: event.turnIndex,
49
+ tool_count: toolCount,
50
+ error_count: errorCount,
51
+ ...(tokensUsed != null ? { tokens_used: tokensUsed } : {}),
52
+ ...buildActiveInstincts(),
53
+ };
54
+ appendObservation(observation, project.id, baseDir);
55
+ }
56
+ catch (err) {
57
+ logError(project.id, "session-observer:handleTurnEnd", err, baseDir);
58
+ }
59
+ }
60
+ export function handleUserBash(event, ctx, project, baseDir) {
61
+ try {
62
+ const observation = {
63
+ timestamp: new Date().toISOString(),
64
+ event: "user_bash",
65
+ session: getSessionId(ctx),
66
+ project_id: project.id,
67
+ project_name: project.name,
68
+ command: scrubSecrets(event.command),
69
+ cwd: event.cwd,
70
+ ...buildActiveInstincts(),
71
+ };
72
+ appendObservation(observation, project.id, baseDir);
73
+ }
74
+ catch (err) {
75
+ logError(project.id, "session-observer:handleUserBash", err, baseDir);
76
+ }
77
+ }
78
+ export function handleSessionCompact(event, ctx, project, baseDir) {
79
+ try {
80
+ const observation = {
81
+ timestamp: new Date().toISOString(),
82
+ event: "session_compact",
83
+ session: getSessionId(ctx),
84
+ project_id: project.id,
85
+ project_name: project.name,
86
+ from_extension: event.fromExtension,
87
+ ...buildActiveInstincts(),
88
+ };
89
+ appendObservation(observation, project.id, baseDir);
90
+ }
91
+ catch (err) {
92
+ logError(project.id, "session-observer:handleSessionCompact", err, baseDir);
93
+ }
94
+ }
95
+ export function handleModelSelect(event, ctx, project, baseDir) {
96
+ try {
97
+ const modelName = event.model?.id ?? event.model?.name ?? "unknown";
98
+ const previousModelName = event.previousModel?.id ?? event.previousModel?.name;
99
+ const observation = {
100
+ timestamp: new Date().toISOString(),
101
+ event: "model_select",
102
+ session: getSessionId(ctx),
103
+ project_id: project.id,
104
+ project_name: project.name,
105
+ model: modelName,
106
+ ...(previousModelName ? { previous_model: previousModelName } : {}),
107
+ model_change_source: event.source,
108
+ };
109
+ appendObservation(observation, project.id, baseDir);
110
+ }
111
+ catch (err) {
112
+ logError(project.id, "session-observer:handleModelSelect", err, baseDir);
113
+ }
114
+ }
115
+ //# sourceMappingURL=session-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-observer.js","sourceRoot":"","sources":["../src/session-observer.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * Shared TypeScript interfaces for pi-continuous-learning.
3
3
  * All modules import from this file for consistent data contracts.
4
4
  */
5
- export type ObservationEvent = "tool_start" | "tool_complete" | "user_prompt" | "agent_end";
5
+ export type ObservationEvent = "tool_start" | "tool_complete" | "user_prompt" | "agent_end" | "turn_start" | "turn_end" | "user_bash" | "session_compact" | "model_select";
6
6
  export interface Observation {
7
7
  timestamp: string;
8
8
  event: ObservationEvent;
@@ -14,6 +14,16 @@ export interface Observation {
14
14
  output?: string;
15
15
  is_error?: boolean;
16
16
  active_instincts?: string[];
17
+ turn_index?: number;
18
+ tool_count?: number;
19
+ error_count?: number;
20
+ tokens_used?: number;
21
+ command?: string;
22
+ cwd?: string;
23
+ from_extension?: boolean;
24
+ model?: string;
25
+ previous_model?: string;
26
+ model_change_source?: string;
17
27
  }
18
28
  export type InstinctScope = "project" | "global";
19
29
  export type InstinctSource = "personal" | "inherited";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,eAAe,GACf,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAMD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;AACjD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAMD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,eAAe,GACf,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,WAAW,GACX,iBAAiB,GACjB,cAAc,CAAC;AAEnB,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;AACjD,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAMD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,2BAA2B,EAAE,MAAM,CAAC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-continuous-learning",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "A Pi extension that observes coding sessions and distills patterns into reusable instincts.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,6 +30,26 @@ Analyze observations for these categories:
30
30
  - Actions that consistently lead to errors or user corrections
31
31
  - Trigger: the bad pattern situation; Action: what to do instead
32
32
 
33
+ ### Turn Structure
34
+ - turn_start/turn_end events group tool calls into LLM response cycles
35
+ - Look for recurring tool sequences within turns (e.g. grep→read→edit)
36
+ - tool_count and error_count on turn_end summarize the turn
37
+ - High error_count turns suggest inefficient approaches
38
+
39
+ ### Context Pressure
40
+ - session_compact events signal context window pressure
41
+ - Frequent compaction correlated with specific tool patterns may indicate waste
42
+ - tokens_used on turn_end and agent_end tracks token consumption
43
+
44
+ ### User Shell Commands
45
+ - user_bash events capture manual shell commands the user runs
46
+ - Repeated commands after agent actions reveal verification patterns
47
+ - These are behaviors the agent should learn to do proactively
48
+
49
+ ### Model Preferences
50
+ - model_select events track when users switch models
51
+ - Patterns in model switching reveal task-complexity preferences
52
+
33
53
  ## Feedback Analysis
34
54
 
35
55
  Each observation may include an active_instincts field listing instinct IDs
package/src/index.ts CHANGED
@@ -15,6 +15,13 @@ import { ensureStorageLayout } from "./storage.js";
15
15
  import { cleanOldArchives } from "./observations.js";
16
16
  import { handleToolStart, handleToolEnd } from "./tool-observer.js";
17
17
  import { handleBeforeAgentStart, handleAgentEnd } from "./prompt-observer.js";
18
+ import {
19
+ handleTurnStart,
20
+ handleTurnEnd,
21
+ handleUserBash,
22
+ handleSessionCompact,
23
+ handleModelSelect,
24
+ } from "./session-observer.js";
18
25
  import {
19
26
  handleBeforeAgentStartInjection,
20
27
  handleAgentEndClearInstincts,
@@ -98,6 +105,51 @@ export default function (pi: ExtensionAPI): void {
98
105
  }
99
106
  });
100
107
 
108
+ pi.on("turn_start", (event, ctx) => {
109
+ try {
110
+ if (!project) return;
111
+ handleTurnStart(event, ctx, project);
112
+ } catch (err) {
113
+ logError(project?.id ?? null, "turn_start", err);
114
+ }
115
+ });
116
+
117
+ pi.on("turn_end", (event, ctx) => {
118
+ try {
119
+ if (!project) return;
120
+ handleTurnEnd(event, ctx, project);
121
+ } catch (err) {
122
+ logError(project?.id ?? null, "turn_end", err);
123
+ }
124
+ });
125
+
126
+ pi.on("user_bash", (event, ctx) => {
127
+ try {
128
+ if (!project) return;
129
+ handleUserBash(event, ctx, project);
130
+ } catch (err) {
131
+ logError(project?.id ?? null, "user_bash", err);
132
+ }
133
+ });
134
+
135
+ pi.on("session_compact", (event, ctx) => {
136
+ try {
137
+ if (!project) return;
138
+ handleSessionCompact(event, ctx, project);
139
+ } catch (err) {
140
+ logError(project?.id ?? null, "session_compact", err);
141
+ }
142
+ });
143
+
144
+ pi.on("model_select", (event, ctx) => {
145
+ try {
146
+ if (!project) return;
147
+ handleModelSelect(event, ctx, project);
148
+ } catch (err) {
149
+ logError(project?.id ?? null, "model_select", err);
150
+ }
151
+ });
152
+
101
153
  pi.registerCommand(STATUS_CMD, {
102
154
  description: "Show all instincts grouped by domain with confidence scores",
103
155
  handler: (args: string, ctx: ExtensionCommandContext) =>
@@ -76,12 +76,16 @@ export function handleAgentEnd(
76
76
  try {
77
77
  if (shouldSkipObservation()) return;
78
78
 
79
+ const contextUsage = ctx.getContextUsage();
80
+ const tokensUsed = contextUsage?.tokens ?? undefined;
81
+
79
82
  const observation: Observation = {
80
83
  timestamp: new Date().toISOString(),
81
84
  event: "agent_end",
82
85
  session: getSessionId(ctx),
83
86
  project_id: project.id,
84
87
  project_name: project.name,
88
+ ...(tokensUsed != null ? { tokens_used: tokensUsed } : {}),
85
89
  ...buildActiveInstincts(),
86
90
  };
87
91
 
@@ -0,0 +1,185 @@
1
+ import type { ExtensionContext } from "@mariozechner/pi-coding-agent";
2
+
3
+ import { getCurrentActiveInstincts } from "./active-instincts.js";
4
+ import { appendObservation } from "./observations.js";
5
+ import { scrubSecrets } from "./scrubber.js";
6
+ import { logError } from "./error-logger.js";
7
+ import type { Observation, ProjectEntry } from "./types.js";
8
+
9
+ export interface TurnStartEvent {
10
+ type: "turn_start";
11
+ turnIndex: number;
12
+ timestamp: number;
13
+ }
14
+
15
+ export interface TurnEndEvent {
16
+ type: "turn_end";
17
+ turnIndex: number;
18
+ message: unknown;
19
+ toolResults: unknown[];
20
+ }
21
+
22
+ export interface UserBashEvent {
23
+ type: "user_bash";
24
+ command: string;
25
+ excludeFromContext: boolean;
26
+ cwd: string;
27
+ }
28
+
29
+ export interface SessionCompactEvent {
30
+ type: "session_compact";
31
+ compactionEntry: unknown;
32
+ fromExtension: boolean;
33
+ }
34
+
35
+ export interface ModelSelectEvent {
36
+ type: "model_select";
37
+ model: { id?: string; name?: string };
38
+ previousModel: { id?: string; name?: string } | undefined;
39
+ source: "set" | "cycle" | "restore";
40
+ }
41
+
42
+ function getSessionId(ctx: ExtensionContext): string {
43
+ return ctx.sessionManager.getSessionId();
44
+ }
45
+
46
+ function buildActiveInstincts(): Pick<Observation, "active_instincts"> {
47
+ const ids = getCurrentActiveInstincts();
48
+ return ids.length > 0 ? { active_instincts: ids } : {};
49
+ }
50
+
51
+ export function handleTurnStart(
52
+ event: TurnStartEvent,
53
+ ctx: ExtensionContext,
54
+ project: ProjectEntry,
55
+ baseDir?: string
56
+ ): void {
57
+ try {
58
+ const observation: Observation = {
59
+ timestamp: new Date().toISOString(),
60
+ event: "turn_start",
61
+ session: getSessionId(ctx),
62
+ project_id: project.id,
63
+ project_name: project.name,
64
+ turn_index: event.turnIndex,
65
+ ...buildActiveInstincts(),
66
+ };
67
+
68
+ appendObservation(observation, project.id, baseDir);
69
+ } catch (err) {
70
+ logError(project.id, "session-observer:handleTurnStart", err, baseDir);
71
+ }
72
+ }
73
+
74
+ export function handleTurnEnd(
75
+ event: TurnEndEvent,
76
+ ctx: ExtensionContext,
77
+ project: ProjectEntry,
78
+ baseDir?: string
79
+ ): void {
80
+ try {
81
+ const toolCount = event.toolResults?.length ?? 0;
82
+ const errorCount = Array.isArray(event.toolResults)
83
+ ? event.toolResults.filter((r: unknown) => {
84
+ if (r && typeof r === "object" && "isError" in r) {
85
+ return (r as { isError: boolean }).isError;
86
+ }
87
+ return false;
88
+ }).length
89
+ : 0;
90
+
91
+ const contextUsage = ctx.getContextUsage();
92
+ const tokensUsed = contextUsage?.tokens ?? undefined;
93
+
94
+ const observation: Observation = {
95
+ timestamp: new Date().toISOString(),
96
+ event: "turn_end",
97
+ session: getSessionId(ctx),
98
+ project_id: project.id,
99
+ project_name: project.name,
100
+ turn_index: event.turnIndex,
101
+ tool_count: toolCount,
102
+ error_count: errorCount,
103
+ ...(tokensUsed != null ? { tokens_used: tokensUsed } : {}),
104
+ ...buildActiveInstincts(),
105
+ };
106
+
107
+ appendObservation(observation, project.id, baseDir);
108
+ } catch (err) {
109
+ logError(project.id, "session-observer:handleTurnEnd", err, baseDir);
110
+ }
111
+ }
112
+
113
+ export function handleUserBash(
114
+ event: UserBashEvent,
115
+ ctx: ExtensionContext,
116
+ project: ProjectEntry,
117
+ baseDir?: string
118
+ ): void {
119
+ try {
120
+ const observation: Observation = {
121
+ timestamp: new Date().toISOString(),
122
+ event: "user_bash",
123
+ session: getSessionId(ctx),
124
+ project_id: project.id,
125
+ project_name: project.name,
126
+ command: scrubSecrets(event.command),
127
+ cwd: event.cwd,
128
+ ...buildActiveInstincts(),
129
+ };
130
+
131
+ appendObservation(observation, project.id, baseDir);
132
+ } catch (err) {
133
+ logError(project.id, "session-observer:handleUserBash", err, baseDir);
134
+ }
135
+ }
136
+
137
+ export function handleSessionCompact(
138
+ event: SessionCompactEvent,
139
+ ctx: ExtensionContext,
140
+ project: ProjectEntry,
141
+ baseDir?: string
142
+ ): void {
143
+ try {
144
+ const observation: Observation = {
145
+ timestamp: new Date().toISOString(),
146
+ event: "session_compact",
147
+ session: getSessionId(ctx),
148
+ project_id: project.id,
149
+ project_name: project.name,
150
+ from_extension: event.fromExtension,
151
+ ...buildActiveInstincts(),
152
+ };
153
+
154
+ appendObservation(observation, project.id, baseDir);
155
+ } catch (err) {
156
+ logError(project.id, "session-observer:handleSessionCompact", err, baseDir);
157
+ }
158
+ }
159
+
160
+ export function handleModelSelect(
161
+ event: ModelSelectEvent,
162
+ ctx: ExtensionContext,
163
+ project: ProjectEntry,
164
+ baseDir?: string
165
+ ): void {
166
+ try {
167
+ const modelName = event.model?.id ?? event.model?.name ?? "unknown";
168
+ const previousModelName = event.previousModel?.id ?? event.previousModel?.name;
169
+
170
+ const observation: Observation = {
171
+ timestamp: new Date().toISOString(),
172
+ event: "model_select",
173
+ session: getSessionId(ctx),
174
+ project_id: project.id,
175
+ project_name: project.name,
176
+ model: modelName,
177
+ ...(previousModelName ? { previous_model: previousModelName } : {}),
178
+ model_change_source: event.source,
179
+ };
180
+
181
+ appendObservation(observation, project.id, baseDir);
182
+ } catch (err) {
183
+ logError(project.id, "session-observer:handleModelSelect", err, baseDir);
184
+ }
185
+ }
package/src/types.ts CHANGED
@@ -11,7 +11,12 @@ export type ObservationEvent =
11
11
  | "tool_start"
12
12
  | "tool_complete"
13
13
  | "user_prompt"
14
- | "agent_end";
14
+ | "agent_end"
15
+ | "turn_start"
16
+ | "turn_end"
17
+ | "user_bash"
18
+ | "session_compact"
19
+ | "model_select";
15
20
 
16
21
  export interface Observation {
17
22
  timestamp: string; // ISO 8601 UTC
@@ -24,6 +29,16 @@ export interface Observation {
24
29
  output?: string;
25
30
  is_error?: boolean;
26
31
  active_instincts?: string[];
32
+ turn_index?: number;
33
+ tool_count?: number;
34
+ error_count?: number;
35
+ tokens_used?: number;
36
+ command?: string;
37
+ cwd?: string;
38
+ from_extension?: boolean;
39
+ model?: string;
40
+ previous_model?: string;
41
+ model_change_source?: string;
27
42
  }
28
43
 
29
44
  // ---------------------------------------------------------------------------