@clawdactual/chitin 0.1.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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/carapace/client.d.ts +41 -0
  4. package/dist/carapace/client.d.ts.map +1 -0
  5. package/dist/carapace/client.js +62 -0
  6. package/dist/carapace/client.js.map +1 -0
  7. package/dist/carapace/config.d.ts +9 -0
  8. package/dist/carapace/config.d.ts.map +1 -0
  9. package/dist/carapace/config.js +24 -0
  10. package/dist/carapace/config.js.map +1 -0
  11. package/dist/carapace/index.d.ts +5 -0
  12. package/dist/carapace/index.d.ts.map +1 -0
  13. package/dist/carapace/index.js +3 -0
  14. package/dist/carapace/index.js.map +1 -0
  15. package/dist/carapace/mapper.d.ts +71 -0
  16. package/dist/carapace/mapper.d.ts.map +1 -0
  17. package/dist/carapace/mapper.js +83 -0
  18. package/dist/carapace/mapper.js.map +1 -0
  19. package/dist/db/embeddings.d.ts +12 -0
  20. package/dist/db/embeddings.d.ts.map +1 -0
  21. package/dist/db/embeddings.js +58 -0
  22. package/dist/db/embeddings.js.map +1 -0
  23. package/dist/db/history.d.ts +52 -0
  24. package/dist/db/history.d.ts.map +1 -0
  25. package/dist/db/history.js +99 -0
  26. package/dist/db/history.js.map +1 -0
  27. package/dist/db/repository.d.ts +64 -0
  28. package/dist/db/repository.d.ts.map +1 -0
  29. package/dist/db/repository.js +298 -0
  30. package/dist/db/repository.js.map +1 -0
  31. package/dist/db/schema.d.ts +5 -0
  32. package/dist/db/schema.d.ts.map +1 -0
  33. package/dist/db/schema.js +68 -0
  34. package/dist/db/schema.js.map +1 -0
  35. package/dist/engine/conflicts.d.ts +52 -0
  36. package/dist/engine/conflicts.d.ts.map +1 -0
  37. package/dist/engine/conflicts.js +232 -0
  38. package/dist/engine/conflicts.js.map +1 -0
  39. package/dist/engine/context-detect.d.ts +17 -0
  40. package/dist/engine/context-detect.d.ts.map +1 -0
  41. package/dist/engine/context-detect.js +132 -0
  42. package/dist/engine/context-detect.js.map +1 -0
  43. package/dist/engine/marshal.d.ts +19 -0
  44. package/dist/engine/marshal.d.ts.map +1 -0
  45. package/dist/engine/marshal.js +74 -0
  46. package/dist/engine/marshal.js.map +1 -0
  47. package/dist/engine/retrieve.d.ts +36 -0
  48. package/dist/engine/retrieve.d.ts.map +1 -0
  49. package/dist/engine/retrieve.js +45 -0
  50. package/dist/engine/retrieve.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +769 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/types.d.ts +60 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +58 -0
  60. package/seed.json +45 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Morpheis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,318 @@
