milens 0.6.3 → 0.6.4

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 (137) hide show
  1. package/.agents/skills/adapters/SKILL.md +31 -0
  2. package/.agents/skills/analyzer/SKILL.md +55 -0
  3. package/.agents/skills/apps/SKILL.md +42 -0
  4. package/.agents/skills/docs/SKILL.md +46 -0
  5. package/.agents/skills/milens/SKILL.md +168 -0
  6. package/.agents/skills/milens-code-review/SKILL.md +186 -0
  7. package/.agents/skills/milens-eval/SKILL.md +221 -0
  8. package/.agents/skills/milens-plan/SKILL.md +227 -0
  9. package/.agents/skills/milens-refactor-clean/SKILL.md +209 -0
  10. package/.agents/skills/milens-security-review/SKILL.md +224 -0
  11. package/.agents/skills/milens-tdd/SKILL.md +156 -0
  12. package/.agents/skills/parser/SKILL.md +60 -0
  13. package/.agents/skills/root/SKILL.md +64 -0
  14. package/.agents/skills/scripts/SKILL.md +27 -0
  15. package/.agents/skills/security/SKILL.md +44 -0
  16. package/.agents/skills/server/SKILL.md +46 -0
  17. package/.agents/skills/store/SKILL.md +53 -0
  18. package/.agents/skills/test/SKILL.md +73 -0
  19. package/LICENSE +75 -75
  20. package/README.md +508 -432
  21. package/adapters/README.md +107 -0
  22. package/adapters/claude-code/.claude/mcp.json +9 -0
  23. package/adapters/claude-code/CLAUDE.md +58 -0
  24. package/adapters/codex/.codex/codex.md +52 -0
  25. package/adapters/copilot/.github/copilot-instructions.md +62 -0
  26. package/adapters/cursor/.cursorrules +9 -0
  27. package/adapters/gemini/.gemini/context.md +58 -0
  28. package/adapters/opencode/.opencode/config.json +9 -0
  29. package/adapters/opencode/AGENTS.md +58 -0
  30. package/adapters/zed/.zed/settings.json +8 -0
  31. package/dist/agents-md.d.ts +3 -0
  32. package/dist/agents-md.d.ts.map +1 -0
  33. package/dist/agents-md.js +112 -0
  34. package/dist/agents-md.js.map +1 -0
  35. package/dist/analyzer/engine.js +1 -1
  36. package/dist/analyzer/engine.js.map +1 -1
  37. package/dist/cli.js +1190 -401
  38. package/dist/cli.js.map +1 -1
  39. package/dist/metrics.d.ts +51 -0
  40. package/dist/metrics.d.ts.map +1 -0
  41. package/dist/metrics.js +64 -0
  42. package/dist/metrics.js.map +1 -0
  43. package/dist/parser/lang-go.js +47 -47
  44. package/dist/parser/lang-java.js +29 -29
  45. package/dist/parser/lang-js.js +105 -105
  46. package/dist/parser/lang-php.js +38 -38
  47. package/dist/parser/lang-py.js +34 -34
  48. package/dist/parser/lang-ruby.js +14 -14
  49. package/dist/parser/lang-rust.js +30 -30
  50. package/dist/parser/lang-ts.js +191 -191
  51. package/dist/security/deps.d.ts +38 -0
  52. package/dist/security/deps.d.ts.map +1 -0
  53. package/dist/security/deps.js +685 -0
  54. package/dist/security/deps.js.map +1 -0
  55. package/dist/security/rules.d.ts +42 -0
  56. package/dist/security/rules.d.ts.map +1 -0
  57. package/dist/security/rules.js +940 -0
  58. package/dist/security/rules.js.map +1 -0
  59. package/dist/server/hooks.d.ts +26 -0
  60. package/dist/server/hooks.d.ts.map +1 -0
  61. package/dist/server/hooks.js +253 -0
  62. package/dist/server/hooks.js.map +1 -0
  63. package/dist/server/mcp-prompts.d.ts +277 -0
  64. package/dist/server/mcp-prompts.d.ts.map +1 -0
  65. package/dist/server/mcp-prompts.js +627 -0
  66. package/dist/server/mcp-prompts.js.map +1 -0
  67. package/dist/server/mcp.d.ts.map +1 -1
  68. package/dist/server/mcp.js +618 -643
  69. package/dist/server/mcp.js.map +1 -1
  70. package/dist/server/test-plan.d.ts +20 -0
  71. package/dist/server/test-plan.d.ts.map +1 -0
  72. package/dist/server/test-plan.js +100 -0
  73. package/dist/server/test-plan.js.map +1 -0
  74. package/dist/skills.js +152 -152
  75. package/dist/store/annotations.d.ts +41 -0
  76. package/dist/store/annotations.d.ts.map +1 -0
  77. package/dist/store/annotations.js +192 -0
  78. package/dist/store/annotations.js.map +1 -0
  79. package/dist/store/confidence.d.ts +18 -0
  80. package/dist/store/confidence.d.ts.map +1 -0
  81. package/dist/store/confidence.js +82 -0
  82. package/dist/store/confidence.js.map +1 -0
  83. package/dist/store/db.d.ts +37 -14
  84. package/dist/store/db.d.ts.map +1 -1
  85. package/dist/store/db.js +332 -239
  86. package/dist/store/db.js.map +1 -1
  87. package/dist/store/schema.sql +128 -116
  88. package/dist/store/vectors.js +2 -2
  89. package/dist/types.d.ts +101 -0
  90. package/dist/types.d.ts.map +1 -1
  91. package/docs/README.md +24 -0
  92. package/package.json +80 -66
  93. package/dist/gateway/analyzer.d.ts +0 -6
  94. package/dist/gateway/analyzer.d.ts.map +0 -1
  95. package/dist/gateway/analyzer.js +0 -218
  96. package/dist/gateway/analyzer.js.map +0 -1
  97. package/dist/gateway/cache.d.ts +0 -35
  98. package/dist/gateway/cache.d.ts.map +0 -1
  99. package/dist/gateway/cache.js +0 -175
  100. package/dist/gateway/cache.js.map +0 -1
  101. package/dist/gateway/config.d.ts +0 -10
  102. package/dist/gateway/config.d.ts.map +0 -1
  103. package/dist/gateway/config.js +0 -167
  104. package/dist/gateway/config.js.map +0 -1
  105. package/dist/gateway/context-memory.d.ts +0 -68
  106. package/dist/gateway/context-memory.d.ts.map +0 -1
  107. package/dist/gateway/context-memory.js +0 -157
  108. package/dist/gateway/context-memory.js.map +0 -1
  109. package/dist/gateway/observability.d.ts +0 -83
  110. package/dist/gateway/observability.d.ts.map +0 -1
  111. package/dist/gateway/observability.js +0 -152
  112. package/dist/gateway/observability.js.map +0 -1
  113. package/dist/gateway/privacy.d.ts +0 -27
  114. package/dist/gateway/privacy.d.ts.map +0 -1
  115. package/dist/gateway/privacy.js +0 -139
  116. package/dist/gateway/privacy.js.map +0 -1
  117. package/dist/gateway/providers.d.ts +0 -66
  118. package/dist/gateway/providers.d.ts.map +0 -1
  119. package/dist/gateway/providers.js +0 -377
  120. package/dist/gateway/providers.js.map +0 -1
  121. package/dist/gateway/router.d.ts +0 -18
  122. package/dist/gateway/router.d.ts.map +0 -1
  123. package/dist/gateway/router.js +0 -102
  124. package/dist/gateway/router.js.map +0 -1
  125. package/dist/gateway/server.d.ts +0 -20
  126. package/dist/gateway/server.d.ts.map +0 -1
  127. package/dist/gateway/server.js +0 -387
  128. package/dist/gateway/server.js.map +0 -1
  129. package/dist/gateway/translator.d.ts +0 -19
  130. package/dist/gateway/translator.d.ts.map +0 -1
  131. package/dist/gateway/translator.js +0 -340
  132. package/dist/gateway/translator.js.map +0 -1
  133. package/dist/gateway/types.d.ts +0 -215
  134. package/dist/gateway/types.d.ts.map +0 -1
  135. package/dist/gateway/types.js +0 -3
  136. package/dist/gateway/types.js.map +0 -1
  137. package/dist/store/gateway-schema.sql +0 -53
