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 +3 -4
- package/dist/cli/analyze-prompt.d.ts.map +1 -1
- package/dist/cli/analyze-prompt.js +20 -0
- package/dist/cli/analyze-prompt.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -1
- package/dist/prompt-observer.d.ts.map +1 -1
- package/dist/prompt-observer.js +3 -0
- package/dist/prompt-observer.js.map +1 -1
- package/dist/session-observer.d.ts +42 -0
- package/dist/session-observer.d.ts.map +1 -0
- package/dist/session-observer.js +115 -0
- package/dist/session-observer.js.map +1 -0
- package/dist/types.d.ts +11 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cli/analyze-prompt.ts +20 -0
- package/src/index.ts +52 -0
- package/src/prompt-observer.ts +4 -0
- package/src/session-observer.ts +185 -0
- package/src/types.ts +16 -1
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
|
|
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
|
|
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,
|
|
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
|
|
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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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"}
|
package/dist/prompt-observer.js
CHANGED
|
@@ -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";
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
@@ -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) =>
|
package/src/prompt-observer.ts
CHANGED
|
@@ -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
|
// ---------------------------------------------------------------------------
|