copilot-flow 0.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.
Files changed (95) hide show
  1. package/README.md +300 -0
  2. package/bin/copilot-flow.js +13 -0
  3. package/dist/agents/executor.d.ts +24 -0
  4. package/dist/agents/executor.d.ts.map +1 -0
  5. package/dist/agents/executor.js +85 -0
  6. package/dist/agents/executor.js.map +1 -0
  7. package/dist/agents/pool.d.ts +22 -0
  8. package/dist/agents/pool.d.ts.map +1 -0
  9. package/dist/agents/pool.js +84 -0
  10. package/dist/agents/pool.js.map +1 -0
  11. package/dist/agents/registry.d.ts +16 -0
  12. package/dist/agents/registry.d.ts.map +1 -0
  13. package/dist/agents/registry.js +140 -0
  14. package/dist/agents/registry.js.map +1 -0
  15. package/dist/commands/agent.d.ts +3 -0
  16. package/dist/commands/agent.d.ts.map +1 -0
  17. package/dist/commands/agent.js +105 -0
  18. package/dist/commands/agent.js.map +1 -0
  19. package/dist/commands/doctor.d.ts +3 -0
  20. package/dist/commands/doctor.d.ts.map +1 -0
  21. package/dist/commands/doctor.js +119 -0
  22. package/dist/commands/doctor.js.map +1 -0
  23. package/dist/commands/hooks.d.ts +3 -0
  24. package/dist/commands/hooks.d.ts.map +1 -0
  25. package/dist/commands/hooks.js +75 -0
  26. package/dist/commands/hooks.js.map +1 -0
  27. package/dist/commands/index.d.ts +5 -0
  28. package/dist/commands/index.d.ts.map +1 -0
  29. package/dist/commands/index.js +31 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/commands/init.d.ts +3 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +37 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/memory.d.ts +3 -0
  36. package/dist/commands/memory.d.ts.map +1 -0
  37. package/dist/commands/memory.js +109 -0
  38. package/dist/commands/memory.js.map +1 -0
  39. package/dist/commands/route.d.ts +3 -0
  40. package/dist/commands/route.d.ts.map +1 -0
  41. package/dist/commands/route.js +36 -0
  42. package/dist/commands/route.js.map +1 -0
  43. package/dist/commands/status.d.ts +3 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +58 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/swarm.d.ts +3 -0
  48. package/dist/commands/swarm.d.ts.map +1 -0
  49. package/dist/commands/swarm.js +106 -0
  50. package/dist/commands/swarm.js.map +1 -0
  51. package/dist/config.d.ts +16 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +95 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/client-manager.d.ts +19 -0
  56. package/dist/core/client-manager.d.ts.map +1 -0
  57. package/dist/core/client-manager.js +69 -0
  58. package/dist/core/client-manager.js.map +1 -0
  59. package/dist/core/error-handler.d.ts +25 -0
  60. package/dist/core/error-handler.d.ts.map +1 -0
  61. package/dist/core/error-handler.js +135 -0
  62. package/dist/core/error-handler.js.map +1 -0
  63. package/dist/core/retry.d.ts +56 -0
  64. package/dist/core/retry.d.ts.map +1 -0
  65. package/dist/core/retry.js +107 -0
  66. package/dist/core/retry.js.map +1 -0
  67. package/dist/hooks/executor.d.ts +25 -0
  68. package/dist/hooks/executor.d.ts.map +1 -0
  69. package/dist/hooks/executor.js +57 -0
  70. package/dist/hooks/executor.js.map +1 -0
  71. package/dist/hooks/registry.d.ts +22 -0
  72. package/dist/hooks/registry.d.ts.map +1 -0
  73. package/dist/hooks/registry.js +36 -0
  74. package/dist/hooks/registry.js.map +1 -0
  75. package/dist/index.d.ts +20 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +52 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/memory/store.d.ts +32 -0
  80. package/dist/memory/store.d.ts.map +1 -0
  81. package/dist/memory/store.js +149 -0
  82. package/dist/memory/store.js.map +1 -0
  83. package/dist/output.d.ts +26 -0
  84. package/dist/output.d.ts.map +1 -0
  85. package/dist/output.js +157 -0
  86. package/dist/output.js.map +1 -0
  87. package/dist/swarm/coordinator.d.ts +20 -0
  88. package/dist/swarm/coordinator.d.ts.map +1 -0
  89. package/dist/swarm/coordinator.js +129 -0
  90. package/dist/swarm/coordinator.js.map +1 -0
  91. package/dist/types.d.ts +99 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +22 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +50 -0
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ /**
3
+ * Error classification for GitHub Copilot SDK errors.
4
+ * Maps raw errors into structured CopilotFlowError with category and retryability.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.classifyError = classifyError;
8
+ exports.formatError = formatError;
9
+ exports.asCopilotFlowError = asCopilotFlowError;
10
+ exports.isCopilotFlowError = isCopilotFlowError;
11
+ /** Patterns used to classify raw error messages. */
12
+ const PATTERNS = [
13
+ {
14
+ test: msg => msg.includes('copilot: command not found') ||
15
+ msg.includes('enoent') ||
16
+ msg.includes('cannot find') ||
17
+ msg.includes('not installed') ||
18
+ msg.includes('spawn') && msg.includes('enoent'),
19
+ category: 'copilot_not_installed',
20
+ retryable: false,
21
+ },
22
+ {
23
+ test: msg => msg.includes('401') ||
24
+ msg.includes('unauthorized') ||
25
+ msg.includes('authentication') ||
26
+ msg.includes('not authenticated') ||
27
+ msg.includes('login required'),
28
+ category: 'authentication',
29
+ retryable: false,
30
+ },
31
+ {
32
+ test: msg => msg.includes('403') ||
33
+ msg.includes('forbidden') ||
34
+ msg.includes('permission denied') ||
35
+ msg.includes('access denied'),
36
+ category: 'authorization',
37
+ retryable: false,
38
+ },
39
+ {
40
+ test: msg => msg.includes('404') ||
41
+ msg.includes('not found') ||
42
+ msg.includes('unknown model'),
43
+ category: 'not_found',
44
+ retryable: false,
45
+ },
46
+ {
47
+ test: msg => msg.includes('429') ||
48
+ msg.includes('rate limit') ||
49
+ msg.includes('too many requests'),
50
+ category: 'rate_limit',
51
+ retryable: true,
52
+ retryAfterMs: 5_000,
53
+ },
54
+ {
55
+ test: msg => msg.toLowerCase().includes('timeout') ||
56
+ msg.toLowerCase().includes('timed out'),
57
+ category: 'timeout',
58
+ retryable: true,
59
+ retryAfterMs: 1_000,
60
+ },
61
+ {
62
+ test: msg => msg.includes('session') && (msg.includes('closed') ||
63
+ msg.includes('disconnect') ||
64
+ msg.includes('crashed') ||
65
+ msg.includes('terminated')),
66
+ category: 'session_error',
67
+ retryable: true,
68
+ retryAfterMs: 2_000,
69
+ },
70
+ {
71
+ test: msg => ['econnreset', 'etimedout', 'econnrefused', 'enotfound', 'epipe'].some(c => msg.includes(c)),
72
+ category: 'network',
73
+ retryable: true,
74
+ retryAfterMs: 1_000,
75
+ },
76
+ {
77
+ test: msg => msg.includes('invalid') ||
78
+ msg.includes('validation') ||
79
+ msg.includes('bad request') ||
80
+ msg.includes('400'),
81
+ category: 'validation',
82
+ retryable: false,
83
+ },
84
+ ];
85
+ /** Classify an unknown thrown value into a structured CopilotFlowError. */
86
+ function classifyError(error) {
87
+ const raw = error instanceof Error ? error : new Error(String(error));
88
+ const msg = raw.message.toLowerCase();
89
+ for (const pattern of PATTERNS) {
90
+ if (pattern.test(msg, error)) {
91
+ return {
92
+ category: pattern.category,
93
+ message: raw.message,
94
+ retryable: pattern.retryable,
95
+ retryAfterMs: pattern.retryAfterMs,
96
+ originalError: error,
97
+ };
98
+ }
99
+ }
100
+ return {
101
+ category: 'unknown',
102
+ message: raw.message,
103
+ retryable: false,
104
+ originalError: error,
105
+ };
106
+ }
107
+ /** Format a CopilotFlowError for display in the terminal. */
108
+ function formatError(error) {
109
+ const prefix = `[${error.category.toUpperCase()}]`;
110
+ let msg = `${prefix} ${error.message}`;
111
+ if (error.retryable && error.retryAfterMs) {
112
+ msg += ` (retryable, suggested delay: ${error.retryAfterMs}ms)`;
113
+ }
114
+ else if (!error.retryable) {
115
+ msg += ` (not retryable)`;
116
+ }
117
+ return msg;
118
+ }
119
+ /**
120
+ * Wraps an unknown error as a CopilotFlowError and re-throws it.
121
+ * Useful for catch blocks that need structured error info.
122
+ */
123
+ function asCopilotFlowError(error) {
124
+ if (isCopilotFlowError(error))
125
+ return error;
126
+ return classifyError(error);
127
+ }
128
+ function isCopilotFlowError(value) {
129
+ return (typeof value === 'object' &&
130
+ value !== null &&
131
+ 'category' in value &&
132
+ 'message' in value &&
133
+ 'retryable' in value);
134
+ }
135
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/core/error-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Retry engine with configurable backoff strategies, jitter, and intervals.
3
+ * Supports exponential, linear, constant, and fibonacci backoff.
4
+ */
5
+ export type BackoffStrategy = 'exponential' | 'linear' | 'constant' | 'fibonacci';
6
+ export interface RetryConfig {
7
+ /** Maximum number of attempts (including the first). Default: 3 */
8
+ maxAttempts: number;
9
+ /** Initial delay in milliseconds before first retry. Default: 1000 */
10
+ initialDelayMs: number;
11
+ /** Maximum delay cap in milliseconds. Default: 30000 */
12
+ maxDelayMs: number;
13
+ /** Backoff strategy. Default: 'exponential' */
14
+ backoffStrategy: BackoffStrategy;
15
+ /** Multiplier for exponential/linear strategies. Default: 2 */
16
+ multiplier: number;
17
+ /** Apply ±10% random jitter to prevent thundering herd. Default: true */
18
+ jitter: boolean;
19
+ /**
20
+ * Custom predicate — return true to retry on this error.
21
+ * Defaults to RetryPredicates.copilotErrors.
22
+ */
23
+ retryOn?: (error: Error, attempt: number) => boolean;
24
+ /** Called before each retry with error, attempt number, and next delay. */
25
+ onRetry?: (error: Error, attempt: number, nextDelayMs: number) => void;
26
+ }
27
+ export declare const DEFAULT_RETRY_CONFIG: RetryConfig;
28
+ /** Calculate the base delay (before jitter) for a given attempt (1-indexed). */
29
+ export declare function calculateDelay(attempt: number, config: RetryConfig): number;
30
+ /** Built-in retry predicates for common error categories. */
31
+ export declare const RetryPredicates: {
32
+ networkErrors: (e: Error) => boolean;
33
+ rateLimitErrors: (e: Error) => boolean;
34
+ serverErrors: (e: Error) => boolean;
35
+ timeoutErrors: (e: Error) => boolean;
36
+ /** Retries on all transient Copilot/network errors. */
37
+ copilotErrors: (e: Error) => boolean;
38
+ /** Retry on any error. Use with caution. */
39
+ all: (_e: Error) => boolean;
40
+ };
41
+ export interface RetryResult<T> {
42
+ value: T;
43
+ attempts: number;
44
+ totalDurationMs: number;
45
+ }
46
+ /**
47
+ * Execute `fn` with automatic retries on failure.
48
+ *
49
+ * @example
50
+ * const result = await withRetry(
51
+ * () => session.sendAndWait({ prompt: task }),
52
+ * { maxAttempts: 3, backoffStrategy: 'exponential', onRetry: (err, n) => console.log(`Retry ${n}: ${err.message}`) }
53
+ * );
54
+ */
55
+ export declare function withRetry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>): Promise<T>;
56
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/core/retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC;AAElF,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,eAAe,EAAE,eAAe,CAAC;IACjC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IACrD,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACxE;AAED,eAAO,MAAM,oBAAoB,EAAE,WAOlC,CAAC;AAWF,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CA4B3E;AAED,6DAA6D;AAC7D,eAAO,MAAM,eAAe;uBACP,KAAK,KAAG,OAAO;yBAKb,KAAK,KAAG,OAAO;sBAKlB,KAAK,KAAG,OAAO;uBAKd,KAAK,KAAG,OAAO;IAIlC,uDAAuD;uBACpC,KAAK,KAAG,OAAO;IAMlC,4CAA4C;cAClC,KAAK,KAAG,OAAO;CAC1B,CAAC;AAEF,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAChC,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ /**
3
+ * Retry engine with configurable backoff strategies, jitter, and intervals.
4
+ * Supports exponential, linear, constant, and fibonacci backoff.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RetryPredicates = exports.DEFAULT_RETRY_CONFIG = void 0;
8
+ exports.calculateDelay = calculateDelay;
9
+ exports.withRetry = withRetry;
10
+ exports.DEFAULT_RETRY_CONFIG = {
11
+ maxAttempts: 3,
12
+ initialDelayMs: 1000,
13
+ maxDelayMs: 30_000,
14
+ backoffStrategy: 'exponential',
15
+ multiplier: 2,
16
+ jitter: true,
17
+ };
18
+ // Pre-cached fibonacci values to avoid recomputation
19
+ const FIB_CACHE = [1, 1];
20
+ function fib(n) {
21
+ while (FIB_CACHE.length <= n) {
22
+ FIB_CACHE.push(FIB_CACHE[FIB_CACHE.length - 1] + FIB_CACHE[FIB_CACHE.length - 2]);
23
+ }
24
+ return FIB_CACHE[n];
25
+ }
26
+ /** Calculate the base delay (before jitter) for a given attempt (1-indexed). */
27
+ function calculateDelay(attempt, config) {
28
+ const { initialDelayMs, maxDelayMs, backoffStrategy, multiplier } = config;
29
+ let delay;
30
+ switch (backoffStrategy) {
31
+ case 'exponential':
32
+ delay = initialDelayMs * Math.pow(multiplier, attempt - 1);
33
+ break;
34
+ case 'linear':
35
+ delay = initialDelayMs * attempt;
36
+ break;
37
+ case 'constant':
38
+ delay = initialDelayMs;
39
+ break;
40
+ case 'fibonacci':
41
+ delay = initialDelayMs * fib(attempt - 1);
42
+ break;
43
+ default:
44
+ delay = initialDelayMs;
45
+ }
46
+ if (config.jitter) {
47
+ // Apply ±10% random jitter
48
+ const jitterAmount = (Math.random() - 0.5) * 0.2 * delay;
49
+ delay += jitterAmount;
50
+ }
51
+ return Math.min(Math.max(delay, 0), maxDelayMs);
52
+ }
53
+ /** Built-in retry predicates for common error categories. */
54
+ exports.RetryPredicates = {
55
+ networkErrors: (e) => ['ECONNRESET', 'ETIMEDOUT', 'ECONNREFUSED', 'ENOTFOUND', 'EPIPE', 'EHOSTUNREACH'].some(code => e.message.includes(code) || e.code === code),
56
+ rateLimitErrors: (e) => e.message.includes('429') ||
57
+ e.message.toLowerCase().includes('rate limit') ||
58
+ e.message.toLowerCase().includes('too many requests'),
59
+ serverErrors: (e) => /\b5[0-9]{2}\b/.test(e.message) ||
60
+ e.message.toLowerCase().includes('internal server error') ||
61
+ e.message.toLowerCase().includes('service unavailable'),
62
+ timeoutErrors: (e) => e.message.toLowerCase().includes('timeout') ||
63
+ e.message.toLowerCase().includes('timed out'),
64
+ /** Retries on all transient Copilot/network errors. */
65
+ copilotErrors: (e) => exports.RetryPredicates.networkErrors(e) ||
66
+ exports.RetryPredicates.rateLimitErrors(e) ||
67
+ exports.RetryPredicates.serverErrors(e) ||
68
+ exports.RetryPredicates.timeoutErrors(e),
69
+ /** Retry on any error. Use with caution. */
70
+ all: (_e) => true,
71
+ };
72
+ /**
73
+ * Execute `fn` with automatic retries on failure.
74
+ *
75
+ * @example
76
+ * const result = await withRetry(
77
+ * () => session.sendAndWait({ prompt: task }),
78
+ * { maxAttempts: 3, backoffStrategy: 'exponential', onRetry: (err, n) => console.log(`Retry ${n}: ${err.message}`) }
79
+ * );
80
+ */
81
+ async function withRetry(fn, config = {}) {
82
+ const cfg = { ...exports.DEFAULT_RETRY_CONFIG, ...config };
83
+ const retryOn = cfg.retryOn ?? exports.RetryPredicates.copilotErrors;
84
+ const startTime = Date.now();
85
+ let lastError = new Error('Unknown error');
86
+ for (let attempt = 1; attempt <= cfg.maxAttempts; attempt++) {
87
+ try {
88
+ return await fn();
89
+ }
90
+ catch (err) {
91
+ lastError = err instanceof Error ? err : new Error(String(err));
92
+ const isLastAttempt = attempt >= cfg.maxAttempts;
93
+ if (isLastAttempt || !retryOn(lastError, attempt)) {
94
+ throw lastError;
95
+ }
96
+ const delayMs = calculateDelay(attempt, cfg);
97
+ cfg.onRetry?.(lastError, attempt, delayMs);
98
+ await sleep(delayMs);
99
+ }
100
+ }
101
+ // Should never reach here, but TypeScript needs a return path
102
+ throw lastError;
103
+ }
104
+ function sleep(ms) {
105
+ return new Promise(resolve => setTimeout(resolve, ms));
106
+ }
107
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/core/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Hook executor — runs all handlers for an event with timeout protection.
3
+ */
4
+ import type { HookEvent } from '../types.js';
5
+ /**
6
+ * Emit a hook event and run all registered handlers.
7
+ * Handlers that exceed the timeout or throw are logged but do not block execution.
8
+ *
9
+ * @param continueOnError - If false, the first handler error aborts remaining handlers. Default: true.
10
+ */
11
+ export declare function emit<T = unknown>(event: HookEvent, data?: T, options?: {
12
+ timeoutMs?: number;
13
+ continueOnError?: boolean;
14
+ }): Promise<void>;
15
+ export declare const hooks: {
16
+ preTask: (data?: unknown) => Promise<void>;
17
+ postTask: (data?: unknown) => Promise<void>;
18
+ sessionStart: (data?: unknown) => Promise<void>;
19
+ sessionEnd: (data?: unknown) => Promise<void>;
20
+ agentSpawn: (data?: unknown) => Promise<void>;
21
+ agentTerminate: (data?: unknown) => Promise<void>;
22
+ swarmStart: (data?: unknown) => Promise<void>;
23
+ swarmEnd: (data?: unknown) => Promise<void>;
24
+ };
25
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/hooks/executor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAa1D;;;;;GAKG;AACH,wBAAsB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpC,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,CAAC,EACR,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CAsBf;AAGD,eAAO,MAAM,KAAK;qBACC,OAAO;sBACN,OAAO;0BACH,OAAO;wBACT,OAAO;wBACP,OAAO;4BACH,OAAO;wBACX,OAAO;sBACT,OAAO;CAC1B,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Hook executor — runs all handlers for an event with timeout protection.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hooks = void 0;
7
+ exports.emit = emit;
8
+ const registry_js_1 = require("./registry.js");
9
+ const output_js_1 = require("../output.js");
10
+ const DEFAULT_TIMEOUT_MS = 5_000;
11
+ function withTimeout(promise, ms) {
12
+ return Promise.race([
13
+ promise,
14
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Hook timed out after ${ms}ms`)), ms)),
15
+ ]);
16
+ }
17
+ /**
18
+ * Emit a hook event and run all registered handlers.
19
+ * Handlers that exceed the timeout or throw are logged but do not block execution.
20
+ *
21
+ * @param continueOnError - If false, the first handler error aborts remaining handlers. Default: true.
22
+ */
23
+ async function emit(event, data, options = {}) {
24
+ const handlers = registry_js_1.globalHooks.getHandlers(event);
25
+ if (handlers.length === 0)
26
+ return;
27
+ const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
28
+ const continueOnError = options.continueOnError ?? true;
29
+ const ctx = {
30
+ event,
31
+ timestamp: Date.now(),
32
+ data,
33
+ };
34
+ for (const handler of handlers) {
35
+ try {
36
+ await withTimeout(handler(ctx), timeoutMs);
37
+ }
38
+ catch (err) {
39
+ const msg = err instanceof Error ? err.message : String(err);
40
+ output_js_1.output.warn(`Hook [${event}] handler error: ${msg}`);
41
+ if (!continueOnError)
42
+ throw err;
43
+ }
44
+ }
45
+ }
46
+ // Convenience wrappers
47
+ exports.hooks = {
48
+ preTask: (data) => emit('pre-task', data),
49
+ postTask: (data) => emit('post-task', data),
50
+ sessionStart: (data) => emit('session-start', data),
51
+ sessionEnd: (data) => emit('session-end', data),
52
+ agentSpawn: (data) => emit('agent-spawn', data),
53
+ agentTerminate: (data) => emit('agent-terminate', data),
54
+ swarmStart: (data) => emit('swarm-start', data),
55
+ swarmEnd: (data) => emit('swarm-end', data),
56
+ };
57
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/hooks/executor.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAuBH,oBA0BC;AA/CD,+CAA4C;AAC5C,4CAAsC;AAGtC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,SAAS,WAAW,CAAI,OAAmB,EAAE,EAAU;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO;QACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC3B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CACxE;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,IAAI,CACxB,KAAgB,EAChB,IAAQ,EACR,UAA6D,EAAE;IAE/D,MAAM,QAAQ,GAAG,yBAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IAExD,MAAM,GAAG,GAAmB;QAC1B,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI;KACL,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,kBAAM,CAAC,IAAI,CAAC,SAAS,KAAK,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,eAAe;gBAAE,MAAM,GAAG,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,uBAAuB;AACV,QAAA,KAAK,GAAG;IACnB,OAAO,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;IACnD,QAAQ,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;IACrD,YAAY,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;IAC7D,UAAU,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;IACzD,UAAU,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;IACzD,cAAc,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC;IACjE,UAAU,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC;IACzD,QAAQ,EAAE,CAAC,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;CACtD,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Hook registry — priority-ordered pub/sub for lifecycle events.
3
+ */
4
+ import type { HookEvent, HookHandler } from '../types.js';
5
+ export declare class HookRegistry {
6
+ private hooks;
7
+ /** Register a handler for an event. Higher priority runs first. Default: 50. */
8
+ on(event: HookEvent, handler: HookHandler, priority?: number): () => void;
9
+ /** Unregister a handler. */
10
+ off(event: HookEvent, handler: HookHandler): void;
11
+ /** Get handlers registered for an event, sorted by priority. */
12
+ getHandlers(event: HookEvent): HookHandler[];
13
+ /** Return all registered hooks (for inspection). */
14
+ list(): Array<{
15
+ id: string;
16
+ event: HookEvent;
17
+ priority: number;
18
+ }>;
19
+ clear(): void;
20
+ }
21
+ export declare const globalHooks: HookRegistry;
22
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/hooks/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAWvE,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAmB;IAEhC,gFAAgF;IAChF,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,SAAK,GAAG,MAAM,IAAI;IAQrE,4BAA4B;IAC5B,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAIjD,gEAAgE;IAChE,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,EAAE;IAI5C,oDAAoD;IACpD,IAAI,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,WAAW,cAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Hook registry — priority-ordered pub/sub for lifecycle events.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.globalHooks = exports.HookRegistry = void 0;
7
+ let _nextId = 0;
8
+ class HookRegistry {
9
+ hooks = [];
10
+ /** Register a handler for an event. Higher priority runs first. Default: 50. */
11
+ on(event, handler, priority = 50) {
12
+ const entry = { id: String(_nextId++), event, handler, priority };
13
+ this.hooks.push(entry);
14
+ this.hooks.sort((a, b) => b.priority - a.priority);
15
+ // Return unsubscribe function
16
+ return () => this.off(event, handler);
17
+ }
18
+ /** Unregister a handler. */
19
+ off(event, handler) {
20
+ this.hooks = this.hooks.filter(h => !(h.event === event && h.handler === handler));
21
+ }
22
+ /** Get handlers registered for an event, sorted by priority. */
23
+ getHandlers(event) {
24
+ return this.hooks.filter(h => h.event === event).map(h => h.handler);
25
+ }
26
+ /** Return all registered hooks (for inspection). */
27
+ list() {
28
+ return this.hooks.map(({ id, event, priority }) => ({ id, event, priority }));
29
+ }
30
+ clear() {
31
+ this.hooks = [];
32
+ }
33
+ }
34
+ exports.HookRegistry = HookRegistry;
35
+ exports.globalHooks = new HookRegistry();
36
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/hooks/registry.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAWH,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,MAAa,YAAY;IACf,KAAK,GAAgB,EAAE,CAAC;IAEhC,gFAAgF;IAChF,EAAE,CAAC,KAAgB,EAAE,OAAoB,EAAE,QAAQ,GAAG,EAAE;QACtD,MAAM,KAAK,GAAc,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC7E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,8BAA8B;QAC9B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,4BAA4B;IAC5B,GAAG,CAAC,KAAgB,EAAE,OAAoB;QACxC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;IACrF,CAAC;IAED,gEAAgE;IAChE,WAAW,CAAC,KAAgB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,oDAAoD;IACpD,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF;AA9BD,oCA8BC;AAEY,QAAA,WAAW,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * copilot-flow — public package API.
3
+ *
4
+ * Import these when using copilot-flow as a library inside your own scripts.
5
+ */
6
+ export { withRetry, calculateDelay, RetryPredicates, DEFAULT_RETRY_CONFIG } from './core/retry.js';
7
+ export type { RetryConfig, BackoffStrategy } from './core/retry.js';
8
+ export { classifyError, formatError, asCopilotFlowError, isCopilotFlowError } from './core/error-handler.js';
9
+ export type { CopilotFlowError, CopilotFlowErrorCategory } from './core/error-handler.js';
10
+ export { clientManager, ClientManager } from './core/client-manager.js';
11
+ export { runAgentTask } from './agents/executor.js';
12
+ export { AGENT_REGISTRY, getAgentDefinition, listAgentTypes, routeTask } from './agents/registry.js';
13
+ export { agentPool } from './agents/pool.js';
14
+ export { runSwarm } from './swarm/coordinator.js';
15
+ export { MemoryStore, getMemoryStore } from './memory/store.js';
16
+ export { globalHooks, HookRegistry } from './hooks/registry.js';
17
+ export { emit, hooks } from './hooks/executor.js';
18
+ export { loadConfig, saveConfig, DEFAULT_CONFIG } from './config.js';
19
+ export type { AgentType, AgentDefinition, AgentState, AgentResult, SwarmTask, SwarmTopology, MemoryEntry, StoreOptions, HookEvent, HookHandler, HookContext, CopilotFlowConfig, CommandContext, } from './types.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACnG,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7G,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGrE,YAAY,EACV,SAAS,EACT,eAAe,EACf,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,cAAc,GACf,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * copilot-flow — public package API.
4
+ *
5
+ * Import these when using copilot-flow as a library inside your own scripts.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_CONFIG = exports.saveConfig = exports.loadConfig = exports.hooks = exports.emit = exports.HookRegistry = exports.globalHooks = exports.getMemoryStore = exports.MemoryStore = exports.runSwarm = exports.agentPool = exports.routeTask = exports.listAgentTypes = exports.getAgentDefinition = exports.AGENT_REGISTRY = exports.runAgentTask = exports.ClientManager = exports.clientManager = exports.isCopilotFlowError = exports.asCopilotFlowError = exports.formatError = exports.classifyError = exports.DEFAULT_RETRY_CONFIG = exports.RetryPredicates = exports.calculateDelay = exports.withRetry = void 0;
9
+ // Core
10
+ var retry_js_1 = require("./core/retry.js");
11
+ Object.defineProperty(exports, "withRetry", { enumerable: true, get: function () { return retry_js_1.withRetry; } });
12
+ Object.defineProperty(exports, "calculateDelay", { enumerable: true, get: function () { return retry_js_1.calculateDelay; } });
13
+ Object.defineProperty(exports, "RetryPredicates", { enumerable: true, get: function () { return retry_js_1.RetryPredicates; } });
14
+ Object.defineProperty(exports, "DEFAULT_RETRY_CONFIG", { enumerable: true, get: function () { return retry_js_1.DEFAULT_RETRY_CONFIG; } });
15
+ var error_handler_js_1 = require("./core/error-handler.js");
16
+ Object.defineProperty(exports, "classifyError", { enumerable: true, get: function () { return error_handler_js_1.classifyError; } });
17
+ Object.defineProperty(exports, "formatError", { enumerable: true, get: function () { return error_handler_js_1.formatError; } });
18
+ Object.defineProperty(exports, "asCopilotFlowError", { enumerable: true, get: function () { return error_handler_js_1.asCopilotFlowError; } });
19
+ Object.defineProperty(exports, "isCopilotFlowError", { enumerable: true, get: function () { return error_handler_js_1.isCopilotFlowError; } });
20
+ var client_manager_js_1 = require("./core/client-manager.js");
21
+ Object.defineProperty(exports, "clientManager", { enumerable: true, get: function () { return client_manager_js_1.clientManager; } });
22
+ Object.defineProperty(exports, "ClientManager", { enumerable: true, get: function () { return client_manager_js_1.ClientManager; } });
23
+ // Agents
24
+ var executor_js_1 = require("./agents/executor.js");
25
+ Object.defineProperty(exports, "runAgentTask", { enumerable: true, get: function () { return executor_js_1.runAgentTask; } });
26
+ var registry_js_1 = require("./agents/registry.js");
27
+ Object.defineProperty(exports, "AGENT_REGISTRY", { enumerable: true, get: function () { return registry_js_1.AGENT_REGISTRY; } });
28
+ Object.defineProperty(exports, "getAgentDefinition", { enumerable: true, get: function () { return registry_js_1.getAgentDefinition; } });
29
+ Object.defineProperty(exports, "listAgentTypes", { enumerable: true, get: function () { return registry_js_1.listAgentTypes; } });
30
+ Object.defineProperty(exports, "routeTask", { enumerable: true, get: function () { return registry_js_1.routeTask; } });
31
+ var pool_js_1 = require("./agents/pool.js");
32
+ Object.defineProperty(exports, "agentPool", { enumerable: true, get: function () { return pool_js_1.agentPool; } });
33
+ // Swarm
34
+ var coordinator_js_1 = require("./swarm/coordinator.js");
35
+ Object.defineProperty(exports, "runSwarm", { enumerable: true, get: function () { return coordinator_js_1.runSwarm; } });
36
+ // Memory
37
+ var store_js_1 = require("./memory/store.js");
38
+ Object.defineProperty(exports, "MemoryStore", { enumerable: true, get: function () { return store_js_1.MemoryStore; } });
39
+ Object.defineProperty(exports, "getMemoryStore", { enumerable: true, get: function () { return store_js_1.getMemoryStore; } });
40
+ // Hooks
41
+ var registry_js_2 = require("./hooks/registry.js");
42
+ Object.defineProperty(exports, "globalHooks", { enumerable: true, get: function () { return registry_js_2.globalHooks; } });
43
+ Object.defineProperty(exports, "HookRegistry", { enumerable: true, get: function () { return registry_js_2.HookRegistry; } });
44
+ var executor_js_2 = require("./hooks/executor.js");
45
+ Object.defineProperty(exports, "emit", { enumerable: true, get: function () { return executor_js_2.emit; } });
46
+ Object.defineProperty(exports, "hooks", { enumerable: true, get: function () { return executor_js_2.hooks; } });
47
+ // Config
48
+ var config_js_1 = require("./config.js");
49
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_js_1.loadConfig; } });
50
+ Object.defineProperty(exports, "saveConfig", { enumerable: true, get: function () { return config_js_1.saveConfig; } });
51
+ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return config_js_1.DEFAULT_CONFIG; } });
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,OAAO;AACP,4CAAmG;AAA1F,qGAAA,SAAS,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAEzE,4DAA6G;AAApG,iHAAA,aAAa,OAAA;AAAE,+GAAA,WAAW,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAE3E,8DAAwE;AAA/D,kHAAA,aAAa,OAAA;AAAE,kHAAA,aAAa,OAAA;AAErC,SAAS;AACT,oDAAoD;AAA3C,2GAAA,YAAY,OAAA;AACrB,oDAAqG;AAA5F,6GAAA,cAAc,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,wGAAA,SAAS,OAAA;AACtE,4CAA6C;AAApC,oGAAA,SAAS,OAAA;AAElB,QAAQ;AACR,yDAAkD;AAAzC,0GAAA,QAAQ,OAAA;AAEjB,SAAS;AACT,8CAAgE;AAAvD,uGAAA,WAAW,OAAA;AAAE,0GAAA,cAAc,OAAA;AAEpC,QAAQ;AACR,mDAAgE;AAAvD,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AAClC,mDAAkD;AAAzC,mGAAA,IAAI,OAAA;AAAE,oGAAA,KAAK,OAAA;AAEpB,SAAS;AACT,yCAAqE;AAA5D,uGAAA,UAAU,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SQLite-backed namespaced key-value memory store.
3
+ * Used by agents to share state and by the CLI to persist data between runs.
4
+ *
5
+ * Uses Node.js built-in `node:sqlite` (available since Node 22.5) to avoid
6
+ * native addon compilation requirements.
7
+ */
8
+ import type { MemoryEntry, StoreOptions } from '../types.js';
9
+ export declare class MemoryStore {
10
+ private db;
11
+ constructor(dbPath?: string);
12
+ /** Store a value under namespace/key. Upserts if key already exists. */
13
+ store(namespace: string, key: string, value: string, opts?: StoreOptions): void;
14
+ /** Retrieve a value by namespace and key. Returns null if not found or expired. */
15
+ retrieve(namespace: string, key: string): string | null;
16
+ /**
17
+ * Search entries in a namespace by substring match on key or value.
18
+ * Returns up to `limit` results (default 20).
19
+ */
20
+ search(namespace: string, query: string, limit?: number): MemoryEntry[];
21
+ /** List all non-expired entries in a namespace. */
22
+ list(namespace: string): MemoryEntry[];
23
+ /** Delete a specific key from a namespace. */
24
+ delete(namespace: string, key: string): boolean;
25
+ /** Delete all entries in a namespace. Returns the number of deleted entries. */
26
+ clear(namespace: string): number;
27
+ /** Close the database connection. */
28
+ close(): void;
29
+ private _pruneExpired;
30
+ }
31
+ export declare function getMemoryStore(dbPath?: string): MemoryStore;
32
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB7D,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAe;gBAEb,MAAM,SAA0C;IAa5D,wEAAwE;IACxE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB,GAAG,IAAI;IAoBnF,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYvD;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE;IAkCnE,mDAAmD;IACnD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IA8BtC,8CAA8C;IAC9C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAO/C,gFAAgF;IAChF,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAOhC,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;CAKtB;AAKD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAK3D"}