@esotech/contextuate 2.0.0 → 2.1.1
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.
- package/README.md +169 -1
- package/dist/commands/claude.d.ts +21 -0
- package/dist/commands/claude.js +213 -0
- package/dist/commands/context.d.ts +1 -0
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.js +67 -6
- package/dist/commands/install.d.ts +28 -0
- package/dist/commands/install.js +100 -11
- package/dist/commands/monitor.d.ts +55 -0
- package/dist/commands/monitor.js +1007 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +113 -1
- package/dist/monitor/daemon/circuit-breaker.d.ts +121 -0
- package/dist/monitor/daemon/circuit-breaker.js +552 -0
- package/dist/monitor/daemon/cli.d.ts +8 -0
- package/dist/monitor/daemon/cli.js +82 -0
- package/dist/monitor/daemon/index.d.ts +137 -0
- package/dist/monitor/daemon/index.js +695 -0
- package/dist/monitor/daemon/notifier.d.ts +25 -0
- package/dist/monitor/daemon/notifier.js +98 -0
- package/dist/monitor/daemon/processor.d.ts +89 -0
- package/dist/monitor/daemon/processor.js +455 -0
- package/dist/monitor/daemon/state.d.ts +80 -0
- package/dist/monitor/daemon/state.js +162 -0
- package/dist/monitor/daemon/watcher.d.ts +47 -0
- package/dist/monitor/daemon/watcher.js +171 -0
- package/dist/monitor/daemon/wrapper-manager.d.ts +106 -0
- package/dist/monitor/daemon/wrapper-manager.js +374 -0
- package/dist/monitor/hooks/emit-event.js +652 -0
- package/dist/monitor/persistence/file-store.d.ts +88 -0
- package/dist/monitor/persistence/file-store.js +335 -0
- package/dist/monitor/persistence/index.d.ts +7 -0
- package/dist/monitor/persistence/index.js +10 -0
- package/dist/monitor/server/adapters/redis.d.ts +38 -0
- package/dist/monitor/server/adapters/redis.js +213 -0
- package/dist/monitor/server/adapters/unix-socket.d.ts +33 -0
- package/dist/monitor/server/adapters/unix-socket.js +182 -0
- package/dist/monitor/server/broker.d.ts +135 -0
- package/dist/monitor/server/broker.js +475 -0
- package/dist/monitor/server/cli.d.ts +8 -0
- package/dist/monitor/server/cli.js +98 -0
- package/dist/monitor/server/fastify.d.ts +16 -0
- package/dist/monitor/server/fastify.js +184 -0
- package/dist/monitor/server/index.d.ts +36 -0
- package/dist/monitor/server/index.js +153 -0
- package/dist/monitor/server/websocket.d.ts +80 -0
- package/dist/monitor/server/websocket.js +453 -0
- package/dist/monitor/ui/assets/index-4IssW9On.js +59 -0
- package/dist/monitor/ui/assets/index-vo9hLe5R.css +32 -0
- package/dist/monitor/ui/favicon.png +0 -0
- package/dist/monitor/ui/index.html +14 -0
- package/dist/monitor/ui/logo.png +0 -0
- package/dist/monitor/ui/logo.svg +1 -0
- package/dist/runtime/driver.d.ts +16 -0
- package/dist/runtime/tools.d.ts +10 -0
- package/dist/templates/README.md +33 -7
- package/dist/templates/agents/aegis.md +4 -0
- package/dist/templates/agents/archon.md +13 -22
- package/dist/templates/agents/atlas.md +4 -0
- package/dist/templates/agents/canvas.md +4 -0
- package/dist/templates/agents/chronicle.md +4 -0
- package/dist/templates/agents/chronos.md +4 -0
- package/dist/templates/agents/cipher.md +4 -0
- package/dist/templates/agents/crucible.md +4 -0
- package/dist/templates/agents/echo.md +4 -0
- package/dist/templates/agents/forge.md +4 -0
- package/dist/templates/agents/ledger.md +4 -0
- package/dist/templates/agents/meridian.md +4 -0
- package/dist/templates/agents/nexus.md +4 -0
- package/dist/templates/agents/pythia.md +217 -0
- package/dist/templates/agents/scribe.md +4 -0
- package/dist/templates/agents/sentinel.md +4 -0
- package/dist/templates/agents/{oracle.md → thoth.md} +11 -7
- package/dist/templates/agents/unity.md +4 -0
- package/dist/templates/agents/vox.md +4 -0
- package/dist/templates/agents/weaver.md +4 -0
- package/dist/templates/commands/consult.md +138 -0
- package/dist/templates/commands/orchestrate.md +173 -0
- package/dist/templates/framework-agents/documentation-expert.md +3 -3
- package/dist/templates/framework-agents/tools-expert.md +8 -8
- package/dist/templates/standards/agent-roles.md +68 -21
- package/dist/templates/standards/coding-standards.md +9 -26
- package/dist/templates/templates/context.md +17 -2
- package/dist/templates/templates/contextuate.md +21 -28
- package/dist/templates/tools/{agent-creator.tool.md → agent-creator.md} +3 -3
- package/dist/types/monitor.d.ts +660 -0
- package/dist/types/monitor.js +75 -0
- package/dist/utils/git.d.ts +9 -0
- package/dist/utils/tokens.d.ts +10 -0
- package/package.json +18 -5
- package/dist/templates/version.json +0 -8
- /package/dist/templates/templates/standards/{go.standards.md → go.md} +0 -0
- /package/dist/templates/templates/standards/{java.standards.md → java.md} +0 -0
- /package/dist/templates/templates/standards/{javascript.standards.md → javascript.md} +0 -0
- /package/dist/templates/templates/standards/{php.standards.md → php.md} +0 -0
- /package/dist/templates/templates/standards/{python.standards.md → python.md} +0 -0
- /package/dist/templates/tools/{quickref.tool.md → quickref.md} +0 -0
- /package/dist/templates/tools/{spawn.tool.md → spawn.md} +0 -0
- /package/dist/templates/tools/{standards-detector.tool.md → standards-detector.md} +0 -0
|
@@ -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
|
+
}
|