@esotech/contextuate 2.0.0 → 2.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 (105) hide show
  1. package/README.md +169 -1
  2. package/dist/commands/claude.d.ts +21 -0
  3. package/dist/commands/claude.js +213 -0
  4. package/dist/commands/context.d.ts +1 -0
  5. package/dist/commands/create.d.ts +3 -0
  6. package/dist/commands/index.d.ts +4 -0
  7. package/dist/commands/init.d.ts +7 -0
  8. package/dist/commands/init.js +67 -6
  9. package/dist/commands/install.d.ts +28 -0
  10. package/dist/commands/install.js +116 -11
  11. package/dist/commands/monitor.d.ts +55 -0
  12. package/dist/commands/monitor.js +1007 -0
  13. package/dist/commands/remove.d.ts +3 -0
  14. package/dist/commands/run.d.ts +6 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +113 -1
  17. package/dist/monitor/daemon/circuit-breaker.d.ts +121 -0
  18. package/dist/monitor/daemon/circuit-breaker.js +552 -0
  19. package/dist/monitor/daemon/cli.d.ts +8 -0
  20. package/dist/monitor/daemon/cli.js +82 -0
  21. package/dist/monitor/daemon/index.d.ts +137 -0
  22. package/dist/monitor/daemon/index.js +695 -0
  23. package/dist/monitor/daemon/notifier.d.ts +25 -0
  24. package/dist/monitor/daemon/notifier.js +98 -0
  25. package/dist/monitor/daemon/processor.d.ts +89 -0
  26. package/dist/monitor/daemon/processor.js +455 -0
  27. package/dist/monitor/daemon/state.d.ts +80 -0
  28. package/dist/monitor/daemon/state.js +162 -0
  29. package/dist/monitor/daemon/watcher.d.ts +47 -0
  30. package/dist/monitor/daemon/watcher.js +171 -0
  31. package/dist/monitor/daemon/wrapper-manager.d.ts +106 -0
  32. package/dist/monitor/daemon/wrapper-manager.js +374 -0
  33. package/dist/monitor/hooks/emit-event.js +652 -0
  34. package/dist/monitor/persistence/file-store.d.ts +88 -0
  35. package/dist/monitor/persistence/file-store.js +335 -0
  36. package/dist/monitor/persistence/index.d.ts +7 -0
  37. package/dist/monitor/persistence/index.js +10 -0
  38. package/dist/monitor/server/adapters/redis.d.ts +38 -0
  39. package/dist/monitor/server/adapters/redis.js +213 -0
  40. package/dist/monitor/server/adapters/unix-socket.d.ts +33 -0
  41. package/dist/monitor/server/adapters/unix-socket.js +182 -0
  42. package/dist/monitor/server/broker.d.ts +135 -0
  43. package/dist/monitor/server/broker.js +475 -0
  44. package/dist/monitor/server/cli.d.ts +8 -0
  45. package/dist/monitor/server/cli.js +98 -0
  46. package/dist/monitor/server/fastify.d.ts +16 -0
  47. package/dist/monitor/server/fastify.js +184 -0
  48. package/dist/monitor/server/index.d.ts +36 -0
  49. package/dist/monitor/server/index.js +153 -0
  50. package/dist/monitor/server/websocket.d.ts +80 -0
  51. package/dist/monitor/server/websocket.js +453 -0
  52. package/dist/monitor/ui/assets/index-4IssW9On.js +59 -0
  53. package/dist/monitor/ui/assets/index-vo9hLe5R.css +32 -0
  54. package/dist/monitor/ui/favicon.png +0 -0
  55. package/dist/monitor/ui/index.html +14 -0
  56. package/dist/monitor/ui/logo.png +0 -0
  57. package/dist/monitor/ui/logo.svg +1 -0
  58. package/dist/runtime/driver.d.ts +16 -0
  59. package/dist/runtime/tools.d.ts +10 -0
  60. package/dist/templates/README.md +33 -7
  61. package/dist/templates/agents/aegis.md +4 -0
  62. package/dist/templates/agents/archon.md +13 -22
  63. package/dist/templates/agents/atlas.md +4 -0
  64. package/dist/templates/agents/canvas.md +4 -0
  65. package/dist/templates/agents/chronicle.md +4 -0
  66. package/dist/templates/agents/chronos.md +4 -0
  67. package/dist/templates/agents/cipher.md +4 -0
  68. package/dist/templates/agents/crucible.md +4 -0
  69. package/dist/templates/agents/echo.md +4 -0
  70. package/dist/templates/agents/forge.md +4 -0
  71. package/dist/templates/agents/ledger.md +4 -0
  72. package/dist/templates/agents/meridian.md +4 -0
  73. package/dist/templates/agents/nexus.md +4 -0
  74. package/dist/templates/agents/pythia.md +217 -0
  75. package/dist/templates/agents/scribe.md +4 -0
  76. package/dist/templates/agents/sentinel.md +4 -0
  77. package/dist/templates/agents/{oracle.md → thoth.md} +11 -7
  78. package/dist/templates/agents/unity.md +4 -0
  79. package/dist/templates/agents/vox.md +4 -0
  80. package/dist/templates/agents/weaver.md +4 -0
  81. package/dist/templates/framework-agents/documentation-expert.md +3 -3
  82. package/dist/templates/framework-agents/tools-expert.md +8 -8
  83. package/dist/templates/skills/consult.md +138 -0
  84. package/dist/templates/skills/orchestrate.md +173 -0
  85. package/dist/templates/skills/pythia.md +37 -0
  86. package/dist/templates/standards/agent-roles.md +68 -21
  87. package/dist/templates/standards/coding-standards.md +9 -26
  88. package/dist/templates/templates/context.md +17 -2
  89. package/dist/templates/templates/contextuate.md +21 -28
  90. package/dist/templates/templates/standards/go.md +167 -0
  91. package/dist/templates/templates/standards/java.md +167 -0
  92. package/dist/templates/templates/standards/javascript.md +292 -0
  93. package/dist/templates/templates/standards/php.md +181 -0
  94. package/dist/templates/templates/standards/python.md +175 -0
  95. package/dist/templates/tools/agent-creator.md +252 -0
  96. package/dist/templates/tools/agent-creator.tool.md +2 -2
  97. package/dist/templates/tools/quickref.md +216 -0
  98. package/dist/templates/tools/spawn.md +31 -0
  99. package/dist/templates/tools/standards-detector.md +301 -0
  100. package/dist/templates/version.json +1 -1
  101. package/dist/types/monitor.d.ts +660 -0
  102. package/dist/types/monitor.js +75 -0
  103. package/dist/utils/git.d.ts +9 -0
  104. package/dist/utils/tokens.d.ts +10 -0
  105. package/package.json +18 -5
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Unix Socket Adapter
3
+ *
4
+ * Listens for events from hook scripts via a Unix domain socket.
5
+ * This is the default local mode for single-machine setups.
6
+ */
7
+ import type { IPCAdapter, EventHandler, MonitorEvent } from '../../../types/monitor';
8
+ export interface UnixSocketAdapterOptions {
9
+ socketPath: string;
10
+ }
11
+ export declare class UnixSocketAdapter implements IPCAdapter {
12
+ private server;
13
+ private handlers;
14
+ private running;
15
+ private socketPath;
16
+ constructor(options: UnixSocketAdapterOptions);
17
+ start(): Promise<void>;
18
+ stop(): Promise<void>;
19
+ private cleanup;
20
+ onEvent(handler: EventHandler): void;
21
+ offEvent(handler: EventHandler): void;
22
+ isRunning(): boolean;
23
+ private emitEvent;
24
+ /**
25
+ * Get the socket path for client connections
26
+ */
27
+ getSocketPath(): string;
28
+ }
29
+ /**
30
+ * Create a client to send events to the Unix socket
31
+ * This is used by the hook script
32
+ */
33
+ export declare function sendEventToSocket(socketPath: string, event: MonitorEvent): Promise<void>;
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /**
3
+ * Unix Socket Adapter
4
+ *
5
+ * Listens for events from hook scripts via a Unix domain socket.
6
+ * This is the default local mode for single-machine setups.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.UnixSocketAdapter = void 0;
43
+ exports.sendEventToSocket = sendEventToSocket;
44
+ const net = __importStar(require("net"));
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ class UnixSocketAdapter {
48
+ constructor(options) {
49
+ this.server = null;
50
+ this.handlers = new Set();
51
+ this.running = false;
52
+ this.socketPath = options.socketPath;
53
+ }
54
+ async start() {
55
+ if (this.running) {
56
+ return;
57
+ }
58
+ // Clean up existing socket file if it exists
59
+ await this.cleanup();
60
+ // Ensure directory exists
61
+ const socketDir = path.dirname(this.socketPath);
62
+ if (!fs.existsSync(socketDir)) {
63
+ fs.mkdirSync(socketDir, { recursive: true });
64
+ }
65
+ return new Promise((resolve, reject) => {
66
+ this.server = net.createServer((socket) => {
67
+ let buffer = '';
68
+ socket.on('data', (data) => {
69
+ buffer += data.toString();
70
+ // Process complete JSON messages (newline-delimited)
71
+ const lines = buffer.split('\n');
72
+ buffer = lines.pop() || ''; // Keep incomplete line in buffer
73
+ for (const line of lines) {
74
+ if (line.trim()) {
75
+ try {
76
+ const event = JSON.parse(line);
77
+ this.emitEvent(event);
78
+ }
79
+ catch (err) {
80
+ console.error('[UnixSocket] Failed to parse event:', err);
81
+ }
82
+ }
83
+ }
84
+ });
85
+ socket.on('error', (err) => {
86
+ console.error('[UnixSocket] Socket error:', err);
87
+ });
88
+ });
89
+ this.server.on('error', (err) => {
90
+ console.error('[UnixSocket] Server error:', err);
91
+ reject(err);
92
+ });
93
+ this.server.listen(this.socketPath, () => {
94
+ this.running = true;
95
+ // Set permissions so any user can write to the socket
96
+ fs.chmodSync(this.socketPath, 0o777);
97
+ console.log(`[UnixSocket] Listening on ${this.socketPath}`);
98
+ resolve();
99
+ });
100
+ });
101
+ }
102
+ async stop() {
103
+ if (!this.running) {
104
+ return;
105
+ }
106
+ return new Promise((resolve) => {
107
+ if (this.server) {
108
+ this.server.close(() => {
109
+ this.running = false;
110
+ this.cleanup().then(resolve);
111
+ });
112
+ }
113
+ else {
114
+ resolve();
115
+ }
116
+ });
117
+ }
118
+ async cleanup() {
119
+ try {
120
+ if (fs.existsSync(this.socketPath)) {
121
+ fs.unlinkSync(this.socketPath);
122
+ }
123
+ }
124
+ catch (err) {
125
+ // Ignore cleanup errors
126
+ }
127
+ }
128
+ onEvent(handler) {
129
+ this.handlers.add(handler);
130
+ }
131
+ offEvent(handler) {
132
+ this.handlers.delete(handler);
133
+ }
134
+ isRunning() {
135
+ return this.running;
136
+ }
137
+ emitEvent(event) {
138
+ for (const handler of this.handlers) {
139
+ try {
140
+ const result = handler(event);
141
+ if (result instanceof Promise) {
142
+ result.catch((err) => {
143
+ console.error('[UnixSocket] Event handler error:', err);
144
+ });
145
+ }
146
+ }
147
+ catch (err) {
148
+ console.error('[UnixSocket] Event handler error:', err);
149
+ }
150
+ }
151
+ }
152
+ /**
153
+ * Get the socket path for client connections
154
+ */
155
+ getSocketPath() {
156
+ return this.socketPath;
157
+ }
158
+ }
159
+ exports.UnixSocketAdapter = UnixSocketAdapter;
160
+ /**
161
+ * Create a client to send events to the Unix socket
162
+ * This is used by the hook script
163
+ */
164
+ function sendEventToSocket(socketPath, event) {
165
+ return new Promise((resolve, reject) => {
166
+ const client = net.createConnection(socketPath, () => {
167
+ const data = JSON.stringify(event) + '\n';
168
+ client.write(data, () => {
169
+ client.end();
170
+ resolve();
171
+ });
172
+ });
173
+ client.on('error', (err) => {
174
+ reject(err);
175
+ });
176
+ // Timeout after 5 seconds
177
+ client.setTimeout(5000, () => {
178
+ client.destroy();
179
+ reject(new Error('Connection timeout'));
180
+ });
181
+ });
182
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Event Broker
3
+ *
4
+ * Session management and WebSocket broadcast layer for the 3-layer architecture.
5
+ *
6
+ * Role:
7
+ * - Load sessions from disk on startup
8
+ * - Connect to daemon to receive processed events and session updates
9
+ * - Handle session management actions (rename, pin, hide, delete, set parent)
10
+ * - Broadcast updates to WebSocket clients
11
+ * - Subscribe to Redis for multi-machine UI aggregation (optional)
12
+ *
13
+ * Note: Event processing (correlation, parent linking, etc.) is handled by the daemon.
14
+ */
15
+ import type { MonitorEvent, SessionMeta, PersistenceStore, MonitorConfig } from '../../types/monitor';
16
+ export type BrokerEventType = 'event' | 'session_created' | 'session_updated' | 'session_ended' | 'wrapper_connected' | 'wrapper_disconnected' | 'wrapper_state' | 'wrapper_output' | 'wrapper_spawned' | 'wrappers_list';
17
+ export interface WrapperEventData {
18
+ wrapperId?: string;
19
+ state?: string;
20
+ claudeSessionId?: string;
21
+ exitCode?: number;
22
+ data?: string;
23
+ timestamp?: number;
24
+ success?: boolean;
25
+ error?: string;
26
+ wrappers?: Array<{
27
+ wrapperId: string;
28
+ state: string;
29
+ claudeSessionId: string | null;
30
+ }>;
31
+ }
32
+ export type BrokerHandler = (type: BrokerEventType, data: MonitorEvent | SessionMeta | WrapperEventData) => void | Promise<void>;
33
+ export declare class EventBroker {
34
+ private daemonSocket;
35
+ private persistence;
36
+ private handlers;
37
+ private sessions;
38
+ private config;
39
+ private reconnectTimeout;
40
+ private stopping;
41
+ private connectionAttempts;
42
+ constructor(config: MonitorConfig);
43
+ /**
44
+ * Start the event broker
45
+ */
46
+ start(): Promise<void>;
47
+ /**
48
+ * Stop the event broker
49
+ */
50
+ stop(): Promise<void>;
51
+ /**
52
+ * Connect to daemon socket to receive processed events
53
+ */
54
+ private connectToDaemon;
55
+ /**
56
+ * Schedule reconnection to daemon
57
+ */
58
+ private scheduleDaemonReconnect;
59
+ /**
60
+ * Handle message from daemon
61
+ */
62
+ private handleDaemonMessage;
63
+ /**
64
+ * Send a message to the daemon
65
+ */
66
+ sendToDaemon(message: any): void;
67
+ /**
68
+ * Set the persistence store
69
+ */
70
+ setPersistence(store: PersistenceStore): void;
71
+ /**
72
+ * Register an event handler
73
+ */
74
+ onEvent(handler: BrokerHandler): () => void;
75
+ /**
76
+ * Get all active sessions
77
+ */
78
+ getSessions(includeHidden?: boolean): SessionMeta[];
79
+ /**
80
+ * Get a specific session
81
+ */
82
+ getSession(sessionId: string): SessionMeta | undefined;
83
+ /**
84
+ * Persist session to storage
85
+ */
86
+ private persistSession;
87
+ /**
88
+ * Emit event to all handlers
89
+ */
90
+ private emit;
91
+ /**
92
+ * Load existing sessions from persistence (disk)
93
+ */
94
+ loadSessions(): Promise<void>;
95
+ /**
96
+ * Get configuration
97
+ */
98
+ getConfig(): MonitorConfig;
99
+ /**
100
+ * Hide a session (soft-hide, preserves data)
101
+ */
102
+ hideSession(sessionId: string): Promise<void>;
103
+ /**
104
+ * Unhide a session
105
+ */
106
+ unhideSession(sessionId: string): Promise<void>;
107
+ /**
108
+ * Delete a session (permanent removal)
109
+ */
110
+ deleteSession(sessionId: string): Promise<void>;
111
+ /**
112
+ * Hide all sessions
113
+ */
114
+ hideAllSessions(): Promise<void>;
115
+ /**
116
+ * Delete all sessions
117
+ */
118
+ deleteAllSessions(): Promise<void>;
119
+ /**
120
+ * Manually set parent session (user override for grouping)
121
+ */
122
+ setParentSession(sessionId: string, parentSessionId: string | null): Promise<void>;
123
+ /**
124
+ * Toggle session pinned state
125
+ */
126
+ togglePin(sessionId: string): Promise<void>;
127
+ /**
128
+ * Set whether a session is user-initiated
129
+ */
130
+ setUserInitiated(sessionId: string, isUserInitiated: boolean): Promise<void>;
131
+ /**
132
+ * Rename a session (set custom label)
133
+ */
134
+ renameSession(sessionId: string, label: string): Promise<void>;
135
+ }