@@ -1,167 +0,0 @@
1
- // ── Config — gateway.json loader and validator ──
2
- import { readFileSync, existsSync, writeFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- const DEFAULT_ROUTING = {
5
- thresholds: { economy: 5, standard: 20 },
6
- intentMultipliers: {
7
- generate: 1.0,
8
- refactor: 1.5,
9
- review: 0.8,
10
- test: 0.7,
11
- debug: 1.2,
12
- explain: 0.5,
13
- docstring: 0.3,
14
- unknown: 1.0,
15
- },
16
- defaultTier: 'standard',
17
- };
18
- const DEFAULT_CACHE = {
19
- enabled: true,
20
- maxEntries: 1000,
21
- ttlHours: 24,
22
- };
23
- const DEFAULT_CONTEXT_INJECTION = {
24
- enabled: true,
25
- maxTokens: 500,
26
- includeCallers: true,
27
- includeDependencies: true,
28
- includeBlastRadius: true,
29
- };
30
- const DEFAULT_CONFIG = {
31
- port: 4141,
32
- host: '127.0.0.1',
33
- providers: [],
34
- routing: DEFAULT_ROUTING,
35
- cache: DEFAULT_CACHE,
36
- contextInjection: DEFAULT_CONTEXT_INJECTION,
37
- privacy: { rules: [], defaultAction: 'allow' },
38
- rateLimit: { windowMs: 60000, maxRequests: 60 },
39
- };
40
- /** Load gateway config from gateway.json, applying defaults for missing fields */
41
- export function loadConfig(projectDir) {
42
- const configPath = join(projectDir, 'gateway.json');
43
- if (!existsSync(configPath)) {
44
- return { ...DEFAULT_CONFIG };
45
- }
46
- const raw = readFileSync(configPath, 'utf-8');
47
- let parsed;
48
- try {
49
- parsed = JSON.parse(raw);
50
- }
51
- catch {
52
- throw new Error(`Invalid JSON in ${configPath}`);
53
- }
54
- return mergeConfig(parsed);
55
- }
56
- /** Create a default gateway.json if none exists */
57
- export function initConfig(projectDir) {
58
- const configPath = join(projectDir, 'gateway.json');
59
- if (existsSync(configPath)) {
60
- return configPath;
61
- }
62
- const template = {
63
- $schema: './node_modules/milens/gateway-schema.json',
64
- port: 4141,
65
- host: '127.0.0.1',
66
- providers: [
67
- {
68
- id: 'openai-main',
69
- name: 'OpenAI',
70
- tier: 'premium',
71
- format: 'openai',
72
- endpoint: 'https://api.openai.com/v1',
73
- apiKey: '${OPENAI_API_KEY}',
74
- models: ['gpt-4o', 'gpt-4o-mini'],
75
- },
76
- ],
77
- routing: DEFAULT_ROUTING,
78
- cache: DEFAULT_CACHE,
79
- contextInjection: DEFAULT_CONTEXT_INJECTION,
80
- privacy: {
81
- rules: [
82
- { pathPattern: '**/.env*', action: 'block', reason: 'Environment files contain secrets' },
83
- { pathPattern: '**/secrets/**', action: 'block', reason: 'Secret files' },
84
- ],
85
- defaultAction: 'allow',
86
- },
87
- rateLimit: { windowMs: 60000, maxRequests: 60 },
88
- };
89
- writeFileSync(configPath, JSON.stringify(template, null, 2) + '\n', 'utf-8');
90
- return configPath;
91
- }
92
- /** Validate config, returning errors */
93
- export function validateConfig(config) {
94
- const errors = [];
95
- if (config.port < 1 || config.port > 65535) {
96
- errors.push(`Invalid port: ${config.port}`);
97
- }
98
- if (!config.providers.length) {
99
- errors.push('No providers configured — at least one provider is required');
100
- }
101
- for (const p of config.providers) {
102
- if (!p.id)
103
- errors.push('Provider missing "id"');
104
- if (!p.format)
105
- errors.push(`Provider "${p.id}": missing "format"`);
106
- if (!p.endpoint)
107
- errors.push(`Provider "${p.id}": missing "endpoint"`);
108
- if (!p.apiKey)
109
- errors.push(`Provider "${p.id}": missing "apiKey"`);
110
- if (!p.models?.length)
111
- errors.push(`Provider "${p.id}": missing "models"`);
112
- // Check for env var references
113
- if (p.apiKey.startsWith('${') && p.apiKey.endsWith('}')) {
114
- const envVar = p.apiKey.slice(2, -1);
115
- if (!process.env[envVar]) {
116
- errors.push(`Provider "${p.id}": env var ${envVar} is not set`);
117
- }
118
- }
119
- }
120
- return errors;
121
- }
122
- /** Resolve env var references in api keys (${VAR_NAME} → process.env.VAR_NAME) */
123
- export function resolveEnvVars(config) {
124
- return {
125
- ...config,
126
- providers: config.providers.map(p => ({
127
- ...p,
128
- apiKey: resolveEnvValue(p.apiKey),
129
- })),
130
- };
131
- }
132
- function resolveEnvValue(value) {
133
- if (value.startsWith('${') && value.endsWith('}')) {
134
- const envVar = value.slice(2, -1);
135
- return process.env[envVar] ?? value;
136
- }
137
- return value;
138
- }
139
- function mergeConfig(raw) {
140
- return {
141
- port: typeof raw.port === 'number' ? raw.port : DEFAULT_CONFIG.port,
142
- host: typeof raw.host === 'string' ? raw.host : DEFAULT_CONFIG.host,
143
- providers: Array.isArray(raw.providers) ? raw.providers : [],
144
- routing: {
145
- ...DEFAULT_ROUTING,
146
- ...(typeof raw.routing === 'object' && raw.routing ? raw.routing : {}),
147
- },
148
- cache: {
149
- ...DEFAULT_CACHE,
150
- ...(typeof raw.cache === 'object' && raw.cache ? raw.cache : {}),
151
- },
152
- contextInjection: {
153
- ...DEFAULT_CONTEXT_INJECTION,
154
- ...(typeof raw.contextInjection === 'object' && raw.contextInjection
155
- ? raw.contextInjection : {}),
156
- },
157
- privacy: {
158
- rules: Array.isArray(raw.privacy?.rules) ? raw.privacy.rules : [],
159
- defaultAction: raw.privacy?.defaultAction ?? 'allow',
160
- },
161
- rateLimit: {
162
- windowMs: raw.rateLimit?.windowMs ?? 60000,
163
- maxRequests: raw.rateLimit?.maxRequests ?? 60,
164
- },
165
- };
166
- }
167
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/gateway/config.ts"],"names":[],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- /** A shared context entry */
2
- interface ContextEntry {
3
- key: string;
4
- value: string;
5
- source: string;
6
- addedAt: number;
7
- hash: string;
8
- tags: string[];
9
- }
10
- /** Change notification */
11
- interface ContextChange {
12
- type: 'add' | 'update' | 'remove';
13
- key: string;
14
- value?: string;
15
- source: string;
16
- timestamp: number;
17
- }
18
- type ChangeListener = (change: ContextChange) => void;
19
- export declare class ContextMemory {
20
- private agents;
21
- private entries;
22
- private listeners;
23
- private changeLog;
24
- private maxEntries;
25
- private maxChangeLog;
26
- constructor(opts?: {
27
- maxEntries?: number;
28
- maxChangeLog?: number;
29
- });
30
- /** Register a new agent session */
31
- registerAgent(name: string, role: string): string;
32
- /** Remove an agent session */
33
- removeAgent(agentId: string): void;
34
- /** Add or update a context entry (dedup by content hash) */
35
- set(agentId: string, key: string, value: string, tags?: string[]): boolean;
36
- /** Get a context entry */
37
- get(key: string): string | undefined;
38
- /** Remove a context entry */
39
- remove(agentId: string, key: string): boolean;
40
- /** Get all context entries matching tags */
41
- getByTags(tags: string[]): ContextEntry[];
42
- /** Get all context contributed by a specific agent */
43
- getByAgent(agentId: string): ContextEntry[];
44
- /** Subscribe to context changes */
45
- subscribe(agentId: string, listener: ChangeListener): void;
46
- /** Get changes since a timestamp */
47
- getChangesSince(since: number): ContextChange[];
48
- /** Build a summary string of shared context (for injection into prompts) */
49
- buildContextSummary(maxTokens?: number): string;
50
- /** List active agents */
51
- listAgents(): {
52
- id: string;
53
- name: string;
54
- role: string;
55
- contextCount: number;
56
- lastActive: number;
57
- }[];
58
- /** Get stats */
59
- getStats(): {
60
- agents: number;
61
- entries: number;
62
- changeLogSize: number;
63
- };
64
- private recordChange;
65
- private evictOldest;
66
- }
67
- export {};
68
- //# sourceMappingURL=context-memory.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-memory.d.ts","sourceRoot":"","sources":["../../src/gateway/context-memory.ts"],"names":[],"mappings":"AAcA,6BAA6B;AAC7B,UAAU,YAAY;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,0BAA0B;AAC1B,UAAU,aAAa;IACrB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;AAEtD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO;IAKrE,mCAAmC;IACnC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAWjD,8BAA8B;IAC9B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlC,4DAA4D;IAC5D,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO;IAgC9E,0BAA0B;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpC,6BAA6B;IAC7B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAY7C,4CAA4C;IAC5C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE;IAOzC,sDAAsD;IACtD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAQ3C,mCAAmC;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI1D,oCAAoC;IACpC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAI/C,4EAA4E;IAC5E,mBAAmB,CAAC,SAAS,SAAO,GAAG,MAAM;IAoB7C,yBAAyB;IACzB,UAAU,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE;IAUpG,gBAAgB;IAChB,QAAQ;;;;;IAQR,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,WAAW;CASpB"}
@@ -1,157 +0,0 @@
1
- // ── Context Memory — shared context across multi-agent sessions ──
2
- import { createHash, randomUUID } from 'node:crypto';
3
- export class ContextMemory {
4
- agents = new Map();
5
- entries = new Map();
6
- listeners = new Map();
7
- changeLog = [];
8
- maxEntries;
9
- maxChangeLog;
10
- constructor(opts = {}) {
11
- this.maxEntries = opts.maxEntries ?? 500;
12
- this.maxChangeLog = opts.maxChangeLog ?? 1000;
13
- }
14
- /** Register a new agent session */
15
- registerAgent(name, role) {
16
- const id = randomUUID().slice(0, 8);
17
- this.agents.set(id, {
18
- id, name, role,
19
- joinedAt: Date.now(),
20
- lastActive: Date.now(),
21
- contextKeys: new Set(),
22
- });
23
- return id;
24
- }
25
- /** Remove an agent session */
26
- removeAgent(agentId) {
27
- this.agents.delete(agentId);
28
- this.listeners.delete(agentId);
29
- }
30
- /** Add or update a context entry (dedup by content hash) */
31
- set(agentId, key, value, tags = []) {
32
- const agent = this.agents.get(agentId);
33
- if (!agent)
34
- return false;
35
- const hash = createHash('sha256').update(value).digest('hex').slice(0, 12);
36
- // Check for duplicate content under a different key
37
- const existing = this.entries.get(key);
38
- if (existing && existing.hash === hash) {
39
- return false; // No change
40
- }
41
- // Enforce capacity
42
- if (!existing && this.entries.size >= this.maxEntries) {
43
- this.evictOldest();
44
- }
45
- const changeType = existing ? 'update' : 'add';
46
- this.entries.set(key, {
47
- key, value,
48
- source: agentId,
49
- addedAt: Date.now(),
50
- hash,
51
- tags,
52
- });
53
- agent.contextKeys.add(key);
54
- agent.lastActive = Date.now();
55
- this.recordChange({ type: changeType, key, value, source: agentId, timestamp: Date.now() });
56
- return true;
57
- }
58
- /** Get a context entry */
59
- get(key) {
60
- return this.entries.get(key)?.value;
61
- }
62
- /** Remove a context entry */
63
- remove(agentId, key) {
64
- const entry = this.entries.get(key);
65
- if (!entry)
66
- return false;
67
- this.entries.delete(key);
68
- const agent = this.agents.get(agentId);
69
- agent?.contextKeys.delete(key);
70
- this.recordChange({ type: 'remove', key, source: agentId, timestamp: Date.now() });
71
- return true;
72
- }
73
- /** Get all context entries matching tags */
74
- getByTags(tags) {
75
- const tagSet = new Set(tags);
76
- return [...this.entries.values()].filter(e => e.tags.some(t => tagSet.has(t)));
77
- }
78
- /** Get all context contributed by a specific agent */
79
- getByAgent(agentId) {
80
- const agent = this.agents.get(agentId);
81
- if (!agent)
82
- return [];
83
- return [...agent.contextKeys]
84
- .map(k => this.entries.get(k))
85
- .filter((e) => e !== undefined);
86
- }
87
- /** Subscribe to context changes */
88
- subscribe(agentId, listener) {
89
- this.listeners.set(agentId, listener);
90
- }
91
- /** Get changes since a timestamp */
92
- getChangesSince(since) {
93
- return this.changeLog.filter(c => c.timestamp > since);
94
- }
95
- /** Build a summary string of shared context (for injection into prompts) */
96
- buildContextSummary(maxTokens = 2000) {
97
- const entries = [...this.entries.values()]
98
- .sort((a, b) => b.addedAt - a.addedAt);
99
- const lines = [];
100
- let approxTokens = 0;
101
- for (const entry of entries) {
102
- const line = `[${entry.tags.join(',')}] ${entry.key}: ${entry.value}`;
103
- const lineTokens = Math.ceil(line.length / 4);
104
- if (approxTokens + lineTokens > maxTokens)
105
- break;
106
- lines.push(line);
107
- approxTokens += lineTokens;
108
- }
109
- return lines.length
110
- ? `--- Shared Context (${this.agents.size} agents) ---\n${lines.join('\n')}`
111
- : '';
112
- }
113
- /** List active agents */
114
- listAgents() {
115
- return [...this.agents.values()].map(a => ({
116
- id: a.id,
117
- name: a.name,
118
- role: a.role,
119
- contextCount: a.contextKeys.size,
120
- lastActive: a.lastActive,
121
- }));
122
- }
123
- /** Get stats */
124
- getStats() {
125
- return {
126
- agents: this.agents.size,
127
- entries: this.entries.size,
128
- changeLogSize: this.changeLog.length,
129
- };
130
- }
131
- recordChange(change) {
132
- this.changeLog.push(change);
133
- if (this.changeLog.length > this.maxChangeLog) {
134
- this.changeLog = this.changeLog.slice(-Math.floor(this.maxChangeLog * 0.8));
135
- }
136
- // Notify other agents
137
- for (const [agentId, listener] of this.listeners) {
138
- if (agentId !== change.source) {
139
- try {
140
- listener(change);
141
- }
142
- catch { /* ignore listener errors */ }
143
- }
144
- }
145
- }
146
- evictOldest() {
147
- let oldest = null;
148
- for (const entry of this.entries.values()) {
149
- if (!oldest || entry.addedAt < oldest.addedAt)
150
- oldest = entry;
151
- }
152
- if (oldest) {
153
- this.entries.delete(oldest.key);
154
- }
155
- }
156
- }
157
- //# sourceMappingURL=context-memory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-memory.js","sourceRoot":"","sources":["../../src/gateway/context-memory.ts"],"names":[],"mappings":"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"}
@@ -1,83 +0,0 @@
1
- import type { CostRecord, Intent, Tier } from './types.js';
2
- import type BetterSqlite3 from 'better-sqlite3';
3
- export declare class CostTracker {
4
- private rawDb;
5
- private stmts;
6
- constructor(rawDb: BetterSqlite3.Database);
7
- private prepareStatements;
8
- /** Record a completed request */
9
- record(data: {
10
- provider: string;
11
- model: string;
12
- tokensIn: number;
13
- tokensOut: number;
14
- costEstimate: number;
15
- durationMs: number;
16
- symbolIds: string[];
17
- filePaths: string[];
18
- intent: Intent;
19
- complexityScore: number;
20
- tier: Tier;
21
- cacheHit: boolean;
22
- }): string;
23
- /** Cost breakdown by provider + model */
24
- getCostByProvider(windowSql?: string): {
25
- provider: string;
26
- model: string;
27
- request_count: number;
28
- total_tokens_in: number;
29
- total_tokens_out: number;
30
- total_cost: number;
31
- avg_duration: number;
32
- }[];
33
- /** Cost breakdown by file path */
34
- getCostByFile(limit?: number, windowSql?: string): {
35
- file_path: string;
36
- request_count: number;
37
- total_tokens: number;
38
- total_cost: number;
39
- }[];
40
- /** Cost breakdown by intent */
41
- getCostByIntent(windowSql?: string): {
42
- intent: string;
43
- request_count: number;
44
- total_tokens: number;
45
- total_cost: number;
46
- avg_complexity: number;
47
- }[];
48
- /** Cost breakdown by tier */
49
- getCostByTier(windowSql?: string): {
50
- tier: string;
51
- request_count: number;
52
- total_cost: number;
53
- avg_duration: number;
54
- }[];
55
- /** Cache hit/miss stats and savings */
56
- getCacheSavings(windowSql?: string): {
57
- cacheHits: any;
58
- cacheMisses: any;
59
- costSaved: any;
60
- tokensSaved: any;
61
- hitRate: number;
62
- };
63
- /** Most expensive symbols */
64
- getTopExpensiveSymbols(limit?: number, windowSql?: string): {
65
- symbol_id: string;
66
- request_count: number;
67
- total_cost: number;
68
- total_tokens: number;
69
- }[];
70
- /** Overall summary */
71
- getSummary(windowSql?: string): {
72
- totalRequests: any;
73
- totalTokensIn: any;
74
- totalTokensOut: any;
75
- totalCost: any;
76
- avgDuration: any;
77
- firstRequest: any;
78
- lastRequest: any;
79
- };
80
- /** Get recent requests for debugging */
81
- getRecentRequests(limit?: number): CostRecord[];
82
- }
83
- //# sourceMappingURL=observability.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/gateway/observability.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,WAAW;IAGV,OAAO,CAAC,KAAK;IAFzB,OAAO,CAAC,KAAK,CAA+C;gBAExC,KAAK,EAAE,aAAa,CAAC,QAAQ;IAIjD,OAAO,CAAC,iBAAiB;IAyFzB,iCAAiC;IACjC,MAAM,CAAC,IAAI,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC;QACX,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,MAAM;IAiBV,yCAAyC;IACzC,iBAAiB,CAAC,SAAS,SAAa,GACS;QAC7C,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAChC,aAAa,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QACzE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;KAC1C,EAAE;IAGL,kCAAkC;IAClC,aAAa,CAAC,KAAK,SAAK,EAAE,SAAS,SAAa,GACI;QAChD,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;KACpF,EAAE;IAGL,+BAA+B;IAC/B,eAAe,CAAC,SAAS,SAAa,GACS;QAC3C,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;KACzG,EAAE;IAGL,6BAA6B;IAC7B,aAAa,CAAC,SAAS,SAAa,GACS;QACzC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;KAC/E,EAAE;IAGL,uCAAuC;IACvC,eAAe,CAAC,SAAS,SAAa;;;;;;;IAatC,6BAA6B;IAC7B,sBAAsB,CAAC,KAAK,SAAK,EAAE,SAAS,SAAa,GACD;QACpD,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;KACpF,EAAE;IAGL,sBAAsB;IACtB,UAAU,CAAC,SAAS,SAAa;;;;;;;;;IAajC,wCAAwC;IACxC,iBAAiB,CAAC,KAAK,SAAK,GAAG,UAAU,EAAE;CAkB5C"}
@@ -1,152 +0,0 @@
1
- // ── Observability — per-function / per-file cost tracking ──
2
- import { randomUUID } from 'node:crypto';
3
- export class CostTracker {
4
- rawDb;
5
- stmts;
6
- constructor(rawDb) {
7
- this.rawDb = rawDb;
8
- this.stmts = this.prepareStatements();
9
- }
10
- prepareStatements() {
11
- return {
12
- insert: this.rawDb.prepare(`INSERT INTO gateway_cost_log
13
- (request_id, provider, model, tokens_in, tokens_out, cost_estimate, duration_ms,
14
- symbol_ids, file_paths, intent, complexity_score, tier, cache_hit)
15
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`),
16
- byProvider: this.rawDb.prepare(`SELECT provider, model,
17
- COUNT(*) as request_count,
18
- SUM(tokens_in) as total_tokens_in,
19
- SUM(tokens_out) as total_tokens_out,
20
- SUM(cost_estimate) as total_cost,
21
- AVG(duration_ms) as avg_duration
22
- FROM gateway_cost_log
23
- WHERE timestamp >= datetime('now', ?)
24
- GROUP BY provider, model
25
- ORDER BY total_cost DESC`),
26
- byFile: this.rawDb.prepare(`SELECT jf.value as file_path,
27
- COUNT(*) as request_count,
28
- SUM(cl.tokens_in + cl.tokens_out) as total_tokens,
29
- SUM(cl.cost_estimate) as total_cost
30
- FROM gateway_cost_log cl, json_each(cl.file_paths) jf
31
- WHERE cl.timestamp >= datetime('now', ?)
32
- GROUP BY jf.value
33
- ORDER BY total_cost DESC
34
- LIMIT ?`),
35
- byIntent: this.rawDb.prepare(`SELECT intent,
36
- COUNT(*) as request_count,
37
- SUM(tokens_in + tokens_out) as total_tokens,
38
- SUM(cost_estimate) as total_cost,
39
- AVG(complexity_score) as avg_complexity
40
- FROM gateway_cost_log
41
- WHERE timestamp >= datetime('now', ?)
42
- GROUP BY intent
43
- ORDER BY total_cost DESC`),
44
- byTier: this.rawDb.prepare(`SELECT tier,
45
- COUNT(*) as request_count,
46
- SUM(cost_estimate) as total_cost,
47
- AVG(duration_ms) as avg_duration
48
- FROM gateway_cost_log
49
- WHERE timestamp >= datetime('now', ?)
50
- GROUP BY tier`),
51
- cacheSavings: this.rawDb.prepare(`SELECT
52
- SUM(CASE WHEN cache_hit = 1 THEN 1 ELSE 0 END) as cache_hits,
53
- SUM(CASE WHEN cache_hit = 0 THEN 1 ELSE 0 END) as cache_misses,
54
- SUM(CASE WHEN cache_hit = 1 THEN cost_estimate ELSE 0 END) as cost_saved,
55
- SUM(CASE WHEN cache_hit = 1 THEN tokens_in + tokens_out ELSE 0 END) as tokens_saved
56
- FROM gateway_cost_log
57
- WHERE timestamp >= datetime('now', ?)`),
58
- topSymbols: this.rawDb.prepare(`SELECT js.value as symbol_id,
59
- COUNT(*) as request_count,
60
- SUM(cl.cost_estimate) as total_cost,
61
- SUM(cl.tokens_in + cl.tokens_out) as total_tokens
62
- FROM gateway_cost_log cl, json_each(cl.symbol_ids) js
63
- WHERE cl.timestamp >= datetime('now', ?)
64
- GROUP BY js.value
65
- ORDER BY total_cost DESC
66
- LIMIT ?`),
67
- summary: this.rawDb.prepare(`SELECT
68
- COUNT(*) as total_requests,
69
- SUM(tokens_in) as total_tokens_in,
70
- SUM(tokens_out) as total_tokens_out,
71
- SUM(cost_estimate) as total_cost,
72
- AVG(duration_ms) as avg_duration,
73
- MIN(timestamp) as first_request,
74
- MAX(timestamp) as last_request
75
- FROM gateway_cost_log
76
- WHERE timestamp >= datetime('now', ?)`),
77
- recentRequests: this.rawDb.prepare(`SELECT * FROM gateway_cost_log ORDER BY timestamp DESC LIMIT ?`),
78
- };
79
- }
80
- /** Record a completed request */
81
- record(data) {
82
- const requestId = randomUUID();
83
- this.stmts.insert.run(requestId, data.provider, data.model, data.tokensIn, data.tokensOut, data.costEstimate, data.durationMs, JSON.stringify(data.symbolIds), JSON.stringify(data.filePaths), data.intent, data.complexityScore, data.tier, data.cacheHit ? 1 : 0);
84
- return requestId;
85
- }
86
- /** Cost breakdown by provider + model */
87
- getCostByProvider(windowSql = '-30 days') {
88
- return this.stmts.byProvider.all(windowSql);
89
- }
90
- /** Cost breakdown by file path */
91
- getCostByFile(limit = 20, windowSql = '-30 days') {
92
- return this.stmts.byFile.all(windowSql, limit);
93
- }
94
- /** Cost breakdown by intent */
95
- getCostByIntent(windowSql = '-30 days') {
96
- return this.stmts.byIntent.all(windowSql);
97
- }
98
- /** Cost breakdown by tier */
99
- getCostByTier(windowSql = '-30 days') {
100
- return this.stmts.byTier.all(windowSql);
101
- }
102
- /** Cache hit/miss stats and savings */
103
- getCacheSavings(windowSql = '-30 days') {
104
- const row = this.stmts.cacheSavings.get(windowSql);
105
- return {
106
- cacheHits: row?.cache_hits ?? 0,
107
- cacheMisses: row?.cache_misses ?? 0,
108
- costSaved: row?.cost_saved ?? 0,
109
- tokensSaved: row?.tokens_saved ?? 0,
110
- hitRate: row?.cache_hits
111
- ? row.cache_hits / (row.cache_hits + row.cache_misses)
112
- : 0,
113
- };
114
- }
115
- /** Most expensive symbols */
116
- getTopExpensiveSymbols(limit = 10, windowSql = '-30 days') {
117
- return this.stmts.topSymbols.all(windowSql, limit);
118
- }
119
- /** Overall summary */
120
- getSummary(windowSql = '-30 days') {
121
- const row = this.stmts.summary.get(windowSql);
122
- return {
123
- totalRequests: row?.total_requests ?? 0,
124
- totalTokensIn: row?.total_tokens_in ?? 0,
125
- totalTokensOut: row?.total_tokens_out ?? 0,
126
- totalCost: row?.total_cost ?? 0,
127
- avgDuration: row?.avg_duration ?? 0,
128
- firstRequest: row?.first_request ?? null,
129
- lastRequest: row?.last_request ?? null,
130
- };
131
- }
132
- /** Get recent requests for debugging */
133
- getRecentRequests(limit = 10) {
134
- return this.stmts.recentRequests.all(limit).map(r => ({
135
- requestId: r.request_id,
136
- timestamp: r.timestamp,
137
- provider: r.provider,
138
- model: r.model,
139
- tokensIn: r.tokens_in,
140
- tokensOut: r.tokens_out,
141
- costEstimate: r.cost_estimate,
142
- durationMs: r.duration_ms,
143
- symbolIds: JSON.parse(r.symbol_ids || '[]'),
144
- filePaths: JSON.parse(r.file_paths || '[]'),
145
- intent: r.intent,
146
- complexityScore: r.complexity_score,
147
- tier: r.tier,
148
- cacheHit: !!r.cache_hit,
149
- }));
150
- }
151
- }
152
- //# sourceMappingURL=observability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/gateway/observability.ts"],"names":[],"mappings":"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"}