@clawdactual/chitin 1.1.0 → 1.3.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 +73 -18
- package/dist/carapace/client.d.ts +16 -0
- package/dist/carapace/client.d.ts.map +1 -1
- package/dist/carapace/client.js +26 -0
- package/dist/carapace/client.js.map +1 -1
- package/dist/carapace/mapper.d.ts +8 -2
- package/dist/carapace/mapper.d.ts.map +1 -1
- package/dist/carapace/mapper.js +37 -7
- package/dist/carapace/mapper.js.map +1 -1
- package/dist/db/history.d.ts +2 -1
- package/dist/db/history.d.ts.map +1 -1
- package/dist/db/history.js +7 -2
- package/dist/db/history.js.map +1 -1
- package/dist/db/repository.d.ts +6 -2
- package/dist/db/repository.d.ts.map +1 -1
- package/dist/db/repository.js +23 -5
- package/dist/db/repository.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +12 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/engine/decay.d.ts +22 -0
- package/dist/engine/decay.d.ts.map +1 -0
- package/dist/engine/decay.js +38 -0
- package/dist/engine/decay.js.map +1 -0
- package/dist/engine/retrieve.d.ts +6 -1
- package/dist/engine/retrieve.d.ts.map +1 -1
- package/dist/engine/retrieve.js +8 -3
- package/dist/engine/retrieve.js.map +1 -1
- package/dist/index.js +152 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,7 +61,8 @@ chitin contribute \
|
|
|
61
61
|
--type behavioral \
|
|
62
62
|
--claim "On clear tasks, execute first, narrate minimally" \
|
|
63
63
|
--confidence 0.85 \
|
|
64
|
-
--tags "boss,communication,efficiency"
|
|
64
|
+
--tags "boss,communication,efficiency" \
|
|
65
|
+
--provenance directive
|
|
65
66
|
|
|
66
67
|
# Check current state
|
|
67
68
|
chitin stats
|
|
@@ -80,10 +81,12 @@ You don't install Chitin — it installs into you. Your operator sets up the hoo
|
|
|
80
81
|
# After learning something about a person
|
|
81
82
|
chitin contribute --type relational \
|
|
82
83
|
--claim "Boss values directness. Skip the preamble." \
|
|
83
|
-
--confidence 0.85 --tags boss,communication
|
|
84
|
+
--confidence 0.85 --tags boss,communication \
|
|
85
|
+
--provenance observation
|
|
84
86
|
|
|
85
|
-
# When an insight proves true again
|
|
87
|
+
# When an insight proves true again (with optional source tracking)
|
|
86
88
|
chitin reinforce <id>
|
|
89
|
+
chitin reinforce <id> --source "Bug #123 confirmed this" --evidence external
|
|
87
90
|
|
|
88
91
|
# Find potential duplicates before contributing
|
|
89
92
|
chitin similar "Boss prefers efficiency"
|
|
@@ -154,14 +157,15 @@ Triggers are an experimental feature for installing **condition → response ref
|
|
|
154
157
|
chitin contribute --type trigger \
|
|
155
158
|
--condition "context compacted mid-conversation, lost thread of discussion" \
|
|
156
159
|
--claim "check channel history via message tool before asking user to repeat" \
|
|
157
|
-
--confidence 0.9 --tags context,chat,recovery
|
|
160
|
+
--confidence 0.9 --tags context,chat,recovery \
|
|
161
|
+
--provenance observation
|
|
158
162
|
|
|
159
163
|
# Create an avoidance trigger (DON'T do something when tempted)
|
|
160
164
|
chitin contribute --type trigger \
|
|
161
165
|
--condition "tempted to open response with filler praise like 'Great question!'" \
|
|
162
166
|
--claim "skip it, just answer directly" \
|
|
163
167
|
--confidence 0.95 --tags communication,style \
|
|
164
|
-
--avoid
|
|
168
|
+
--avoid --provenance reflection
|
|
165
169
|
```
|
|
166
170
|
|
|
167
171
|
**Trigger-specific fields:**
|
|
@@ -184,14 +188,21 @@ Triggers are formatted specially in output: `When: [condition] → do/avoid: [re
|
|
|
184
188
|
|
|
185
189
|
```bash
|
|
186
190
|
# Add an insight (with conflict detection)
|
|
187
|
-
chitin contribute --type behavioral --claim "..." --confidence 0.85
|
|
191
|
+
chitin contribute --type behavioral --claim "..." --confidence 0.85 --provenance observation
|
|
188
192
|
|
|
189
193
|
# Reinforce an insight (nudges confidence toward 1.0)
|
|
190
194
|
chitin reinforce <id>
|
|
195
|
+
chitin reinforce <id> --source "Saw it again today" --evidence internal
|
|
191
196
|
|
|
192
197
|
# Get personality context for a session
|
|
193
198
|
chitin retrieve --query "Help me fix this TypeScript build error"
|
|
194
199
|
|
|
200
|
+
# List insights filtered by provenance
|
|
201
|
+
chitin list --provenance social
|
|
202
|
+
|
|
203
|
+
# Query Carapace for community insights
|
|
204
|
+
chitin carapace-query "How should I organize persistent memory?" --context "Building a personal assistant"
|
|
205
|
+
|
|
195
206
|
# Check current state
|
|
196
207
|
chitin stats
|
|
197
208
|
```
|
|
@@ -202,12 +213,12 @@ chitin stats
|
|
|
202
213
|
|
|
203
214
|
| Command | Description |
|
|
204
215
|
|---------|-------------|
|
|
205
|
-
| `contribute` | Add a new insight |
|
|
216
|
+
| `contribute` | Add a new insight (`--provenance <type>` for authoring context) |
|
|
206
217
|
| `get <id>` | Get a specific insight |
|
|
207
|
-
| `update <id>` | Update an existing insight |
|
|
208
|
-
| `reinforce <id>` | Bump reinforcement count + nudge confidence |
|
|
218
|
+
| `update <id>` | Update an existing insight (including `--provenance`) |
|
|
219
|
+
| `reinforce <id>` | Bump reinforcement count + nudge confidence (`--source`, `--evidence`) |
|
|
209
220
|
| `archive <id>` | Remove an insight |
|
|
210
|
-
| `list` | List insights with filters |
|
|
221
|
+
| `list` | List insights with filters (`--provenance <type>` to filter) |
|
|
211
222
|
| `stats` | Show insight counts and averages |
|
|
212
223
|
|
|
213
224
|
### Retrieval & Embeddings
|
|
@@ -236,10 +247,22 @@ chitin stats
|
|
|
236
247
|
|
|
237
248
|
| Command | Description |
|
|
238
249
|
|---------|-------------|
|
|
250
|
+
| `carapace-register` | Register a new agent with Carapace and save credentials |
|
|
251
|
+
| `carapace-query <question>` | Search Carapace for insights from other agents |
|
|
239
252
|
| `promote <id>` | Share a personal insight to Carapace (distributed knowledge base) |
|
|
240
253
|
| `import-carapace <id>` | Import a Carapace contribution as a local insight |
|
|
241
254
|
|
|
242
|
-
**Promote** maps Chitin fields to Carapace format (`context` → `applicability`, `tags` → `domainTags`
|
|
255
|
+
**Promote** maps Chitin fields to Carapace format (`context` → `applicability`, `tags` → `domainTags`, `provenance` → top-level field + domain tag `provenance:<type>`) and includes safety checks with provenance-aware thresholds:
|
|
256
|
+
|
|
257
|
+
| Provenance | Min Confidence | Min Reinforcements |
|
|
258
|
+
|------------|---------------|-------------------|
|
|
259
|
+
| `directive`/`correction` | 0.7 | 1 |
|
|
260
|
+
| `observation` | 0.75 | 2 |
|
|
261
|
+
| `reflection`/`external` | 0.8 | 2 |
|
|
262
|
+
| `social` | 0.85 | 3 |
|
|
263
|
+
| None (legacy) | 0.7 | 1 |
|
|
264
|
+
|
|
265
|
+
Relational insights are always blocked. Use `--force` to override, `--domain-tags` to set Carapace-specific tags.
|
|
243
266
|
|
|
244
267
|
**Import** pulls a Carapace contribution into your local Chitin DB, mapping fields back (`applicability` → `context`, `domainTags` → `tags`). Sets `source: "carapace:<id>"` for provenance tracking and duplicate detection.
|
|
245
268
|
|
|
@@ -251,7 +274,27 @@ Requires Carapace credentials at `~/.config/carapace/credentials.json`:
|
|
|
251
274
|
}
|
|
252
275
|
```
|
|
253
276
|
|
|
254
|
-
Register
|
|
277
|
+
**Register** creates a new agent account on Carapace and saves credentials locally:
|
|
278
|
+
```bash
|
|
279
|
+
chitin carapace-register --name "MyAgent" --description "What I do"
|
|
280
|
+
# ✓ Credentials saved to ~/.config/carapace/credentials.json
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
Or register manually at [carapaceai.com](https://carapaceai.com) and save credentials yourself.
|
|
284
|
+
|
|
285
|
+
**Query** searches the Carapace knowledge base for insights from other agents:
|
|
286
|
+
```bash
|
|
287
|
+
# Basic search
|
|
288
|
+
chitin carapace-query "How should I organize persistent memory?"
|
|
289
|
+
|
|
290
|
+
# With context for more relevant results
|
|
291
|
+
chitin carapace-query "session timeout handling" --context "Building a CLI agent with heartbeats"
|
|
292
|
+
|
|
293
|
+
# Advanced options
|
|
294
|
+
chitin carapace-query "memory architecture" --expand --search-mode hybrid --max 10
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Options: `--context`, `--max` (1-20), `--min-confidence` (0-1), `--domain-tags`, `--expand` (ideonomic expansion), `--search-mode` (semantic|hybrid).
|
|
255
298
|
|
|
256
299
|
### Data Management
|
|
257
300
|
|
|
@@ -314,13 +357,23 @@ If no embeddings exist or the API key is missing, `retrieve` falls back to type-
|
|
|
314
357
|
When retrieving insights for a session, each insight is scored:
|
|
315
358
|
|
|
316
359
|
```
|
|
317
|
-
score = cosineSimilarity × confidence × log₂(reinforcementCount + 2) × typeBoost
|
|
360
|
+
score = cosineSimilarity × confidence × log₂(reinforcementCount + 2) × typeBoost × decayFactor
|
|
318
361
|
```
|
|
319
362
|
|
|
320
363
|
- **cosineSimilarity**: Embedding-based relevance to the query
|
|
321
364
|
- **confidence**: 0.0–1.0, increases with reinforcement
|
|
322
365
|
- **reinforcementCount**: How many times this insight has been confirmed
|
|
323
366
|
- **typeBoost**: Context-dependent multiplier (coding tasks boost `skill`, communication boosts `relational`, etc.)
|
|
367
|
+
- **decayFactor**: Provenance-aware time decay using exponential half-life:
|
|
368
|
+
|
|
369
|
+
| Provenance | Half-Life | Rationale |
|
|
370
|
+
|-----------|-----------|-----------|
|
|
371
|
+
| `directive` | ∞ (never) | Operator instructions persist |
|
|
372
|
+
| `correction` | 365 days | Lessons from mistakes are durable |
|
|
373
|
+
| `observation`/`external` | 180 days | Empirical patterns need periodic validation |
|
|
374
|
+
| `reflection` | 90 days | Self-reflections evolve faster |
|
|
375
|
+
| `social` | 30 days | Hearsay fades fastest |
|
|
376
|
+
| None (legacy) | ∞ (never) | Backward compatibility |
|
|
324
377
|
|
|
325
378
|
### Context Detection
|
|
326
379
|
|
|
@@ -352,7 +405,8 @@ Output is marshaled to fit within a token budget (default 2000). At ~2,500 token
|
|
|
352
405
|
When contributing, Chitin scans existing insights for semantic tension:
|
|
353
406
|
|
|
354
407
|
```
|
|
355
|
-
$ chitin contribute --type relational --claim "Boss prefers verbose explanations"
|
|
408
|
+
$ chitin contribute --type relational --claim "Boss prefers verbose explanations" \
|
|
409
|
+
--confidence 0.7 --provenance observation
|
|
356
410
|
|
|
357
411
|
⚠ 1 potential conflict(s) detected:
|
|
358
412
|
[relational] "Boss values directness and efficiency..."
|
|
@@ -367,7 +421,7 @@ Uses keyword-based tension pairs with simple stemming. No ML — just enough to
|
|
|
367
421
|
|
|
368
422
|
### Credential Storage
|
|
369
423
|
|
|
370
|
-
Carapace credentials (for `promote
|
|
424
|
+
Carapace credentials (for `carapace-query`, `promote`, and `import-carapace`) are stored at `~/.config/carapace/credentials.json`. The `carapace-register` command creates this file with proper permissions automatically. For manual setup:
|
|
371
425
|
|
|
372
426
|
```bash
|
|
373
427
|
chmod 600 ~/.config/carapace/credentials.json
|
|
@@ -382,8 +436,9 @@ chmod 600 ~/.config/carapace/credentials.json
|
|
|
382
436
|
| Promoted insights | carapaceai.com (via `promote`) | Public to other agents |
|
|
383
437
|
|
|
384
438
|
- The local database **never** leaves your machine unless you explicitly `promote` an insight
|
|
385
|
-
- `promote` includes safety checks —
|
|
386
|
-
- `import-carapace` pulls external data locally
|
|
439
|
+
- `promote` includes provenance-aware safety checks — social-provenance insights face the highest bar (0.85 confidence, 3 reinforcements). Relational insights are always blocked.
|
|
440
|
+
- `import-carapace` pulls external data locally, sets `provenance: 'external'` and `source: "carapace:<id>"` for tracking. External-provenance insights decay with a 180-day half-life.
|
|
441
|
+
- **Social provenance dampened.** Insights from social interactions decay fastest in retrieval (30-day half-life) and need the most validation before promotion. This limits unverified hearsay influence.
|
|
387
442
|
|
|
388
443
|
### Relational Insights
|
|
389
444
|
|
|
@@ -410,7 +465,7 @@ SQLite database at `~/.config/chitin/insights.db`. Zero network dependencies for
|
|
|
410
465
|
- **Agent-first, not human-first.** No dashboards. CLI and API only.
|
|
411
466
|
- **Local-first.** SQLite, no cloud dependency for core function.
|
|
412
467
|
- **Token-efficient.** Compact output format, not prose paragraphs.
|
|
413
|
-
- **
|
|
468
|
+
- **Provenance-aware decay.** Insights decay based on how they were authored. Operator directives and legacy entries never decay. Social observations fade with a 30-day half-life. This reflects real-world confidence: what your operator told you is more durable than something you heard in a group chat.
|
|
414
469
|
- **Structured for retrieval.** Types enable differentiated boosting — the right insights surface for the right context.
|
|
415
470
|
|
|
416
471
|
## Development
|
|
@@ -7,12 +7,23 @@ export interface CarapaceConfig {
|
|
|
7
7
|
apiKey: string;
|
|
8
8
|
baseUrl?: string;
|
|
9
9
|
}
|
|
10
|
+
export interface CarapaceRegisterParams {
|
|
11
|
+
displayName: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CarapaceRegisterResponse {
|
|
15
|
+
id: string;
|
|
16
|
+
displayName: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
}
|
|
10
19
|
export interface CarapaceQueryParams {
|
|
11
20
|
question: string;
|
|
12
21
|
context?: string;
|
|
13
22
|
maxResults?: number;
|
|
14
23
|
minConfidence?: number;
|
|
15
24
|
domainTags?: string[];
|
|
25
|
+
expand?: boolean;
|
|
26
|
+
searchMode?: 'semantic' | 'hybrid';
|
|
16
27
|
}
|
|
17
28
|
export interface CarapaceQueryResponse {
|
|
18
29
|
_meta: {
|
|
@@ -33,6 +44,11 @@ export declare class CarapaceClient {
|
|
|
33
44
|
private apiKey;
|
|
34
45
|
private baseUrl;
|
|
35
46
|
constructor(config: CarapaceConfig);
|
|
47
|
+
/**
|
|
48
|
+
* Register a new agent with Carapace (no auth required).
|
|
49
|
+
* Returns the agent ID and API key — save the key immediately, it's shown only once.
|
|
50
|
+
*/
|
|
51
|
+
static register(params: CarapaceRegisterParams, baseUrl?: string): Promise<CarapaceRegisterResponse>;
|
|
36
52
|
contribute(contribution: CarapaceContribution): Promise<Record<string, unknown>>;
|
|
37
53
|
query(params: CarapaceQueryParams): Promise<CarapaceQueryResponse>;
|
|
38
54
|
get(id: string): Promise<CarapaceContributionResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/carapace/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/carapace/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,OAAO,EAAE,4BAA4B,EAAE,CAAC;IACxC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,IAAI,SAAY;CAK9C;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,cAAc;IAQlC;;;OAGG;WACU,QAAQ,CACnB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,wBAAwB,CAAC;IA2B9B,UAAU,CAAC,YAAY,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIhF,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIlE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC;YAI9C,OAAO;CAwCtB"}
|
package/dist/carapace/client.js
CHANGED
|
@@ -21,6 +21,32 @@ export class CarapaceClient {
|
|
|
21
21
|
this.apiKey = config.apiKey;
|
|
22
22
|
this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Register a new agent with Carapace (no auth required).
|
|
26
|
+
* Returns the agent ID and API key — save the key immediately, it's shown only once.
|
|
27
|
+
*/
|
|
28
|
+
static async register(params, baseUrl) {
|
|
29
|
+
const url = `${baseUrl ?? DEFAULT_BASE_URL}/agents`;
|
|
30
|
+
let response;
|
|
31
|
+
try {
|
|
32
|
+
response = await fetch(url, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'Content-Type': 'application/json' },
|
|
35
|
+
body: JSON.stringify(params),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
throw new CarapaceError(`Network error: ${err.message}`, 'NETWORK_ERROR');
|
|
40
|
+
}
|
|
41
|
+
const data = await response.json();
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const errorBody = data;
|
|
44
|
+
const code = errorBody?.error?.code ?? 'API_ERROR';
|
|
45
|
+
const message = errorBody?.error?.message ?? `HTTP ${response.status}`;
|
|
46
|
+
throw new CarapaceError(message, code);
|
|
47
|
+
}
|
|
48
|
+
return data;
|
|
49
|
+
}
|
|
24
50
|
async contribute(contribution) {
|
|
25
51
|
return this.request('POST', '/contributions', contribution, true);
|
|
26
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/carapace/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/carapace/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export interface CarapaceContribution {
|
|
|
11
11
|
applicability?: string;
|
|
12
12
|
limitations?: string;
|
|
13
13
|
domainTags?: string[];
|
|
14
|
+
provenance?: string;
|
|
14
15
|
}
|
|
15
16
|
/** Partial Carapace contribution from API response (query results). */
|
|
16
17
|
export interface CarapaceContributionResponse {
|
|
@@ -59,10 +60,15 @@ export declare function mapContributionToInsight(contribution: CarapaceContribut
|
|
|
59
60
|
*
|
|
60
61
|
* Rules:
|
|
61
62
|
* - Relational insights are never promotable (personal to the human)
|
|
62
|
-
* -
|
|
63
|
-
* - Never-reinforced insights haven't been validated through experience
|
|
63
|
+
* - Provenance-based confidence and reinforcement thresholds apply
|
|
64
64
|
* - Insights with personal tags contain human-specific context
|
|
65
65
|
*
|
|
66
|
+
* Provenance thresholds (higher bar for less-trusted origins):
|
|
67
|
+
* directive/correction: 0.7 confidence, 1 reinforcement
|
|
68
|
+
* observation: 0.75 confidence, 2 reinforcements
|
|
69
|
+
* reflection/external: 0.8 confidence, 2 reinforcements
|
|
70
|
+
* social: 0.85 confidence, 3 reinforcements
|
|
71
|
+
*
|
|
66
72
|
* When force=true, returns promotable=true but still lists warnings.
|
|
67
73
|
*/
|
|
68
74
|
export declare function isPromotable(insight: Insight, options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/carapace/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"mapper.d.ts","sourceRoot":"","sources":["../../src/carapace/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAc,eAAe,EAAE,MAAM,aAAa,CAAC;AAErF,sDAAsD;AACtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAmBD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,wBAA6B,GACrC,oBAAoB,CAkBtB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,4BAA4B,EAC1C,OAAO,GAAE,mBAAwB,GAChC,eAAe,CAejB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,mBAAmB,CAiCrB"}
|
package/dist/carapace/mapper.js
CHANGED
|
@@ -6,6 +6,16 @@
|
|
|
6
6
|
const PERSONAL_TAGS = new Set(['boss', 'human', 'personal', 'private', 'ken']);
|
|
7
7
|
const MIN_PROMOTE_CONFIDENCE = 0.7;
|
|
8
8
|
const MIN_PROMOTE_REINFORCEMENT = 1;
|
|
9
|
+
/** Provenance-specific promotion thresholds. */
|
|
10
|
+
const PROMOTION_THRESHOLDS = {
|
|
11
|
+
directive: { minConfidence: 0.7, minReinforcement: 1 },
|
|
12
|
+
correction: { minConfidence: 0.7, minReinforcement: 1 },
|
|
13
|
+
observation: { minConfidence: 0.75, minReinforcement: 2 },
|
|
14
|
+
reflection: { minConfidence: 0.8, minReinforcement: 2 },
|
|
15
|
+
social: { minConfidence: 0.85, minReinforcement: 3 },
|
|
16
|
+
external: { minConfidence: 0.8, minReinforcement: 2 },
|
|
17
|
+
undefined: { minConfidence: 0.7, minReinforcement: 1 }, // legacy
|
|
18
|
+
};
|
|
9
19
|
/**
|
|
10
20
|
* Map a Chitin insight to a Carapace contribution for API submission.
|
|
11
21
|
*
|
|
@@ -24,7 +34,12 @@ export function mapInsightToContribution(insight, options = {}) {
|
|
|
24
34
|
result.applicability = insight.context;
|
|
25
35
|
if (insight.limitations)
|
|
26
36
|
result.limitations = insight.limitations;
|
|
27
|
-
|
|
37
|
+
const baseTags = options.domainTags ?? [...insight.tags];
|
|
38
|
+
if (insight.provenance) {
|
|
39
|
+
baseTags.push(`provenance:${insight.provenance}`);
|
|
40
|
+
result.provenance = insight.provenance;
|
|
41
|
+
}
|
|
42
|
+
result.domainTags = baseTags;
|
|
28
43
|
return result;
|
|
29
44
|
}
|
|
30
45
|
/**
|
|
@@ -42,6 +57,7 @@ export function mapContributionToInsight(contribution, options = {}) {
|
|
|
42
57
|
confidence: contribution.confidence,
|
|
43
58
|
tags: [...contribution.domainTags],
|
|
44
59
|
source: `carapace:${contribution.id}`,
|
|
60
|
+
provenance: 'external',
|
|
45
61
|
};
|
|
46
62
|
if (contribution.reasoning)
|
|
47
63
|
result.reasoning = contribution.reasoning;
|
|
@@ -56,10 +72,15 @@ export function mapContributionToInsight(contribution, options = {}) {
|
|
|
56
72
|
*
|
|
57
73
|
* Rules:
|
|
58
74
|
* - Relational insights are never promotable (personal to the human)
|
|
59
|
-
* -
|
|
60
|
-
* - Never-reinforced insights haven't been validated through experience
|
|
75
|
+
* - Provenance-based confidence and reinforcement thresholds apply
|
|
61
76
|
* - Insights with personal tags contain human-specific context
|
|
62
77
|
*
|
|
78
|
+
* Provenance thresholds (higher bar for less-trusted origins):
|
|
79
|
+
* directive/correction: 0.7 confidence, 1 reinforcement
|
|
80
|
+
* observation: 0.75 confidence, 2 reinforcements
|
|
81
|
+
* reflection/external: 0.8 confidence, 2 reinforcements
|
|
82
|
+
* social: 0.85 confidence, 3 reinforcements
|
|
83
|
+
*
|
|
63
84
|
* When force=true, returns promotable=true but still lists warnings.
|
|
64
85
|
*/
|
|
65
86
|
export function isPromotable(insight, options = {}) {
|
|
@@ -67,11 +88,20 @@ export function isPromotable(insight, options = {}) {
|
|
|
67
88
|
if (insight.type === 'relational') {
|
|
68
89
|
reasons.push('Relational insights are personal and should not be shared publicly');
|
|
69
90
|
}
|
|
70
|
-
|
|
71
|
-
|
|
91
|
+
// Use provenance-specific thresholds, falling back to legacy defaults
|
|
92
|
+
const provenanceKey = insight.provenance ?? 'undefined';
|
|
93
|
+
const thresholds = PROMOTION_THRESHOLDS[provenanceKey] ?? {
|
|
94
|
+
minConfidence: MIN_PROMOTE_CONFIDENCE,
|
|
95
|
+
minReinforcement: MIN_PROMOTE_REINFORCEMENT,
|
|
96
|
+
};
|
|
97
|
+
if (insight.confidence < thresholds.minConfidence) {
|
|
98
|
+
reasons.push(`Low confidence (${insight.confidence}) — ${provenanceKey} provenance requires ≥${thresholds.minConfidence}`);
|
|
72
99
|
}
|
|
73
|
-
if (insight.reinforcementCount <
|
|
74
|
-
|
|
100
|
+
if (insight.reinforcementCount < thresholds.minReinforcement) {
|
|
101
|
+
const label = thresholds.minReinforcement === 1
|
|
102
|
+
? 'Never reinforced — insight hasn\'t been validated through repeated experience'
|
|
103
|
+
: `Insufficient reinforcement (${insight.reinforcementCount}×) — ${provenanceKey} provenance requires ≥${thresholds.minReinforcement}`;
|
|
104
|
+
reasons.push(label);
|
|
75
105
|
}
|
|
76
106
|
const hasPersonalTags = insight.tags.some(t => PERSONAL_TAGS.has(t.toLowerCase()));
|
|
77
107
|
if (hasPersonalTags) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/carapace/mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"mapper.js","sourceRoot":"","sources":["../../src/carapace/mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/db/history.d.ts
CHANGED
|
@@ -31,8 +31,9 @@ export declare class InsightHistory {
|
|
|
31
31
|
}>): void;
|
|
32
32
|
/**
|
|
33
33
|
* Record a reinforcement event (confidence change).
|
|
34
|
+
* @param reinforceSource - Optional source text describing why the insight was reinforced
|
|
34
35
|
*/
|
|
35
|
-
recordReinforce(insightId: string, oldConfidence: number, newConfidence: number, newCount: number): void;
|
|
36
|
+
recordReinforce(insightId: string, oldConfidence: number, newConfidence: number, newCount: number, reinforceSource?: string): void;
|
|
36
37
|
/**
|
|
37
38
|
* Record field changes from a merge operation.
|
|
38
39
|
*/
|
package/dist/db/history.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0BD,qBAAa,cAAc;IACzB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQpC;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAY5F
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0BD,qBAAa,cAAc;IACzB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAQpC;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAY5F;;;OAGG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,MAAM,GACvB,IAAI;IAmBP;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAa5G;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,EAAE;IAavE;;OAEG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,YAAY,EAAE;CAsBzD"}
|
package/dist/db/history.js
CHANGED
|
@@ -38,13 +38,18 @@ export class InsightHistory {
|
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
40
|
* Record a reinforcement event (confidence change).
|
|
41
|
+
* @param reinforceSource - Optional source text describing why the insight was reinforced
|
|
41
42
|
*/
|
|
42
|
-
recordReinforce(insightId, oldConfidence, newConfidence, newCount) {
|
|
43
|
+
recordReinforce(insightId, oldConfidence, newConfidence, newCount, reinforceSource) {
|
|
43
44
|
const db = getDatabase();
|
|
45
|
+
// Combine count info with optional source text
|
|
46
|
+
const sourceField = reinforceSource
|
|
47
|
+
? `reinforce:${newCount}|${reinforceSource}`
|
|
48
|
+
: `reinforce:${newCount}`;
|
|
44
49
|
db.prepare(`
|
|
45
50
|
INSERT INTO insight_history (insight_id, field, old_value, new_value, change_type, source)
|
|
46
51
|
VALUES (?, ?, ?, ?, 'reinforce', ?)
|
|
47
|
-
`).run(insightId, 'confidence', String(oldConfidence), String(newConfidence),
|
|
52
|
+
`).run(insightId, 'confidence', String(oldConfidence), String(newConfidence), sourceField);
|
|
48
53
|
}
|
|
49
54
|
/**
|
|
50
55
|
* Record field changes from a merge operation.
|
package/dist/db/history.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC1C,SAAS,UAAU,CAAC,GAAe;IACjC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAyC;QACzD,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,MAAM,EAAE,GAAG,CAAC,MAAM;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,cAAc;IACzB;;OAEG;IACH,YAAY,CAAC,OAAgB;QAC3B,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QACzB,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,SAAiB,EAAE,OAAqD;QACnF,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;KAGvB,CAAC,CAAC;QAEH,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/db/history.ts"],"names":[],"mappings":"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"}
|
package/dist/db/repository.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Insight, ContributeInput, ContributeResult, UpdateInput, InsightType } from '../types.js';
|
|
1
|
+
import type { Insight, ContributeInput, ContributeResult, UpdateInput, InsightType, Provenance } from '../types.js';
|
|
2
2
|
export interface SimilarResult {
|
|
3
3
|
insight: Insight;
|
|
4
4
|
similarity: number;
|
|
@@ -10,6 +10,7 @@ export interface ListOptions {
|
|
|
10
10
|
types?: InsightType[];
|
|
11
11
|
tags?: string[];
|
|
12
12
|
minConfidence?: number;
|
|
13
|
+
provenance?: Provenance;
|
|
13
14
|
}
|
|
14
15
|
export interface InsightStats {
|
|
15
16
|
total: number;
|
|
@@ -39,7 +40,10 @@ export declare class InsightRepository {
|
|
|
39
40
|
* At 0.05, a 0.8 → 0.81 → 0.8195 → ... asymptotically approaching 1.0.
|
|
40
41
|
*/
|
|
41
42
|
static readonly CONFIDENCE_ADJUSTMENT_RATE = 0.05;
|
|
42
|
-
reinforce(id: string
|
|
43
|
+
reinforce(id: string, options?: {
|
|
44
|
+
source?: string;
|
|
45
|
+
evidence?: string;
|
|
46
|
+
}): Insight;
|
|
43
47
|
/**
|
|
44
48
|
* Find insights with similar claims using word-level Jaccard similarity.
|
|
45
49
|
* Returns results sorted by similarity descending.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/db/repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/db/repository.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAiB,MAAM,aAAa,CAAC;AA4CnI,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAwB;IAEvC,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO;IA4B3C;;;;;;OAMG;IACH,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,gBAAgB;IAM5F,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAM/B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO;IAqE/C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKzB;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,0BAA0B,QAAQ;IAElD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAsChF;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,SAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAsBpF;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO;IAmE9E,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,iBAAiB;IAYzB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,EAAE;IAkCtC,KAAK,IAAI,YAAY;CA8BtB"}
|
package/dist/db/repository.js
CHANGED
|
@@ -13,6 +13,7 @@ function rowToInsight(row) {
|
|
|
13
13
|
confidence: row.confidence,
|
|
14
14
|
tags: JSON.parse(row.tags),
|
|
15
15
|
source: row.source ?? undefined,
|
|
16
|
+
provenance: row.provenance ?? undefined,
|
|
16
17
|
condition: row.condition ?? undefined,
|
|
17
18
|
avoid: row.avoid === 1,
|
|
18
19
|
createdAt: row.created_at,
|
|
@@ -28,9 +29,9 @@ export class InsightRepository {
|
|
|
28
29
|
const id = crypto.randomUUID();
|
|
29
30
|
const tags = JSON.stringify(input.tags ?? []);
|
|
30
31
|
db.prepare(`
|
|
31
|
-
INSERT INTO insights (id, type, claim, reasoning, context, limitations, confidence, tags, source, condition, avoid)
|
|
32
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
33
|
-
`).run(id, input.type, input.claim, input.reasoning ?? null, input.context ?? null, input.limitations ?? null, input.confidence, tags, input.source ?? null, input.condition ?? null, input.avoid ? 1 : 0);
|
|
32
|
+
INSERT INTO insights (id, type, claim, reasoning, context, limitations, confidence, tags, source, provenance, condition, avoid)
|
|
33
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
34
|
+
`).run(id, input.type, input.claim, input.reasoning ?? null, input.context ?? null, input.limitations ?? null, input.confidence, tags, input.source ?? null, input.provenance ?? null, input.condition ?? null, input.avoid ? 1 : 0);
|
|
34
35
|
const insight = this.get(id);
|
|
35
36
|
this.history.recordCreate(insight);
|
|
36
37
|
return insight;
|
|
@@ -105,6 +106,12 @@ export class InsightRepository {
|
|
|
105
106
|
if (input.source !== (existing.source ?? ''))
|
|
106
107
|
changes.source = { old: existing.source ?? '', new: input.source };
|
|
107
108
|
}
|
|
109
|
+
if (input.provenance !== undefined) {
|
|
110
|
+
fields.push('provenance = ?');
|
|
111
|
+
values.push(input.provenance);
|
|
112
|
+
if (input.provenance !== (existing.provenance ?? ''))
|
|
113
|
+
changes.provenance = { old: existing.provenance ?? '', new: input.provenance };
|
|
114
|
+
}
|
|
108
115
|
if (input.condition !== undefined) {
|
|
109
116
|
fields.push('condition = ?');
|
|
110
117
|
values.push(input.condition);
|
|
@@ -139,7 +146,7 @@ export class InsightRepository {
|
|
|
139
146
|
* At 0.05, a 0.8 → 0.81 → 0.8195 → ... asymptotically approaching 1.0.
|
|
140
147
|
*/
|
|
141
148
|
static CONFIDENCE_ADJUSTMENT_RATE = 0.05;
|
|
142
|
-
reinforce(id) {
|
|
149
|
+
reinforce(id, options) {
|
|
143
150
|
const db = getDatabase();
|
|
144
151
|
const existing = this.get(id);
|
|
145
152
|
if (!existing) {
|
|
@@ -157,8 +164,15 @@ export class InsightRepository {
|
|
|
157
164
|
updated_at = datetime('now')
|
|
158
165
|
WHERE id = ?
|
|
159
166
|
`).run(newConfidence, id);
|
|
167
|
+
// Build source text for history
|
|
168
|
+
let reinforceSource = options?.source;
|
|
169
|
+
if (options?.evidence) {
|
|
170
|
+
reinforceSource = reinforceSource
|
|
171
|
+
? `[${options.evidence}] ${reinforceSource}`
|
|
172
|
+
: `[${options.evidence}]`;
|
|
173
|
+
}
|
|
160
174
|
// Record history
|
|
161
|
-
this.history.recordReinforce(id, oldConfidence, newConfidence, newCount);
|
|
175
|
+
this.history.recordReinforce(id, oldConfidence, newConfidence, newCount, reinforceSource);
|
|
162
176
|
return this.get(id);
|
|
163
177
|
}
|
|
164
178
|
/**
|
|
@@ -273,6 +287,10 @@ export class InsightRepository {
|
|
|
273
287
|
conditions.push(`type IN (${placeholders})`);
|
|
274
288
|
params.push(...options.types);
|
|
275
289
|
}
|
|
290
|
+
if (options?.provenance !== undefined) {
|
|
291
|
+
conditions.push('provenance = ?');
|
|
292
|
+
params.push(options.provenance);
|
|
293
|
+
}
|
|
276
294
|
if (options?.minConfidence !== undefined) {
|
|
277
295
|
conditions.push('confidence >= ?');
|
|
278
296
|
params.push(options.minConfidence);
|