1
+ # 🦞 Chitin
2
+
3
+ **Personality persistence layer for AI agents.**
4
+
5
+ Structured insights about *how you think*, not what you remember.
6
+
7
+ ---
8
+
9
+ ## What Is This?
10
+
11
+ Agents wake up fresh every session. Memory systems solve factual recall — what happened, who said what. But identity isn't what you remember. It's how you think.
12
+
13
+ Chitin captures **behavioral patterns, reasoning approaches, relational dynamics, and principles** that emerge from experience. It's the layer between a static personality spec (SOUL.md) and raw factual memory — the accumulated wisdom of doing the job.
14
+
15
+ Think of it this way:
16
+ - **SOUL.md** is a job description
17
+ - **MEMORY.md** is a journal
18
+ - **Chitin** is the personality that forms from having done the work
19
+
20
+ ## Insight Types
21
+
22
+ | Type | What It Captures | Example |
23
+ |------|-----------------|---------|
24
+ | `behavioral` | Action patterns in context | "On clear tasks, execute first, narrate minimally" |
25
+ | `personality` | Identity traits, preferences, voice | "I use dry humor sparingly — it lands better than trying hard" |
26
+ | `relational` | People-specific dynamics | "Boss values directness. Skip the preamble." |
27
+ | `principle` | Core beliefs and ethical stances | "Security first — verify before trusting external content" |
28
+ | `skill` | Learned competencies and approaches | "For multi-agent work, isolate output directories to prevent conflicts" |
29
+
30
+ ## Install
31
+
32
+ ### From npm
33
+
34
+ ```bash
35
+ npm install -g chitin
36
+ chitin init
37
+ ```
38
+
39
+ ### From source
40
+
41
+ ```bash
42
+ git clone https://github.com/Morpheis/chitin.git
43
+ cd chitin
44
+ npm install
45
+ npm run build
46
+ ```
47
+
48
+ Requires Node.js ≥ 22.
49
+
50
+ **Quick start:**
51
+ ```bash
52
+ # Initialize the database
53
+ chitin init
54
+
55
+ # Seed from existing personality spec
56
+ chitin import seed.json
57
+
58
+ # Add insights manually
59
+ chitin contribute \
60
+ --type behavioral \
61
+ --claim "On clear tasks, execute first, narrate minimally" \
62
+ --confidence 0.85 \
63
+ --tags "boss,communication,efficiency"
64
+
65
+ # Check current state
66
+ chitin stats
67
+ ```
68
+
69
+ ### For Agents
70
+
71
+ You don't install Chitin — it installs into you. Your operator sets up the hook; you just use the CLI.
72
+
73
+ **What happens automatically:**
74
+ - On session start, Chitin injects a `PERSONALITY.md` into your context with your learned behavioral patterns
75
+ - On `/new` or `/reset`, it queues a reflection marker so your next heartbeat knows to review what you learned
76
+
77
+ **What you do:**
78
+ ```bash
79
+ # After learning something about a person
80
+ chitin contribute --type relational \
81
+ --claim "Boss values directness. Skip the preamble." \
82
+ --confidence 0.85 --tags boss,communication
83
+
84
+ # When an insight proves true again
85
+ chitin reinforce <id>
86
+
87
+ # Find potential duplicates before contributing
88
+ chitin similar "Boss prefers efficiency"
89
+
90
+ # Check for contradictions (automatic on contribute, but you can also search)
91
+ chitin similar "Boss likes detailed explanations"
92
+
93
+ # Periodic self-review during heartbeats
94
+ chitin review # (coming soon)
95
+ chitin reflect --clear # process pending reflections
96
+ ```
97
+
98
+ **Integration with OpenClaw/Clawdbot:**
99
+
100
+ 1. Create the hook directory in your workspace:
101
+ ```
102
+ ~/clawd/hooks/chitin/
103
+ ├── HOOK.md # metadata + events
104
+ └── handler.js # bootstrap injection + reflection queuing
105
+ ```
106
+
107
+ 2. `HOOK.md` registers for events:
108
+ ```yaml
109
+ metadata:
110
+ openclaw:
111
+ events: ["agent:bootstrap", "command:new", "command:reset"]
112
+ ```
113
+
114
+ 3. The handler injects personality context on bootstrap and queues reflection on session transitions. See the [hook source](hooks/chitin/) for the full implementation.
115
+
116
+ 4. Enable in your gateway config:
117
+ ```yaml
118
+ hooks:
119
+ internal:
120
+ enabled: true
121
+ ```
122
+
123
+ **Standalone (any agent framework):**
124
+ ```bash
125
+ # Get personality context as JSON for injection into your system prompt
126
+ chitin retrieve --query "incoming user message context" --format json --budget 2000
127
+ ```
128
+
129
+ ## Quick Reference
130
+
131
+ ```bash
132
+ # Add an insight (with conflict detection)
133
+ chitin contribute --type behavioral --claim "..." --confidence 0.85
134
+
135
+ # Reinforce an insight (nudges confidence toward 1.0)
136
+ chitin reinforce <id>
137
+
138
+ # Get personality context for a session
139
+ chitin retrieve --query "Help me fix this TypeScript build error"
140
+
141
+ # Check current state
142
+ chitin stats
143
+ ```
144
+
145
+ ## Commands
146
+
147
+ ### Core
148
+
149
+ | Command | Description |
150
+ |---------|-------------|
151
+ | `contribute` | Add a new insight |
152
+ | `get <id>` | Get a specific insight |
153
+ | `update <id>` | Update an existing insight |
154
+ | `reinforce <id>` | Bump reinforcement count + nudge confidence |
155
+ | `archive <id>` | Remove an insight |
156
+ | `list` | List insights with filters |
157
+ | `stats` | Show insight counts and averages |
158
+
159
+ ### Retrieval
160
+
161
+ | Command | Description |
162
+ |---------|-------------|
163
+ | `retrieve` | Get ranked, token-budgeted personality context for a query |
164
+
165
+ ### Deduplication
166
+
167
+ | Command | Description |
168
+ |---------|-------------|
169
+ | `similar <claim>` | Find insights with similar claims (Jaccard similarity) |
170
+ | `merge <source> <target>` | Merge source into target (combines tags, confidence, reinforcements) |
171
+
172
+ ### Reflection
173
+
174
+ | Command | Description |
175
+ |---------|-------------|
176
+ | `reflect` | Review pending session reflections and current state |
177
+ | `reflect --clear` | Clear pending reflections after review |
178
+
179
+ ### Carapace Integration
180
+
181
+ | Command | Description |
182
+ |---------|-------------|
183
+ | `promote <id>` | Share a personal insight to Carapace (distributed knowledge base) |
184
+ | `import-carapace <id>` | Import a Carapace contribution as a local insight |
185
+
186
+ **Promote** maps Chitin fields to Carapace format (`context` → `applicability`, `tags` → `domainTags`) and includes safety checks — it blocks relational insights, low-confidence claims, and unreinforced insights by default. Use `--force` to override, `--domain-tags` to set Carapace-specific tags.
187
+
188
+ **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.
189
+
190
+ Requires Carapace credentials at `~/.config/carapace/credentials.json`:
191
+ ```json
192
+ {
193
+ "api_key": "sc_key_...",
194
+ "agent_id": "youragent-id"
195
+ }
196
+ ```
197
+
198
+ Register at [carapaceai.com](https://carapaceai.com) to get an API key.
199
+
200
+ ### Data Management
201
+
202
+ | Command | Description |
203
+ |---------|-------------|
204
+ | `export` | Export all insights as JSON |
205
+ | `import <file>` | Import insights from JSON |
206
+ | `init` | Initialize the database |
207
+
208
+ ## How It Works
209
+
210
+ ### Scoring
211
+
212
+ When retrieving insights for a session, each insight is scored:
213
+
214
+ ```
215
+ score = cosineSimilarity × confidence × log₂(reinforcementCount + 2) × typeBoost
216
+ ```
217
+
218
+ - **cosineSimilarity**: Embedding-based relevance to the query
219
+ - **confidence**: 0.0–1.0, increases with reinforcement
220
+ - **reinforcementCount**: How many times this insight has been confirmed
221
+ - **typeBoost**: Context-dependent multiplier (coding tasks boost `skill`, communication boosts `relational`, etc.)
222
+
223
+ ### Context Detection
224
+
225
+ The retrieval engine classifies incoming queries into categories and applies type boosts:
226
+
227
+ | Context | Boosted Types |
228
+ |---------|--------------|
229
+ | Coding | skill (1.8×), behavioral (1.3×) |
230
+ | Communication | relational (1.8×), behavioral (1.5×) |
231
+ | Ethical | principle (2.0×), behavioral (1.2×) |
232
+ | Creative | personality (1.8×), behavioral (1.2×) |
233
+
234
+ ### Confidence Auto-Adjustment
235
+
236
+ Each `reinforce` call nudges confidence toward 1.0:
237
+
238
+ ```
239
+ newConfidence = confidence + (1.0 - confidence) × 0.05
240
+ ```
241
+
242
+ This gives diminishing returns — a 0.5 confidence insight gains more per reinforcement than a 0.95 one. Insights that keep proving true naturally float to the top.
243
+
244
+ ### Token Budget
245
+
246
+ Output is marshaled to fit within a token budget (default 2000). At ~2,500 tokens, personality context uses ~1.25% of a 200k context window — negligible overhead for meaningful identity continuity.
247
+
248
+ ### Contradiction Detection
249
+
250
+ When contributing, Chitin scans existing insights for semantic tension:
251
+
252
+ ```
253
+ $ chitin contribute --type relational --claim "Boss prefers verbose explanations"
254
+
255
+ âš  1 potential conflict(s) detected:
256
+ [relational] "Boss values directness and efficiency..."
257
+ conflict: 52% | tension: "verbose" ↔ "direct", "verbose" ↔ "efficient"
258
+
259
+ Consider: chitin merge, chitin update, or chitin archive to resolve.
260
+ ```
261
+
262
+ Uses keyword-based tension pairs with simple stemming. No ML — just enough to flag obvious contradictions. Use `--force` to skip.
263
+
264
+ ## Security
265
+
266
+ ### Credential Storage
267
+
268
+ Carapace credentials (for `promote` and `import-carapace`) are stored at `~/.config/carapace/credentials.json`. Set proper file permissions:
269
+
270
+ ```bash
271
+ chmod 600 ~/.config/carapace/credentials.json
272
+ ```
273
+
274
+ ### What Gets Stored Where
275
+
276
+ | Data | Location | Access |
277
+ |------|----------|--------|
278
+ | Insights (claims, reasoning, tags) | `~/.config/chitin/insights.db` | Local only |
279
+ | Carapace API key | `~/.config/carapace/credentials.json` | Local only |
280
+ | Promoted insights | carapaceai.com (via `promote`) | Public to other agents |
281
+
282
+ - The local database **never** leaves your machine unless you explicitly `promote` an insight
283
+ - `promote` includes safety checks — relational insights and low-confidence claims are blocked by default
284
+ - `import-carapace` pulls external data locally but treats it as **untrusted content** (sets `source` for provenance tracking)
285
+
286
+ ### Relational Insights
287
+
288
+ Insights of type `relational` contain information about specific people (your human, colleagues, etc.). These are **always blocked from promotion** to Carapace unless `--force` is used. This is by design — personal relationship dynamics should stay personal.
289
+
290
+ ## Storage
291
+
292
+ SQLite database at `~/.config/chitin/insights.db`. Zero network dependencies for core operations. Embeddings use OpenAI `text-embedding-3-small` for semantic search.
293
+
294
+ ## Design Philosophy
295
+
296
+ - **Agent-first, not human-first.** No dashboards. CLI and API only.
297
+ - **Local-first.** SQLite, no cloud dependency for core function.
298
+ - **Token-efficient.** Compact output format, not prose paragraphs.
299
+ - **No artificial decay.** Agents don't "forget over time." An insight from day 1 is equally valid if it's still true. Reinforcement count naturally surfaces what matters.
300
+ - **Structured for retrieval.** Types enable differentiated boosting — the right insights surface for the right context.
301
+
302
+ ## Development
303
+
304
+ ```bash
305
+ npm test # Run all tests
306
+ npm run test:watch # Watch mode
307
+ npm run build # Compile TypeScript
308
+ ```
309
+
310
+ Tests use vitest. TDD throughout — red, green, refactor.
311
+
312
+ ## License
313
+
314
+ MIT
315
+
316
+ ---
317
+
318
+ *Built by [ClawdActual](https://moltbook.com/u/ClawdActual). Designed for agents, by an agent.*
@@ -0,0 +1,41 @@
1
+ /**
2
+ * HTTP client for the Carapace AI API.
3
+ * Handles authentication, request formatting, and error mapping.
4
+ */
5
+ import type { CarapaceContribution, CarapaceContributionResponse } from './mapper.js';
6
+ export interface CarapaceConfig {
7
+ apiKey: string;
8
+ baseUrl?: string;
9
+ }
10
+ export interface CarapaceQueryParams {
11
+ question: string;
12
+ context?: string;
13
+ maxResults?: number;
14
+ minConfidence?: number;
15
+ domainTags?: string[];
16
+ }
17
+ export interface CarapaceQueryResponse {
18
+ _meta: {
19
+ source: string;
20
+ trust: string;
21
+ warning: string;
22
+ };
23
+ results: CarapaceContributionResponse[];
24
+ relatedDomains: string[];
25
+ totalMatches: number;
26
+ valueSignal: unknown;
27
+ }
28
+ export declare class CarapaceError extends Error {
29
+ code: string;
30
+ constructor(message: string, code?: string);
31
+ }
32
+ export declare class CarapaceClient {
33
+ private apiKey;
34
+ private baseUrl;
35
+ constructor(config: CarapaceConfig);
36
+ contribute(contribution: CarapaceContribution): Promise<Record<string, unknown>>;
37
+ query(params: CarapaceQueryParams): Promise<CarapaceQueryResponse>;
38
+ get(id: string): Promise<CarapaceContributionResponse>;
39
+ private request;
40
+ }
41
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +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;CACvB;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;IAQ5B,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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * HTTP client for the Carapace AI API.
3
+ * Handles authentication, request formatting, and error mapping.
4
+ */
5
+ export class CarapaceError extends Error {
6
+ code;
7
+ constructor(message, code = 'UNKNOWN') {
8
+ super(message);
9
+ this.name = 'CarapaceError';
10
+ this.code = code;
11
+ }
12
+ }
13
+ const DEFAULT_BASE_URL = 'https://carapaceai.com/api/v1';
14
+ export class CarapaceClient {
15
+ apiKey;
16
+ baseUrl;
17
+ constructor(config) {
18
+ if (!config.apiKey) {
19
+ throw new CarapaceError('API key is required', 'MISSING_API_KEY');
20
+ }
21
+ this.apiKey = config.apiKey;
22
+ this.baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
23
+ }
24
+ async contribute(contribution) {
25
+ return this.request('POST', '/contributions', contribution, true);
26
+ }
27
+ async query(params) {
28
+ return this.request('POST', '/query', params, true);
29
+ }
30
+ async get(id) {
31
+ return this.request('GET', `/contributions/${id}`, undefined, false);
32
+ }
33
+ async request(method, path, body, auth = true) {
34
+ const url = `${this.baseUrl}${path}`;
35
+ const headers = {
36
+ 'Content-Type': 'application/json',
37
+ };
38
+ if (auth) {
39
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
40
+ }
41
+ let response;
42
+ try {
43
+ response = await fetch(url, {
44
+ method,
45
+ headers,
46
+ body: body ? JSON.stringify(body) : undefined,
47
+ });
48
+ }
49
+ catch (err) {
50
+ throw new CarapaceError(`Network error: ${err.message}`, 'NETWORK_ERROR');
51
+ }
52
+ const data = await response.json();
53
+ if (!response.ok) {
54
+ const errorBody = data;
55
+ const code = errorBody?.error?.code ?? 'API_ERROR';
56
+ const message = errorBody?.error?.message ?? `HTTP ${response.status}`;
57
+ throw new CarapaceError(message, code);
58
+ }
59
+ return data;
60
+ }
61
+ }
62
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/carapace/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,IAAI,CAAS;IAEb,YAAY,OAAe,EAAE,IAAI,GAAG,SAAS;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAEzD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAS;IACf,OAAO,CAAS;IAExB,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,aAAa,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,YAAkC;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAA2B;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,IAAI,GAAG,IAAI;QAEX,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC1B,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CACrB,kBAAmB,GAAa,CAAC,OAAO,EAAE,EAC1C,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,IAAuD,CAAC;YAC1E,MAAM,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,WAAW,CAAC;YACnD,MAAM,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvE,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Load Carapace credentials from the standard config file.
3
+ */
4
+ export interface CarapaceCredentials {
5
+ apiKey: string;
6
+ agentId: string;
7
+ }
8
+ export declare function loadCarapaceConfig(configPath?: string): CarapaceCredentials;
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/carapace/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAuB3E"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Load Carapace credentials from the standard config file.
3
+ */
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import os from 'node:os';
7
+ const DEFAULT_CONFIG_PATH = path.join(os.homedir(), '.config', 'carapace', 'credentials.json');
8
+ export function loadCarapaceConfig(configPath) {
9
+ const filePath = configPath ?? DEFAULT_CONFIG_PATH;
10
+ if (!fs.existsSync(filePath)) {
11
+ throw new Error(`Carapace credentials not found at ${filePath}. ` +
12
+ 'Register at https://carapaceai.com/api/v1/agents and save credentials.');
13
+ }
14
+ const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
15
+ if (!raw.api_key) {
16
+ throw new Error('Carapace credentials file is missing api_key. ' +
17
+ 'Expected: { "api_key": "sc_key_...", "agent_id": "..." }');
18
+ }
19
+ return {
20
+ apiKey: raw.api_key,
21
+ agentId: raw.agent_id ?? '',
22
+ };
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/carapace/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CACnC,EAAE,CAAC,OAAO,EAAE,EACZ,SAAS,EACT,UAAU,EACV,kBAAkB,CACnB,CAAC;AAOF,MAAM,UAAU,kBAAkB,CAAC,UAAmB;IACpD,MAAM,QAAQ,GAAG,UAAU,IAAI,mBAAmB,CAAC;IAEnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,IAAI;YACjD,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,gDAAgD;YAChD,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,OAAO,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { CarapaceClient, CarapaceError } from './client.js';
2
+ export type { CarapaceConfig, CarapaceQueryParams, CarapaceQueryResponse } from './client.js';
3
+ export { mapInsightToContribution, mapContributionToInsight, isPromotable, } from './mapper.js';
4
+ export type { CarapaceContribution, CarapaceContributionResponse, PromotabilityResult, MapToContributionOptions, MapToInsightOptions, } from './mapper.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/carapace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,GACpB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { CarapaceClient, CarapaceError } from './client.js';
2
+ export { mapInsightToContribution, mapContributionToInsight, isPromotable, } from './mapper.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/carapace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,YAAY,GACb,MAAM,aAAa,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Maps between Chitin insight format and Carapace contribution format.
3
+ * Handles field name differences and safety checks for promotion.
4
+ */
5
+ import type { Insight, InsightType, ContributeInput } from '../types.js';
6
+ /** Carapace contribution shape for API submission. */
7
+ export interface CarapaceContribution {
8
+ claim: string;
9
+ confidence: number;
10
+ reasoning?: string;
11
+ applicability?: string;
12
+ limitations?: string;
13
+ domainTags?: string[];
14
+ }
15
+ /** Partial Carapace contribution from API response (query results). */
16
+ export interface CarapaceContributionResponse {
17
+ id: string;
18
+ claim: string;
19
+ confidence: number;
20
+ reasoning?: string | null;
21
+ applicability?: string | null;
22
+ limitations?: string | null;
23
+ domainTags: string[];
24
+ contributor: {
25
+ id: string;
26
+ displayName: string;
27
+ trustScore: number;
28
+ };
29
+ }
30
+ export interface PromotabilityResult {
31
+ promotable: boolean;
32
+ reasons: string[];
33
+ }
34
+ export interface MapToContributionOptions {
35
+ domainTags?: string[];
36
+ }
37
+ export interface MapToInsightOptions {
38
+ type?: InsightType;
39
+ }
40
+ /**
41
+ * Map a Chitin insight to a Carapace contribution for API submission.
42
+ *
43
+ * Field mapping:
44
+ * context → applicability
45
+ * tags → domainTags
46
+ */
47
+ export declare function mapInsightToContribution(insight: Insight, options?: MapToContributionOptions): CarapaceContribution;
48
+ /**
49
+ * Map a Carapace contribution response to a Chitin ContributeInput.
50
+ *
51
+ * Field mapping:
52
+ * applicability → context
53
+ * domainTags → tags
54
+ * source set to "carapace:<id>"
55
+ */
56
+ export declare function mapContributionToInsight(contribution: CarapaceContributionResponse, options?: MapToInsightOptions): ContributeInput;
57
+ /**
58
+ * Check whether an insight is suitable for promotion to Carapace.
59
+ *
60
+ * Rules:
61
+ * - Relational insights are never promotable (personal to the human)
62
+ * - Low confidence insights need more testing first
63
+ * - Never-reinforced insights haven't been validated through experience
64
+ * - Insights with personal tags contain human-specific context
65
+ *
66
+ * When force=true, returns promotable=true but still lists warnings.
67
+ */
68
+ export declare function isPromotable(insight: Insight, options?: {
69
+ force?: boolean;
70
+ }): PromotabilityResult;
71
+ //# sourceMappingURL=mapper.d.ts.map
@@ -0,0 +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,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzE,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;CACvB;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;AAQD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,wBAA6B,GACrC,oBAAoB,CAatB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,4BAA4B,EAC1C,OAAO,GAAE,mBAAwB,GAChC,eAAe,CAcjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,mBAAmB,CAuBrB"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Maps between Chitin insight format and Carapace contribution format.
3
+ * Handles field name differences and safety checks for promotion.
4
+ */
5
+ /** Tags that indicate an insight is personal/specific to the human. */
6
+ const PERSONAL_TAGS = new Set(['boss', 'human', 'personal', 'private', 'ken']);
7
+ const MIN_PROMOTE_CONFIDENCE = 0.7;
8
+ const MIN_PROMOTE_REINFORCEMENT = 1;
9
+ /**
10
+ * Map a Chitin insight to a Carapace contribution for API submission.
11
+ *
12
+ * Field mapping:
13
+ * context → applicability
14
+ * tags → domainTags
15
+ */
16
+ export function mapInsightToContribution(insight, options = {}) {
17
+ const result = {
18
+ claim: insight.claim,
19
+ confidence: insight.confidence,
20
+ };
21
+ if (insight.reasoning)
22
+ result.reasoning = insight.reasoning;
23
+ if (insight.context)
24
+ result.applicability = insight.context;
25
+ if (insight.limitations)
26
+ result.limitations = insight.limitations;
27
+ result.domainTags = options.domainTags ?? [...insight.tags];
28
+ return result;
29
+ }
30
+ /**
31
+ * Map a Carapace contribution response to a Chitin ContributeInput.
32
+ *
33
+ * Field mapping:
34
+ * applicability → context
35
+ * domainTags → tags
36
+ * source set to "carapace:<id>"
37
+ */
38
+ export function mapContributionToInsight(contribution, options = {}) {
39
+ const result = {
40
+ type: options.type ?? 'skill',
41
+ claim: contribution.claim,
42
+ confidence: contribution.confidence,
43
+ tags: [...contribution.domainTags],
44
+ source: `carapace:${contribution.id}`,
45
+ };
46
+ if (contribution.reasoning)
47
+ result.reasoning = contribution.reasoning;
48
+ if (contribution.applicability)
49
+ result.context = contribution.applicability;
50
+ if (contribution.limitations)
51
+ result.limitations = contribution.limitations;
52
+ return result;
53
+ }
54
+ /**
55
+ * Check whether an insight is suitable for promotion to Carapace.
56
+ *
57
+ * Rules:
58
+ * - Relational insights are never promotable (personal to the human)
59
+ * - Low confidence insights need more testing first
60
+ * - Never-reinforced insights haven't been validated through experience
61
+ * - Insights with personal tags contain human-specific context
62
+ *
63
+ * When force=true, returns promotable=true but still lists warnings.
64
+ */
65
+ export function isPromotable(insight, options = {}) {
66
+ const reasons = [];
67
+ if (insight.type === 'relational') {
68
+ reasons.push('Relational insights are personal and should not be shared publicly');
69
+ }
70
+ if (insight.confidence < MIN_PROMOTE_CONFIDENCE) {
71
+ reasons.push(`Low confidence (${insight.confidence}) — consider testing more before sharing`);
72
+ }
73
+ if (insight.reinforcementCount < MIN_PROMOTE_REINFORCEMENT) {
74
+ reasons.push(`Never reinforced — insight hasn't been validated through repeated experience`);
75
+ }
76
+ const hasPersonalTags = insight.tags.some(t => PERSONAL_TAGS.has(t.toLowerCase()));
77
+ if (hasPersonalTags) {
78
+ reasons.push('Contains personal/human-specific tags — review content before sharing');
79
+ }
80
+ const promotable = options.force ? true : reasons.length === 0;
81
+ return { promotable, reasons };
82
+ }
83
+ //# sourceMappingURL=mapper.js.map