mythos-router 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swd.d.ts","sourceRoot":"","sources":["../src/swd.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAGD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAmB3D;AAGD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAOxE;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAe7D;AAGD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,YAAY,GAClB,sBAAsB,CAwGxB;AAGD,wBAAgB,MAAM,CACpB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GACzC,SAAS,CAuDX;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiBvD;AAGD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1D;AAGD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACpC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,GACxB,MAAM,EAAE,CAUV"}
package/dist/swd.js ADDED
@@ -0,0 +1,242 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // mythos-router :: swd.ts
3
+ // Strict Write Discipline — Filesystem verification engine
4
+ // ─────────────────────────────────────────────────────────────
5
+ import { readFileSync, statSync, existsSync } from 'node:fs';
6
+ import { createHash } from 'node:crypto';
7
+ import { resolve } from 'node:path';
8
+ import { MAX_CORRECTION_RETRIES } from './config.js';
9
+ import { c, warn, error, success } from './utils.js';
10
+ // ── Snapshot a file ──────────────────────────────────────────
11
+ export function snapshotFile(filePath) {
12
+ const absPath = resolve(filePath);
13
+ try {
14
+ if (!existsSync(absPath)) {
15
+ return { path: absPath, exists: false, size: 0, mtime: 0, hash: '' };
16
+ }
17
+ const stat = statSync(absPath);
18
+ const content = readFileSync(absPath);
19
+ const hash = createHash('sha256').update(content).digest('hex');
20
+ return {
21
+ path: absPath,
22
+ exists: true,
23
+ size: stat.size,
24
+ mtime: stat.mtimeMs,
25
+ hash,
26
+ };
27
+ }
28
+ catch {
29
+ return { path: absPath, exists: false, size: 0, mtime: 0, hash: '' };
30
+ }
31
+ }
32
+ // ── Snapshot multiple files ──────────────────────────────────
33
+ export function snapshotFiles(paths) {
34
+ const map = new Map();
35
+ for (const p of paths) {
36
+ const snap = snapshotFile(p);
37
+ map.set(snap.path, snap);
38
+ }
39
+ return map;
40
+ }
41
+ // ── Parse FILE_ACTION blocks from model output ──────────────
42
+ export function parseFileActions(output) {
43
+ const actions = [];
44
+ const regex = /\[FILE_ACTION:\s*(.+?)\]\s*\n\s*OPERATION:\s*(CREATE|MODIFY|DELETE|READ)\s*\n(?:\s*CONTENT_HASH:\s*(\S+)\s*\n)?\s*DESCRIPTION:\s*(.+?)\s*\n\s*\[\/FILE_ACTION\]/gi;
45
+ let match;
46
+ while ((match = regex.exec(output)) !== null) {
47
+ actions.push({
48
+ path: match[1].trim(),
49
+ operation: match[2].trim().toUpperCase(),
50
+ contentHash: match[3]?.trim() || undefined,
51
+ description: match[4].trim(),
52
+ });
53
+ }
54
+ return actions;
55
+ }
56
+ // ── Verify a single action against filesystem ───────────────
57
+ export function verifyAction(action, before, after) {
58
+ switch (action.operation) {
59
+ case 'CREATE': {
60
+ if (!after.exists) {
61
+ return {
62
+ action,
63
+ status: 'failed',
64
+ detail: `File was not created: ${action.path} (does not exist on disk)`,
65
+ };
66
+ }
67
+ if (before.exists) {
68
+ return {
69
+ action,
70
+ status: 'drift',
71
+ detail: `File already existed before CREATE: ${action.path}`,
72
+ };
73
+ }
74
+ if (action.contentHash && after.hash !== action.contentHash) {
75
+ return {
76
+ action,
77
+ status: 'drift',
78
+ detail: `Content hash mismatch: expected ${action.contentHash.slice(0, 12)}…, got ${after.hash.slice(0, 12)}…`,
79
+ };
80
+ }
81
+ return {
82
+ action,
83
+ status: 'verified',
84
+ detail: `Created: ${action.path} (${after.size} bytes)`,
85
+ };
86
+ }
87
+ case 'MODIFY': {
88
+ if (!after.exists) {
89
+ return {
90
+ action,
91
+ status: 'failed',
92
+ detail: `File does not exist after MODIFY: ${action.path}`,
93
+ };
94
+ }
95
+ if (after.hash === before.hash) {
96
+ return {
97
+ action,
98
+ status: 'drift',
99
+ detail: `File unchanged after claimed MODIFY: ${action.path}`,
100
+ };
101
+ }
102
+ if (action.contentHash && after.hash !== action.contentHash) {
103
+ return {
104
+ action,
105
+ status: 'drift',
106
+ detail: `Content hash mismatch after MODIFY: expected ${action.contentHash.slice(0, 12)}…, got ${after.hash.slice(0, 12)}…`,
107
+ };
108
+ }
109
+ return {
110
+ action,
111
+ status: 'verified',
112
+ detail: `Modified: ${action.path} (${before.size} → ${after.size} bytes)`,
113
+ };
114
+ }
115
+ case 'DELETE': {
116
+ if (after.exists) {
117
+ return {
118
+ action,
119
+ status: 'failed',
120
+ detail: `File still exists after claimed DELETE: ${action.path}`,
121
+ };
122
+ }
123
+ if (!before.exists) {
124
+ return {
125
+ action,
126
+ status: 'drift',
127
+ detail: `File didn't exist before DELETE: ${action.path}`,
128
+ };
129
+ }
130
+ return {
131
+ action,
132
+ status: 'verified',
133
+ detail: `Deleted: ${action.path}`,
134
+ };
135
+ }
136
+ case 'READ': {
137
+ if (!after.exists) {
138
+ return {
139
+ action,
140
+ status: 'failed',
141
+ detail: `File does not exist for READ: ${action.path}`,
142
+ };
143
+ }
144
+ return {
145
+ action,
146
+ status: 'verified',
147
+ detail: `Read: ${action.path} (${after.size} bytes)`,
148
+ };
149
+ }
150
+ default:
151
+ return {
152
+ action,
153
+ status: 'drift',
154
+ detail: `Unknown operation: ${action.operation}`,
155
+ };
156
+ }
157
+ }
158
+ // ── Full SWD verification pass ───────────────────────────────
159
+ export function runSWD(modelOutput, beforeSnapshots) {
160
+ const actions = parseFileActions(modelOutput);
161
+ if (actions.length === 0) {
162
+ return { verified: true, actions: [] };
163
+ }
164
+ // Take "after" snapshots for all referenced paths
165
+ const paths = actions.map((a) => resolve(a.path));
166
+ const afterSnapshots = snapshotFiles(paths);
167
+ const verifications = [];
168
+ let allVerified = true;
169
+ for (const action of actions) {
170
+ const absPath = resolve(action.path);
171
+ const before = beforeSnapshots.get(absPath) ?? snapshotFile(absPath);
172
+ const after = afterSnapshots.get(absPath) ?? snapshotFile(absPath);
173
+ const result = verifyAction(action, before, after);
174
+ verifications.push(result);
175
+ if (result.status !== 'verified') {
176
+ allVerified = false;
177
+ }
178
+ }
179
+ // Generate correction prompt if needed
180
+ let correctionPrompt;
181
+ if (!allVerified) {
182
+ const failures = verifications
183
+ .filter((v) => v.status !== 'verified')
184
+ .map((v) => `- [${v.status.toUpperCase()}] ${v.action.operation} ${v.action.path}: ${v.detail}`)
185
+ .join('\n');
186
+ correctionPrompt =
187
+ `[SWD CORRECTION TURN]\n` +
188
+ `The following file actions failed verification:\n${failures}\n\n` +
189
+ `Actual filesystem state:\n` +
190
+ verifications
191
+ .filter((v) => v.status !== 'verified')
192
+ .map((v) => {
193
+ const after = afterSnapshots.get(resolve(v.action.path));
194
+ return `- ${v.action.path}: exists=${after?.exists ?? false}, size=${after?.size ?? 0}, hash=${after?.hash?.slice(0, 16) ?? 'N/A'}`;
195
+ })
196
+ .join('\n') +
197
+ `\n\nPlease correct your response. You have ${MAX_CORRECTION_RETRIES} correction attempts remaining.`;
198
+ }
199
+ return {
200
+ verified: allVerified,
201
+ actions: verifications,
202
+ correctionPrompt,
203
+ };
204
+ }
205
+ // ── Print SWD results ────────────────────────────────────────
206
+ export function printSWDResults(result) {
207
+ if (result.actions.length === 0)
208
+ return;
209
+ console.log(`\n${c.dim}── SWD Verification ──${c.reset}`);
210
+ for (const v of result.actions) {
211
+ switch (v.status) {
212
+ case 'verified':
213
+ success(v.detail);
214
+ break;
215
+ case 'drift':
216
+ warn(v.detail);
217
+ break;
218
+ case 'failed':
219
+ error(v.detail);
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ // ── Pre-scan: snapshot files that might be affected ──────────
225
+ export function prescanPaths(modelOutput) {
226
+ const actions = parseFileActions(modelOutput);
227
+ return actions.map((a) => resolve(a.path));
228
+ }
229
+ // ── Quick git-status style check for unexpected changes ──────
230
+ export function detectUnexpectedChanges(beforeAll, claimedPaths) {
231
+ const unexpected = [];
232
+ for (const [path, before] of beforeAll) {
233
+ if (claimedPaths.has(path))
234
+ continue;
235
+ const after = snapshotFile(path);
236
+ if (after.hash !== before.hash || after.exists !== before.exists) {
237
+ unexpected.push(path);
238
+ }
239
+ }
240
+ return unexpected;
241
+ }
242
+ //# sourceMappingURL=swd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swd.js","sourceRoot":"","sources":["../src/swd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export declare const c: {
2
+ reset: string;
3
+ bold: string;
4
+ dim: string;
5
+ italic: string;
6
+ underline: string;
7
+ black: string;
8
+ red: string;
9
+ green: string;
10
+ yellow: string;
11
+ blue: string;
12
+ magenta: string;
13
+ cyan: string;
14
+ white: string;
15
+ gray: string;
16
+ bgRed: string;
17
+ bgGreen: string;
18
+ bgYellow: string;
19
+ bgBlue: string;
20
+ bgMagenta: string;
21
+ bgCyan: string;
22
+ };
23
+ export declare const BANNER: string;
24
+ export declare class Spinner {
25
+ private interval;
26
+ private frameIdx;
27
+ start(message: string): void;
28
+ update(message: string): void;
29
+ stop(finalMessage?: string): void;
30
+ }
31
+ export declare function timestamp(): string;
32
+ export declare function hr(char?: string, len?: number): string;
33
+ export declare function heading(text: string): string;
34
+ export declare function success(text: string): void;
35
+ export declare function warn(text: string): void;
36
+ export declare function error(text: string): void;
37
+ export declare function info(text: string): void;
38
+ export declare function thinking(text: string): void;
39
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC;AAGF,eAAO,MAAM,MAAM,QAYlB,CAAC;AAKF,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,QAAQ,CAAK;IAErB,KAAK,CAAC,OAAO,EAAE,MAAM;IAYrB,MAAM,CAAC,OAAO,EAAE,MAAM;IAQtB,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM;CAW3B;AAGD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,EAAE,CAAC,IAAI,SAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAE/C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE3C"}
package/dist/utils.js ADDED
@@ -0,0 +1,102 @@
1
+ // ─────────────────────────────────────────────────────────────
2
+ // mythos-router :: utils.ts
3
+ // Terminal colors, spinners, and formatting
4
+ // ─────────────────────────────────────────────────────────────
5
+ // ── ANSI Colors (zero-dep) ───────────────────────────────────
6
+ export const c = {
7
+ reset: '\x1b[0m',
8
+ bold: '\x1b[1m',
9
+ dim: '\x1b[2m',
10
+ italic: '\x1b[3m',
11
+ underline: '\x1b[4m',
12
+ // Foreground
13
+ black: '\x1b[30m',
14
+ red: '\x1b[91m',
15
+ green: '\x1b[92m',
16
+ yellow: '\x1b[93m',
17
+ blue: '\x1b[94m',
18
+ magenta: '\x1b[95m',
19
+ cyan: '\x1b[96m',
20
+ white: '\x1b[97m',
21
+ gray: '\x1b[90m',
22
+ // Background
23
+ bgRed: '\x1b[41m',
24
+ bgGreen: '\x1b[42m',
25
+ bgYellow: '\x1b[43m',
26
+ bgBlue: '\x1b[44m',
27
+ bgMagenta: '\x1b[45m',
28
+ bgCyan: '\x1b[46m',
29
+ };
30
+ // ── Banner ───────────────────────────────────────────────────
31
+ export const BANNER = `
32
+ ${c.cyan}${c.bold}
33
+ ███╗ ███╗██╗ ██╗████████╗██╗ ██╗ ██████╗ ███████╗
34
+ ████╗ ████║╚██╗ ██╔╝╚══██╔══╝██║ ██║██╔═══██╗██╔════╝
35
+ ██╔████╔██║ ╚████╔╝ ██║ ███████║██║ ██║███████╗
36
+ ██║╚██╔╝██║ ╚██╔╝ ██║ ██╔══██║██║ ██║╚════██║
37
+ ██║ ╚═╝ ██║ ██║ ██║ ██║ ██║╚██████╔╝███████║
38
+ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
39
+ ${c.reset}${c.dim} ┌─────────────────────────────────────────────────────┐
40
+ │ ${c.yellow}Capybara Tier${c.reset}${c.dim} · Opus 4.6 · Strict Write Discipline │
41
+ │ ${c.gray}Adaptive Thinking · Self-Healing Memory · Zero Slop${c.reset}${c.dim} │
42
+ └─────────────────────────────────────────────────────┘${c.reset}
43
+ `;
44
+ // ── Spinner ──────────────────────────────────────────────────
45
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
46
+ export class Spinner {
47
+ interval = null;
48
+ frameIdx = 0;
49
+ start(message) {
50
+ this.frameIdx = 0;
51
+ process.stdout.write('\x1b[?25l'); // hide cursor
52
+ this.interval = setInterval(() => {
53
+ const frame = SPINNER_FRAMES[this.frameIdx % SPINNER_FRAMES.length];
54
+ process.stdout.write(`\r${c.cyan}${frame}${c.reset} ${c.dim}${message}${c.reset}`);
55
+ this.frameIdx++;
56
+ }, 80);
57
+ }
58
+ update(message) {
59
+ // Just changes what the next tick will display
60
+ if (this.interval) {
61
+ clearInterval(this.interval);
62
+ this.start(message);
63
+ }
64
+ }
65
+ stop(finalMessage) {
66
+ if (this.interval) {
67
+ clearInterval(this.interval);
68
+ this.interval = null;
69
+ }
70
+ process.stdout.write('\r\x1b[K'); // clear line
71
+ process.stdout.write('\x1b[?25h'); // show cursor
72
+ if (finalMessage) {
73
+ console.log(finalMessage);
74
+ }
75
+ }
76
+ }
77
+ // ── Formatting helpers ───────────────────────────────────────
78
+ export function timestamp() {
79
+ return new Date().toISOString().replace('T', ' ').slice(0, 19);
80
+ }
81
+ export function hr(char = '─', len = 60) {
82
+ return `${c.dim}${char.repeat(len)}${c.reset}`;
83
+ }
84
+ export function heading(text) {
85
+ return `\n${c.bold}${c.cyan}▸ ${text}${c.reset}\n${hr()}`;
86
+ }
87
+ export function success(text) {
88
+ console.log(`${c.green}✔${c.reset} ${text}`);
89
+ }
90
+ export function warn(text) {
91
+ console.log(`${c.yellow}⚠${c.reset} ${text}`);
92
+ }
93
+ export function error(text) {
94
+ console.log(`${c.red}✖${c.reset} ${text}`);
95
+ }
96
+ export function info(text) {
97
+ console.log(`${c.blue}ℹ${c.reset} ${text}`);
98
+ }
99
+ export function thinking(text) {
100
+ console.log(`${c.dim}${c.italic}💭 ${text}${c.reset}`);
101
+ }
102
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,6BAA6B;AAC7B,6CAA6C;AAC7C,gEAAgE;AAEhE,gEAAgE;AAChE,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IAEpB,aAAa;IACb,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;IAEhB,aAAa;IACb,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,UAAU;IAClB,SAAS,EAAE,UAAU;IACrB,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,MAAM,GAAG;EACpB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI;;;;;;;EAOf,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG;SACR,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG;SACvC,CAAC,CAAC,IAAI,sDAAsD,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG;6DACvB,CAAC,CAAC,KAAK;CACnE,CAAC;AAEF,gEAAgE;AAChE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE1E,MAAM,OAAO,OAAO;IACV,QAAQ,GAA0C,IAAI,CAAC;IACvD,QAAQ,GAAG,CAAC,CAAC;IAErB,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACjD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAE,CAAC;YACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAC7D,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED,MAAM,CAAC,OAAe;QACpB,+CAA+C;QAC/C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAqB;QACxB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,EAAE,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE;IACrC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "mythos-router",
3
+ "version": "1.0.0",
4
+ "description": "Capybara-tier CLI router — Claude Opus 4.6 with Adaptive Thinking, Strict Write Discipline, and Self-Healing Memory",
5
+ "type": "module",
6
+ "bin": {
7
+ "mythos": "./dist/cli.js",
8
+ "mythos-router": "./dist/cli.js"
9
+ },
10
+ "main": "./dist/cli.js",
11
+ "files": [
12
+ "dist",
13
+ "LICENSE",
14
+ "README.md"
15
+ ],
16
+ "scripts": {
17
+ "dev": "tsx src/cli.ts",
18
+ "build": "tsc",
19
+ "prepublishOnly": "npm run build",
20
+ "start": "node dist/cli.js",
21
+ "chat": "tsx src/cli.ts chat",
22
+ "verify": "tsx src/cli.ts verify",
23
+ "dream": "tsx src/cli.ts dream"
24
+ },
25
+ "keywords": [
26
+ "claude",
27
+ "opus",
28
+ "anthropic",
29
+ "capybara",
30
+ "mythos",
31
+ "adaptive-thinking",
32
+ "ai-agent",
33
+ "cli",
34
+ "agent",
35
+ "llm",
36
+ "developer-tools",
37
+ "coding-assistant",
38
+ "filesystem-verification",
39
+ "strict-write-discipline"
40
+ ],
41
+ "author": "thewaltero",
42
+ "license": "MIT",
43
+ "repository": {
44
+ "type": "git",
45
+ "url": "git+https://github.com/thewaltero/mythos-router.git"
46
+ },
47
+ "homepage": "https://github.com/thewaltero/mythos-router#readme",
48
+ "bugs": {
49
+ "url": "https://github.com/thewaltero/mythos-router/issues"
50
+ },
51
+ "dependencies": {
52
+ "@anthropic-ai/sdk": "^0.80.0",
53
+ "commander": "^14.0.3"
54
+ },
55
+ "devDependencies": {
56
+ "@types/node": "^22.0.0",
57
+ "tsx": "^4.19.0",
58
+ "typescript": "^5.7.0"
59
+ },
60
+ "engines": {
61
+ "node": ">=20.0.0"
62
+ }
63
+ }