cosmios 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 (73) hide show
  1. package/dist/adapters/claude-code.d.ts +7 -0
  2. package/dist/adapters/claude-code.d.ts.map +1 -0
  3. package/dist/adapters/claude-code.js +128 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/codex.d.ts +7 -0
  6. package/dist/adapters/codex.d.ts.map +1 -0
  7. package/dist/adapters/codex.js +140 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/interface.d.ts +18 -0
  10. package/dist/adapters/interface.d.ts.map +1 -0
  11. package/dist/adapters/interface.js +2 -0
  12. package/dist/adapters/interface.js.map +1 -0
  13. package/dist/api-client.d.ts +15 -0
  14. package/dist/api-client.d.ts.map +1 -0
  15. package/dist/api-client.js +170 -0
  16. package/dist/api-client.js.map +1 -0
  17. package/dist/cli.d.ts +3 -0
  18. package/dist/cli.d.ts.map +1 -0
  19. package/dist/cli.js +228 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +6 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +27 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/connection.d.ts +26 -0
  26. package/dist/connection.d.ts.map +1 -0
  27. package/dist/connection.js +92 -0
  28. package/dist/connection.js.map +1 -0
  29. package/dist/heartbeat.d.ts +2 -0
  30. package/dist/heartbeat.d.ts.map +1 -0
  31. package/dist/heartbeat.js +101 -0
  32. package/dist/heartbeat.js.map +1 -0
  33. package/dist/index.d.ts +31 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +116 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/journal.d.ts +13 -0
  38. package/dist/journal.d.ts.map +1 -0
  39. package/dist/journal.js +47 -0
  40. package/dist/journal.js.map +1 -0
  41. package/dist/log-sanitizer.d.ts +6 -0
  42. package/dist/log-sanitizer.d.ts.map +1 -0
  43. package/dist/log-sanitizer.js +36 -0
  44. package/dist/log-sanitizer.js.map +1 -0
  45. package/dist/logger.d.ts +12 -0
  46. package/dist/logger.d.ts.map +1 -0
  47. package/dist/logger.js +32 -0
  48. package/dist/logger.js.map +1 -0
  49. package/dist/poller.d.ts +8 -0
  50. package/dist/poller.d.ts.map +1 -0
  51. package/dist/poller.js +52 -0
  52. package/dist/poller.js.map +1 -0
  53. package/dist/preview-poller.d.ts +3 -0
  54. package/dist/preview-poller.d.ts.map +1 -0
  55. package/dist/preview-poller.js +499 -0
  56. package/dist/preview-poller.js.map +1 -0
  57. package/dist/rollback-poller.d.ts +2 -0
  58. package/dist/rollback-poller.d.ts.map +1 -0
  59. package/dist/rollback-poller.js +46 -0
  60. package/dist/rollback-poller.js.map +1 -0
  61. package/dist/run-handler.d.ts +16 -0
  62. package/dist/run-handler.d.ts.map +1 -0
  63. package/dist/run-handler.js +159 -0
  64. package/dist/run-handler.js.map +1 -0
  65. package/dist/snapshot.d.ts +3 -0
  66. package/dist/snapshot.d.ts.map +1 -0
  67. package/dist/snapshot.js +96 -0
  68. package/dist/snapshot.js.map +1 -0
  69. package/dist/types.d.ts +37 -0
  70. package/dist/types.d.ts.map +1 -0
  71. package/dist/types.js +2 -0
  72. package/dist/types.js.map +1 -0
  73. package/package.json +46 -0
package/dist/index.js ADDED
@@ -0,0 +1,116 @@
1
+ import { hostname, platform } from 'node:os';
2
+ import { loadConfig, saveConfig } from './config.js';
3
+ import { connectRunner } from './api-client.js';
4
+ import { startHeartbeat } from './heartbeat.js';
5
+ import { RunnerConnection } from './connection.js';
6
+ import { handleRunDispatch } from './run-handler.js';
7
+ import { startRunPoller } from './poller.js';
8
+ import { startRollbackPoller } from './rollback-poller.js';
9
+ import { startPreviewPoller } from './preview-poller.js';
10
+ import { ClaudeCodeAdapter } from './adapters/claude-code.js';
11
+ import { CodexAdapter } from './adapters/codex.js';
12
+ import { createSnapshot } from './snapshot.js';
13
+ import { log } from './logger.js';
14
+ export { log, createLogger, setLogLevel } from './logger.js';
15
+ export { loadConfig, saveConfig, getConfigPath, getConfigDir } from './config.js';
16
+ export { connectRunner, sendHeartbeat, updateRunStatus, appendRunEvent } from './api-client.js';
17
+ export { ClaudeCodeAdapter } from './adapters/claude-code.js';
18
+ export { CodexAdapter } from './adapters/codex.js';
19
+ export class CosmiosRunner {
20
+ config;
21
+ connection = null;
22
+ stopHeartbeat = null;
23
+ messageHandlers = new Map();
24
+ statusHandlers = [];
25
+ executor = {
26
+ adapter: new ClaudeCodeAdapter(),
27
+ adapters: {
28
+ 'claude-code': new ClaudeCodeAdapter(),
29
+ 'codex': new CodexAdapter()
30
+ },
31
+ snapshot: createSnapshot
32
+ };
33
+ stopPoller = null;
34
+ stopRollbackPoller = null;
35
+ stopPreviewPoller = null;
36
+ constructor(config) {
37
+ this.config = config;
38
+ }
39
+ static fromConfig() {
40
+ const config = loadConfig();
41
+ if (!config)
42
+ throw new Error('runner_not_registered');
43
+ return new CosmiosRunner(config);
44
+ }
45
+ async start() {
46
+ // Connect to server: mark online + get fresh supabase creds
47
+ const connectInfo = await connectRunner(this.config.server_url, this.config.api_key, {
48
+ hostname: hostname(),
49
+ os: platform()
50
+ });
51
+ this.config = {
52
+ ...this.config,
53
+ runner_id: connectInfo.runner_id,
54
+ supabase_url: connectInfo.supabase_url,
55
+ supabase_anon_key: connectInfo.supabase_anon_key
56
+ };
57
+ // Persist updated config (supabase creds may rotate)
58
+ saveConfig(this.config);
59
+ // Wire built-in run:dispatch handler
60
+ this.messageHandlers.set('run:dispatch', (payload) => {
61
+ handleRunDispatch(this.config.server_url, this.config.api_key, '', // userId resolved server-side via api_key
62
+ payload, this.executor).catch((err) => log.error(`run handler error: ${err.message}`));
63
+ });
64
+ // Open Supabase Realtime channel runner:{runner_id}
65
+ this.connection = new RunnerConnection({
66
+ config: this.config,
67
+ onStatusChange: (status) => {
68
+ for (const handler of this.statusHandlers)
69
+ handler(status);
70
+ },
71
+ onMessage: (event, payload) => {
72
+ const handler = this.messageHandlers.get(event);
73
+ handler?.(payload);
74
+ }
75
+ });
76
+ this.connection.connect();
77
+ // Start heartbeat loop (every 30s)
78
+ this.stopHeartbeat = startHeartbeat(this.config.server_url, this.config.api_key, (err) => log.error(`heartbeat error: ${err.message}`));
79
+ // Poll for pending runs every 3s
80
+ this.stopPoller = startRunPoller(this.config.server_url, this.config.api_key, (run, policy) => {
81
+ handleRunDispatch(this.config.server_url, this.config.api_key, '', run, this.executor, policy).catch((err) => log.error(`run error: ${err.message}`));
82
+ }, (err) => log.error(`poller error: ${err.message}`));
83
+ // Poll for rollback requests every 5s
84
+ this.stopRollbackPoller = startRollbackPoller(this.config.server_url, this.config.api_key, (err) => log.error(`rollback poller error: ${err.message}`));
85
+ // Poll for preview requests every 3s
86
+ this.stopPreviewPoller = startPreviewPoller(this.config.server_url, this.config.api_key, (err) => log.error(`preview poller error: ${err.message}`));
87
+ // Ensure clean shutdown on Ctrl+C / kill / crash — kill all child
88
+ // process trees so dev servers, tunnels, etc. don't become zombies.
89
+ const gracefulStop = () => { this.stop(); process.exit(0); };
90
+ process.on('SIGINT', gracefulStop);
91
+ process.on('SIGTERM', gracefulStop);
92
+ process.on('beforeExit', () => this.stop());
93
+ log.info(`runner started — id: ${this.config.runner_id}`);
94
+ }
95
+ setExecutor(executor) {
96
+ this.executor = executor;
97
+ }
98
+ on(event, handler) {
99
+ this.messageHandlers.set(event, handler);
100
+ }
101
+ onStatusChange(handler) {
102
+ this.statusHandlers.push(handler);
103
+ }
104
+ stop() {
105
+ this.stopHeartbeat?.();
106
+ this.stopPoller?.();
107
+ this.stopRollbackPoller?.();
108
+ this.stopPreviewPoller?.();
109
+ this.connection?.disconnect();
110
+ log.info('runner stopped');
111
+ }
112
+ getRunnerId() {
113
+ return this.config.runner_id;
114
+ }
115
+ }
116
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type JournalEntryType = 'run_status' | 'run_event';
2
+ export interface JournalEntry {
3
+ id: string;
4
+ type: JournalEntryType;
5
+ run_id: string;
6
+ payload: Record<string, unknown>;
7
+ created_at: string;
8
+ }
9
+ export declare function writeJournal(type: JournalEntryType, run_id: string, payload: Record<string, unknown>): void;
10
+ export declare function readJournal(): JournalEntry[];
11
+ export declare function clearJournal(): void;
12
+ export declare function journalSize(): number;
13
+ //# sourceMappingURL=journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,WAAW,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAeN;AAED,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAU5C;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC"}
@@ -0,0 +1,47 @@
1
+ import { readFileSync, appendFileSync, mkdirSync, existsSync, unlinkSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { randomUUID } from 'node:crypto';
5
+ const JOURNAL_PATH = join(homedir(), '.cosmios', 'journal.jsonl');
6
+ export function writeJournal(type, run_id, payload) {
7
+ const entry = {
8
+ id: randomUUID(),
9
+ type,
10
+ run_id,
11
+ payload,
12
+ created_at: new Date().toISOString()
13
+ };
14
+ try {
15
+ mkdirSync(join(homedir(), '.cosmios'), { recursive: true });
16
+ appendFileSync(JOURNAL_PATH, JSON.stringify(entry) + '\n', 'utf8');
17
+ }
18
+ catch {
19
+ // Journal write failure is non-fatal
20
+ }
21
+ }
22
+ export function readJournal() {
23
+ if (!existsSync(JOURNAL_PATH))
24
+ return [];
25
+ try {
26
+ return readFileSync(JOURNAL_PATH, 'utf8')
27
+ .split('\n')
28
+ .filter(Boolean)
29
+ .map(line => JSON.parse(line));
30
+ }
31
+ catch {
32
+ return [];
33
+ }
34
+ }
35
+ export function clearJournal() {
36
+ try {
37
+ if (existsSync(JOURNAL_PATH))
38
+ unlinkSync(JOURNAL_PATH);
39
+ }
40
+ catch {
41
+ // non-fatal
42
+ }
43
+ }
44
+ export function journalSize() {
45
+ return readJournal().length;
46
+ }
47
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAYlE,MAAM,UAAU,YAAY,CAC1B,IAAsB,EACtB,MAAc,EACd,OAAgC;IAEhC,MAAM,KAAK,GAAiB;QAC1B,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI;QACJ,MAAM;QACN,OAAO;QACP,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAC;IAEF,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC;aACtC,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,YAAY,CAAC;YAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,WAAW,EAAE,CAAC,MAAM,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Redact secrets from log lines before they leave the machine.
3
+ * Patterns cover common API keys, tokens, passwords, and env vars.
4
+ */
5
+ export declare function sanitizeLogLine(line: string): string;
6
+ //# sourceMappingURL=log-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-sanitizer.d.ts","sourceRoot":"","sources":["../src/log-sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Redact secrets from log lines before they leave the machine.
3
+ * Patterns cover common API keys, tokens, passwords, and env vars.
4
+ */
5
+ const SECRET_PATTERNS = [
6
+ // Generic API keys (sk_live_, sk_test_, pk_live_, pk_test_)
7
+ { pattern: /\b(sk_live_|sk_test_|pk_live_|pk_test_)[A-Za-z0-9]{10,}/g, replacement: '$1[REDACTED]' },
8
+ // Anthropic API keys
9
+ { pattern: /\bsk-ant-[A-Za-z0-9_-]{20,}/g, replacement: 'sk-ant-[REDACTED]' },
10
+ // OpenAI API keys
11
+ { pattern: /\bsk-[A-Za-z0-9]{20,}/g, replacement: 'sk-[REDACTED]' },
12
+ // AWS keys
13
+ { pattern: /\b(AKIA|ASIA)[A-Z0-9]{16}\b/g, replacement: '$1[REDACTED]' },
14
+ // AWS secret keys (40 char base64-ish)
15
+ { pattern: /\b[A-Za-z0-9/+=]{40}\b(?=.*(?:aws|secret|key))/gi, replacement: '[REDACTED]' },
16
+ // Bearer tokens
17
+ { pattern: /(Bearer\s+)[A-Za-z0-9._\-]{20,}/gi, replacement: '$1[REDACTED]' },
18
+ // COSMIOS runner keys
19
+ { pattern: /\brs_live_[a-f0-9]{20,}/g, replacement: 'rs_live_[REDACTED]' },
20
+ // Generic tokens/secrets in env-like assignments (KEY=value, SECRET=value)
21
+ { pattern: /\b((?:API_KEY|SECRET|TOKEN|PASSWORD|PRIVATE_KEY|ACCESS_KEY)\s*[=:]\s*)\S{8,}/gi, replacement: '$1[REDACTED]' },
22
+ // GitHub tokens
23
+ { pattern: /\b(ghp_|gho_|ghu_|ghs_|ghr_)[A-Za-z0-9]{20,}/g, replacement: '$1[REDACTED]' },
24
+ // Supabase keys (eyJ... JWT format)
25
+ { pattern: /\beyJ[A-Za-z0-9_-]{50,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g, replacement: '[REDACTED_JWT]' },
26
+ ];
27
+ export function sanitizeLogLine(line) {
28
+ let result = line;
29
+ for (const { pattern, replacement } of SECRET_PATTERNS) {
30
+ // Reset lastIndex for global regexes
31
+ pattern.lastIndex = 0;
32
+ result = result.replace(pattern, replacement);
33
+ }
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=log-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-sanitizer.js","sourceRoot":"","sources":["../src/log-sanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,eAAe,GAAoD;IACvE,4DAA4D;IAC5D,EAAE,OAAO,EAAE,0DAA0D,EAAE,WAAW,EAAE,cAAc,EAAE;IACpG,qBAAqB;IACrB,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,mBAAmB,EAAE;IAC7E,kBAAkB;IAClB,EAAE,OAAO,EAAE,wBAAwB,EAAE,WAAW,EAAE,eAAe,EAAE;IACnE,WAAW;IACX,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,cAAc,EAAE;IACxE,uCAAuC;IACvC,EAAE,OAAO,EAAE,kDAAkD,EAAE,WAAW,EAAE,YAAY,EAAE;IAC1F,gBAAgB;IAChB,EAAE,OAAO,EAAE,mCAAmC,EAAE,WAAW,EAAE,cAAc,EAAE;IAC7E,sBAAsB;IACtB,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,oBAAoB,EAAE;IAC1E,2EAA2E;IAC3E,EAAE,OAAO,EAAE,gFAAgF,EAAE,WAAW,EAAE,cAAc,EAAE;IAC1H,gBAAgB;IAChB,EAAE,OAAO,EAAE,+CAA+C,EAAE,WAAW,EAAE,cAAc,EAAE;IACzF,oCAAoC;IACpC,EAAE,OAAO,EAAE,0DAA0D,EAAE,WAAW,EAAE,gBAAgB,EAAE;CACvG,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC;QACvD,qCAAqC;QACrC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export declare function setLogLevel(level: LogLevel): void;
3
+ export interface Logger {
4
+ debug(msg: string, extra?: Record<string, unknown>): void;
5
+ info(msg: string, extra?: Record<string, unknown>): void;
6
+ warn(msg: string, extra?: Record<string, unknown>): void;
7
+ error(msg: string, extra?: Record<string, unknown>): void;
8
+ }
9
+ export declare function createLogger(tag: string): Logger;
10
+ export declare const log: Logger;
11
+ export {};
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAMpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAaD,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC3D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,eAAO,MAAM,GAAG,QAA0B,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,32 @@
1
+ const LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 };
2
+ let minLevel = 'info';
3
+ export function setLogLevel(level) {
4
+ minLevel = level;
5
+ }
6
+ function emit(level, tag, message, extra) {
7
+ if (LEVEL_RANK[level] < LEVEL_RANK[minLevel])
8
+ return;
9
+ const prefix = `[${tag}]`;
10
+ const line = extra ? `${prefix} ${message} ${JSON.stringify(extra)}` : `${prefix} ${message}`;
11
+ switch (level) {
12
+ case 'error':
13
+ console.error(line);
14
+ break;
15
+ case 'warn':
16
+ console.warn(line);
17
+ break;
18
+ default:
19
+ console.log(line);
20
+ break;
21
+ }
22
+ }
23
+ export function createLogger(tag) {
24
+ return {
25
+ debug: (msg, extra) => emit('debug', tag, msg, extra),
26
+ info: (msg, extra) => emit('info', tag, msg, extra),
27
+ warn: (msg, extra) => emit('warn', tag, msg, extra),
28
+ error: (msg, extra) => emit('error', tag, msg, extra),
29
+ };
30
+ }
31
+ export const log = createLogger('cosmios');
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAEtF,IAAI,QAAQ,GAAa,MAAM,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,SAAS,IAAI,CAAC,KAAe,EAAE,GAAW,EAAE,OAAe,EAAE,KAA+B;IAC1F,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IAC9F,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;QACzC,KAAK,MAAM;YAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;QACxC;YAAc,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;IACzC,CAAC;AACH,CAAC;AASD,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;QACrD,IAAI,EAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;QACpD,IAAI,EAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;QACpD,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { RunDispatch } from './run-handler.js';
2
+ import type { RunPolicy } from './types.js';
3
+ export interface PendingRunResult {
4
+ run: RunDispatch;
5
+ policy: RunPolicy | null;
6
+ }
7
+ export declare function startRunPoller(serverUrl: string, apiKey: string, onDispatch: (run: RunDispatch, policy: RunPolicy | null) => void, onError?: (err: Error) => void): () => void;
8
+ //# sourceMappingURL=poller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAM5C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AA6CD,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,EAChE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAC7B,MAAM,IAAI,CAeZ"}
package/dist/poller.js ADDED
@@ -0,0 +1,52 @@
1
+ import { verifyCommandSignature } from '@cosmios/shared';
2
+ import { log } from './logger.js';
3
+ const POLL_INTERVAL_MS = 3_000;
4
+ async function fetchPendingRun(serverUrl, apiKey) {
5
+ const res = await fetch(`${serverUrl}/api/runs/pending`, {
6
+ headers: { authorization: `Bearer ${apiKey}` }
7
+ });
8
+ if (!res.ok)
9
+ return null;
10
+ const body = await res.json().catch(() => null);
11
+ if (!body?.run)
12
+ return null;
13
+ const r = body.run;
14
+ if (!r.run_id || !r.workspace)
15
+ return null;
16
+ // Verify command signature if present (defense-in-depth)
17
+ if (body.signature) {
18
+ const valid = verifyCommandSignature({ run_id: r.run_id, workspace: r.workspace, agent: r.agent ?? 'claude-code', command: r.command ?? '' }, body.signature, apiKey);
19
+ if (!valid) {
20
+ log.error(`Signature verification failed for run ${r.run_id} — skipping`);
21
+ return null;
22
+ }
23
+ }
24
+ const policy = body.policy ?? null;
25
+ return {
26
+ run: {
27
+ run_id: r.run_id,
28
+ workspace: r.workspace,
29
+ agent: r.agent ?? 'claude-code',
30
+ command: r.command ?? '',
31
+ agent_options: body.run.agent_options
32
+ },
33
+ policy
34
+ };
35
+ }
36
+ export function startRunPoller(serverUrl, apiKey, onDispatch, onError) {
37
+ const interval = setInterval(async () => {
38
+ try {
39
+ const result = await fetchPendingRun(serverUrl, apiKey);
40
+ if (result)
41
+ onDispatch(result.run, result.policy);
42
+ }
43
+ catch (err) {
44
+ onError?.(err instanceof Error ? err : new Error(String(err)));
45
+ }
46
+ }, POLL_INTERVAL_MS);
47
+ if (typeof interval === 'object' && 'unref' in interval) {
48
+ interval.unref();
49
+ }
50
+ return () => clearInterval(interval);
51
+ }
52
+ //# sourceMappingURL=poller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poller.js","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAO/B,KAAK,UAAU,eAAe,CAC5B,SAAiB,EACjB,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,mBAAmB,EAAE;QACvD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,GAAG;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,CAAC,GAAG,IAAI,CAAC,GAA6B,CAAC;IAC7C,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE3C,yDAAyD;IACzD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,sBAAsB,CAClC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,EACvG,IAAI,CAAC,SAAmB,EACxB,MAAM,CACP,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAA0B,IAAI,IAAI,CAAC;IAEvD,OAAO;QACL,GAAG,EAAE;YACH,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,aAAa;YAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;YACxB,aAAa,EAAG,IAAI,CAAC,GAA+B,CAAC,aAAoD;SAC1G;QACD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,MAAc,EACd,UAAgE,EAChE,OAA8B;IAE9B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM;gBAAE,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,EAAE,gBAAgB,CAAC,CAAC;IAErB,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;QACvD,QAA2B,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function stopAllPreviews(): void;
2
+ export declare function startPreviewPoller(serverUrl: string, apiKey: string, onError?: (err: Error) => void): () => void;
3
+ //# sourceMappingURL=preview-poller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-poller.d.ts","sourceRoot":"","sources":["../src/preview-poller.ts"],"names":[],"mappings":"AA2gBA,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAC7B,MAAM,IAAI,CA+BZ"}