zora-agent 0.9.4 → 0.9.6
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/CHANGELOG.md +1 -1
- package/README.md +103 -92
- package/dist/cli/audit-commands.d.ts.map +1 -1
- package/dist/cli/audit-commands.js +3 -1
- package/dist/cli/audit-commands.js.map +1 -1
- package/dist/cli/daemon.js +86 -28
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/edit-commands.d.ts.map +1 -1
- package/dist/cli/edit-commands.js +3 -1
- package/dist/cli/edit-commands.js.map +1 -1
- package/dist/cli/hook-commands.d.ts +9 -0
- package/dist/cli/hook-commands.d.ts.map +1 -0
- package/dist/cli/hook-commands.js +106 -0
- package/dist/cli/hook-commands.js.map +1 -0
- package/dist/cli/index.js +87 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +108 -9
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/memory-commands.d.ts +1 -1
- package/dist/cli/memory-commands.d.ts.map +1 -1
- package/dist/cli/memory-commands.js +213 -1
- package/dist/cli/memory-commands.js.map +1 -1
- package/dist/cli/presets.d.ts.map +1 -1
- package/dist/cli/presets.js +2 -1
- package/dist/cli/presets.js.map +1 -1
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +4 -2
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/steer-commands.d.ts.map +1 -1
- package/dist/cli/steer-commands.js +6 -4
- package/dist/cli/steer-commands.js.map +1 -1
- package/dist/cli/team-commands.d.ts.map +1 -1
- package/dist/cli/team-commands.js +3 -1
- package/dist/cli/team-commands.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +12 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +64 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/config/policy-loader.d.ts +14 -0
- package/dist/config/policy-loader.d.ts.map +1 -1
- package/dist/config/policy-loader.js +33 -0
- package/dist/config/policy-loader.js.map +1 -1
- package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
- package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
- package/dist/dashboard/frontend/dist/index.html +17 -0
- package/dist/dashboard/server.d.ts +19 -2
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +121 -20
- package/dist/dashboard/server.js.map +1 -1
- package/dist/hooks/hook-runner.d.ts +55 -0
- package/dist/hooks/hook-runner.d.ts.map +1 -0
- package/dist/hooks/hook-runner.js +120 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/hooks/hook-types.d.ts +82 -0
- package/dist/hooks/hook-types.d.ts.map +1 -0
- package/dist/hooks/hook-types.js +20 -0
- package/dist/hooks/hook-types.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +108 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +307 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +88 -4
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +299 -7
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/observation-store.d.ts +75 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +162 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/observer-worker.d.ts +34 -0
- package/dist/memory/observer-worker.d.ts.map +1 -0
- package/dist/memory/observer-worker.js +161 -0
- package/dist/memory/observer-worker.js.map +1 -0
- package/dist/memory/reflector-worker.d.ts +40 -0
- package/dist/memory/reflector-worker.d.ts.map +1 -0
- package/dist/memory/reflector-worker.js +185 -0
- package/dist/memory/reflector-worker.js.map +1 -0
- package/dist/memory/salience-scorer.d.ts +16 -6
- package/dist/memory/salience-scorer.d.ts.map +1 -1
- package/dist/memory/salience-scorer.js +42 -22
- package/dist/memory/salience-scorer.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +36 -1
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +207 -8
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/token-estimator.d.ts +31 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +77 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/memory/validation-pipeline.d.ts +37 -0
- package/dist/memory/validation-pipeline.d.ts.map +1 -0
- package/dist/memory/validation-pipeline.js +106 -0
- package/dist/memory/validation-pipeline.js.map +1 -0
- package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
- package/dist/orchestrator/auth-monitor.js +3 -1
- package/dist/orchestrator/auth-monitor.js.map +1 -1
- package/dist/orchestrator/execution-loop.d.ts +23 -0
- package/dist/orchestrator/execution-loop.d.ts.map +1 -1
- package/dist/orchestrator/execution-loop.js +60 -19
- package/dist/orchestrator/execution-loop.js.map +1 -1
- package/dist/orchestrator/failover-controller.d.ts +26 -2
- package/dist/orchestrator/failover-controller.d.ts.map +1 -1
- package/dist/orchestrator/failover-controller.js +143 -23
- package/dist/orchestrator/failover-controller.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +70 -7
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +416 -92
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/retry-queue.d.ts.map +1 -1
- package/dist/orchestrator/retry-queue.js +24 -9
- package/dist/orchestrator/retry-queue.js.map +1 -1
- package/dist/orchestrator/router.d.ts +16 -1
- package/dist/orchestrator/router.d.ts.map +1 -1
- package/dist/orchestrator/router.js +79 -20
- package/dist/orchestrator/router.js.map +1 -1
- package/dist/orchestrator/session-manager.d.ts +26 -1
- package/dist/orchestrator/session-manager.d.ts.map +1 -1
- package/dist/orchestrator/session-manager.js +88 -4
- package/dist/orchestrator/session-manager.js.map +1 -1
- package/dist/providers/circuit-breaker.d.ts +78 -0
- package/dist/providers/circuit-breaker.d.ts.map +1 -0
- package/dist/providers/circuit-breaker.js +129 -0
- package/dist/providers/circuit-breaker.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +27 -11
- package/dist/providers/claude-provider.d.ts.map +1 -1
- package/dist/providers/claude-provider.js +161 -46
- package/dist/providers/claude-provider.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +9 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +97 -48
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts +7 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +89 -18
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/routines/heartbeat.d.ts +10 -2
- package/dist/routines/heartbeat.d.ts.map +1 -1
- package/dist/routines/heartbeat.js +42 -5
- package/dist/routines/heartbeat.js.map +1 -1
- package/dist/routines/routine-manager.d.ts.map +1 -1
- package/dist/routines/routine-manager.js +22 -15
- package/dist/routines/routine-manager.js.map +1 -1
- package/dist/security/audit-logger.d.ts.map +1 -1
- package/dist/security/audit-logger.js +5 -7
- package/dist/security/audit-logger.js.map +1 -1
- package/dist/security/policy-engine.d.ts +28 -17
- package/dist/security/policy-engine.d.ts.map +1 -1
- package/dist/security/policy-engine.js +42 -185
- package/dist/security/policy-engine.js.map +1 -1
- package/dist/security/policy-serializer.d.ts +19 -0
- package/dist/security/policy-serializer.d.ts.map +1 -0
- package/dist/security/policy-serializer.js +100 -0
- package/dist/security/policy-serializer.js.map +1 -0
- package/dist/security/shell-validator.d.ts +42 -0
- package/dist/security/shell-validator.d.ts.map +1 -0
- package/dist/security/shell-validator.js +231 -0
- package/dist/security/shell-validator.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-loader.d.ts +38 -2
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +83 -2
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/subagent-loader.d.ts +66 -0
- package/dist/skills/subagent-loader.d.ts.map +1 -0
- package/dist/skills/subagent-loader.js +143 -0
- package/dist/skills/subagent-loader.js.map +1 -0
- package/dist/steering/flag-manager.d.ts +20 -0
- package/dist/steering/flag-manager.d.ts.map +1 -1
- package/dist/steering/flag-manager.js +94 -11
- package/dist/steering/flag-manager.js.map +1 -1
- package/dist/steering/steering-manager.d.ts +11 -0
- package/dist/steering/steering-manager.d.ts.map +1 -1
- package/dist/steering/steering-manager.js +23 -0
- package/dist/steering/steering-manager.js.map +1 -1
- package/dist/steering/telegram-gateway.d.ts +4 -1
- package/dist/steering/telegram-gateway.d.ts.map +1 -1
- package/dist/steering/telegram-gateway.js +49 -10
- package/dist/steering/telegram-gateway.js.map +1 -1
- package/dist/teams/bridge-watchdog.d.ts.map +1 -1
- package/dist/teams/bridge-watchdog.js +5 -3
- package/dist/teams/bridge-watchdog.js.map +1 -1
- package/dist/teams/gemini-bridge.d.ts.map +1 -1
- package/dist/teams/gemini-bridge.js +9 -4
- package/dist/teams/gemini-bridge.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +16 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +207 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +3 -1
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/tool-factory.d.ts +36 -0
- package/dist/tools/tool-factory.d.ts.map +1 -0
- package/dist/tools/tool-factory.js +55 -0
- package/dist/tools/tool-factory.js.map +1 -0
- package/dist/types.d.ts +205 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +29 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-filter.d.ts +25 -0
- package/dist/utils/event-filter.d.ts.map +1 -0
- package/dist/utils/event-filter.js +61 -0
- package/dist/utils/event-filter.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -36
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -130
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validate-job-id.d.ts +6 -0
- package/dist/utils/validate-job-id.d.ts.map +1 -0
- package/dist/utils/validate-job-id.js +10 -0
- package/dist/utils/validate-job-id.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" class="bg-zora-obsidian">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>Zora — Tactical Interface</title>
|
|
8
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
9
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans+Condensed:wght@400;600;700&display=swap" rel="stylesheet">
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-D41hcjgc.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DAODjoxu.css">
|
|
13
|
+
</head>
|
|
14
|
+
<body class="text-white selection:bg-zora-amber selection:text-black">
|
|
15
|
+
<div id="root"></div>
|
|
16
|
+
</body>
|
|
17
|
+
</html>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* DashboardServer — Local API and static file server for the Zora UI.
|
|
3
3
|
*
|
|
4
4
|
* Spec §6.0 "Web Dashboard Spec":
|
|
5
|
-
* - Binds to localhost:
|
|
5
|
+
* - Binds to localhost:8070 by default.
|
|
6
6
|
* - Serves as the primary ingress for async steering.
|
|
7
7
|
*/
|
|
8
8
|
import type { ExecutionLoop } from '../orchestrator/execution-loop.js';
|
|
@@ -22,22 +22,39 @@ export interface DashboardOptions {
|
|
|
22
22
|
submitTask?: SubmitTaskFn;
|
|
23
23
|
port?: number;
|
|
24
24
|
host?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Bearer token for dashboard API authentication.
|
|
27
|
+
* When set, all API routes (except /api/health) require
|
|
28
|
+
* Authorization: Bearer <token>. When unset, auth is
|
|
29
|
+
* skipped (localhost-only use case).
|
|
30
|
+
*/
|
|
31
|
+
dashboardToken?: string;
|
|
25
32
|
}
|
|
26
33
|
export declare class DashboardServer {
|
|
27
34
|
private readonly _app;
|
|
28
35
|
private readonly _options;
|
|
29
36
|
private _server;
|
|
37
|
+
/** TYPE-12: Map SSE clients to their verbosity level */
|
|
30
38
|
private readonly _sseClients;
|
|
31
39
|
constructor(options: DashboardOptions);
|
|
32
40
|
/**
|
|
33
41
|
* Simple in-memory rate limiter (no external dependency).
|
|
34
|
-
* Limits to
|
|
42
|
+
* Limits to 500 API requests per 15 minutes per IP.
|
|
35
43
|
* Prunes expired entries periodically to prevent unbounded memory growth.
|
|
36
44
|
*/
|
|
37
45
|
private _createRateLimiter;
|
|
38
46
|
private _setupRoutes;
|
|
39
47
|
/**
|
|
40
48
|
* Broadcast an event to all connected SSE clients.
|
|
49
|
+
*
|
|
50
|
+
* Per the SSE spec, each line in a multi-line `data:` field is sent as a
|
|
51
|
+
* separate `data:` prefixed line. JSON.stringify escapes control characters
|
|
52
|
+
* but if the serialised string somehow contains literal newlines (e.g. from
|
|
53
|
+
* pre-stringified content embedded in the event) the EventSource parser
|
|
54
|
+
* would split them, breaking JSON.parse on the client. We guard against
|
|
55
|
+
* this by splitting on newlines and emitting each as its own `data:` line —
|
|
56
|
+
* the browser's EventSource will concatenate them with `\n` before handing
|
|
57
|
+
* the reassembled string to the `onmessage` handler.
|
|
41
58
|
*/
|
|
42
59
|
broadcastEvent(event: {
|
|
43
60
|
type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AAgBtE,MAAM,WAAW,YAAY;IAC3B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAqB;IACpC,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmD;gBAEnE,OAAO,EAAE,gBAAgB;IA6BrC;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,YAAY;IAyNpB;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA2B5D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAgB5B"}
|
package/dist/dashboard/server.js
CHANGED
|
@@ -2,25 +2,47 @@
|
|
|
2
2
|
* DashboardServer — Local API and static file server for the Zora UI.
|
|
3
3
|
*
|
|
4
4
|
* Spec §6.0 "Web Dashboard Spec":
|
|
5
|
-
* - Binds to localhost:
|
|
5
|
+
* - Binds to localhost:8070 by default.
|
|
6
6
|
* - Serves as the primary ingress for async steering.
|
|
7
7
|
*/
|
|
8
8
|
import express from 'express';
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { createAuthMiddleware } from './auth-middleware.js';
|
|
12
|
+
import { createLogger } from '../utils/logger.js';
|
|
13
|
+
import { shouldIncludeEvent } from '../utils/event-filter.js';
|
|
14
|
+
const log = createLogger('dashboard');
|
|
11
15
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
/**
|
|
17
|
+
* Quota threshold for marking a provider as degraded.
|
|
18
|
+
* Providers with healthScore below this value are considered DEGRADED.
|
|
19
|
+
*/
|
|
20
|
+
const DEGRADED_QUOTA_THRESHOLD = 0.5;
|
|
12
21
|
export class DashboardServer {
|
|
13
22
|
_app;
|
|
14
23
|
_options;
|
|
15
24
|
_server;
|
|
16
|
-
|
|
25
|
+
/** TYPE-12: Map SSE clients to their verbosity level */
|
|
26
|
+
_sseClients = new Map();
|
|
17
27
|
constructor(options) {
|
|
18
28
|
this._options = options;
|
|
19
29
|
this._app = express();
|
|
20
30
|
// R22: Explicit body size limits
|
|
21
31
|
this._app.use(express.json({ limit: '1mb' }));
|
|
22
|
-
// R21: Rate limiting — 100 requests per 15 minutes per IP
|
|
23
|
-
|
|
32
|
+
// R21: Rate limiting — 100 requests per 15 minutes per IP (API routes only).
|
|
33
|
+
// Static assets are not rate-limited since they're served from localhost.
|
|
34
|
+
this._app.use('/api', this._createRateLimiter());
|
|
35
|
+
// SEC-01: Mount Bearer token auth on API routes when a token is configured.
|
|
36
|
+
// When no dashboardToken is set, auth is skipped entirely — this covers
|
|
37
|
+
// the localhost-only use case where the dashboard is not exposed externally.
|
|
38
|
+
const token = options.dashboardToken ?? process.env['ZORA_DASHBOARD_TOKEN'];
|
|
39
|
+
if (token) {
|
|
40
|
+
this._app.use('/api', createAuthMiddleware({ staticToken: token }));
|
|
41
|
+
log.info('Dashboard API authentication enabled');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
log.warn('Dashboard API authentication disabled — no dashboardToken configured');
|
|
45
|
+
}
|
|
24
46
|
// Serve static frontend files (Vite build output)
|
|
25
47
|
const staticPath = path.join(__dirname, 'frontend', 'dist');
|
|
26
48
|
this._app.use(express.static(staticPath));
|
|
@@ -28,12 +50,12 @@ export class DashboardServer {
|
|
|
28
50
|
}
|
|
29
51
|
/**
|
|
30
52
|
* Simple in-memory rate limiter (no external dependency).
|
|
31
|
-
* Limits to
|
|
53
|
+
* Limits to 500 API requests per 15 minutes per IP.
|
|
32
54
|
* Prunes expired entries periodically to prevent unbounded memory growth.
|
|
33
55
|
*/
|
|
34
56
|
_createRateLimiter() {
|
|
35
57
|
const windowMs = 15 * 60 * 1000;
|
|
36
|
-
const maxRequests =
|
|
58
|
+
const maxRequests = 500;
|
|
37
59
|
const clients = new Map();
|
|
38
60
|
let lastCleanup = Date.now();
|
|
39
61
|
return (req, res, next) => {
|
|
@@ -64,21 +86,75 @@ export class DashboardServer {
|
|
|
64
86
|
_setupRoutes() {
|
|
65
87
|
const { steeringManager, authMonitor, sessionManager } = this._options;
|
|
66
88
|
// --- System APIs ---
|
|
67
|
-
/** GET /api/health —
|
|
89
|
+
/** GET /api/health — LOG-03: Comprehensive health check with provider status, system metrics */
|
|
68
90
|
this._app.get('/api/health', async (_req, res) => {
|
|
69
91
|
try {
|
|
92
|
+
const providers = this._options.providers ?? [];
|
|
70
93
|
const authStatus = await authMonitor.checkAll();
|
|
94
|
+
// Build per-provider health info
|
|
95
|
+
const providerHealth = await Promise.all(providers.map(async (p) => {
|
|
96
|
+
const auth = authStatus.get(p.name) ?? { valid: false, expiresAt: null, canAutoRefresh: false, requiresInteraction: true };
|
|
97
|
+
let quota;
|
|
98
|
+
try {
|
|
99
|
+
quota = await p.getQuotaStatus();
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
quota = { isExhausted: false, remainingRequests: null, cooldownUntil: null, healthScore: 0 };
|
|
103
|
+
}
|
|
104
|
+
// Determine per-provider status
|
|
105
|
+
let status = 'OK';
|
|
106
|
+
if (!auth.valid)
|
|
107
|
+
status = 'DOWN';
|
|
108
|
+
else if (quota.isExhausted || quota.healthScore < DEGRADED_QUOTA_THRESHOLD)
|
|
109
|
+
status = 'DEGRADED';
|
|
110
|
+
return {
|
|
111
|
+
name: p.name,
|
|
112
|
+
status,
|
|
113
|
+
// Back-compat: expose auth fields at top level for existing consumers
|
|
114
|
+
valid: auth.valid,
|
|
115
|
+
expiresAt: auth.expiresAt?.toISOString() ?? null,
|
|
116
|
+
canAutoRefresh: auth.canAutoRefresh,
|
|
117
|
+
auth: {
|
|
118
|
+
valid: auth.valid,
|
|
119
|
+
expiresAt: auth.expiresAt?.toISOString() ?? null,
|
|
120
|
+
canAutoRefresh: auth.canAutoRefresh,
|
|
121
|
+
},
|
|
122
|
+
quota: {
|
|
123
|
+
isExhausted: quota.isExhausted,
|
|
124
|
+
remainingRequests: quota.remainingRequests,
|
|
125
|
+
healthScore: quota.healthScore,
|
|
126
|
+
},
|
|
127
|
+
costTier: p.costTier,
|
|
128
|
+
};
|
|
129
|
+
}));
|
|
130
|
+
// Overall system status: CRITICAL if all down, DEGRADED if any down, OK otherwise
|
|
131
|
+
const downCount = providerHealth.filter(p => p.status === 'DOWN').length;
|
|
132
|
+
const degradedCount = providerHealth.filter(p => p.status === 'DEGRADED').length;
|
|
133
|
+
let overallStatus = 'OK';
|
|
134
|
+
if (providers.length > 0 && downCount === providers.length)
|
|
135
|
+
overallStatus = 'CRITICAL';
|
|
136
|
+
else if (downCount > 0 || degradedCount > 0)
|
|
137
|
+
overallStatus = 'DEGRADED';
|
|
138
|
+
const mem = process.memoryUsage();
|
|
71
139
|
res.json({
|
|
72
|
-
ok:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
140
|
+
ok: overallStatus !== 'CRITICAL',
|
|
141
|
+
status: overallStatus,
|
|
142
|
+
timestamp: new Date().toISOString(),
|
|
143
|
+
providers: providerHealth,
|
|
144
|
+
system: {
|
|
145
|
+
uptime: Math.floor(process.uptime()),
|
|
146
|
+
memoryUsage: {
|
|
147
|
+
heapUsedMB: Math.round(mem.heapUsed / (1024 * 1024)),
|
|
148
|
+
heapTotalMB: Math.round(mem.heapTotal / (1024 * 1024)),
|
|
149
|
+
rssMB: Math.round(mem.rss / (1024 * 1024)),
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
sseClients: this._sseClients.size,
|
|
77
153
|
});
|
|
78
154
|
}
|
|
79
155
|
catch (err) {
|
|
80
156
|
const message = err instanceof Error ? err.message : String(err);
|
|
81
|
-
res.status(500).json({ ok: false, error: message });
|
|
157
|
+
res.status(500).json({ ok: false, status: 'CRITICAL', error: message });
|
|
82
158
|
}
|
|
83
159
|
});
|
|
84
160
|
/** GET /api/quota — Provider quota, usage, and cost snapshots */
|
|
@@ -174,8 +250,12 @@ export class DashboardServer {
|
|
|
174
250
|
}
|
|
175
251
|
});
|
|
176
252
|
// --- R17: SSE endpoint for real-time job updates ---
|
|
177
|
-
/** GET /api/events — Server-Sent Events stream for live job status
|
|
253
|
+
/** GET /api/events — Server-Sent Events stream for live job status
|
|
254
|
+
* TYPE-12: Accepts ?verbosity=terse|normal|verbose (default: normal) */
|
|
178
255
|
this._app.get('/api/events', (req, res) => {
|
|
256
|
+
const verbosity = (['terse', 'normal', 'verbose'].includes(req.query.verbosity)
|
|
257
|
+
? req.query.verbosity
|
|
258
|
+
: 'normal');
|
|
179
259
|
res.writeHead(200, {
|
|
180
260
|
'Content-Type': 'text/event-stream',
|
|
181
261
|
'Cache-Control': 'no-cache',
|
|
@@ -183,7 +263,7 @@ export class DashboardServer {
|
|
|
183
263
|
'X-Accel-Buffering': 'no',
|
|
184
264
|
});
|
|
185
265
|
res.write('data: {"type":"connected"}\n\n');
|
|
186
|
-
this._sseClients.
|
|
266
|
+
this._sseClients.set(res, verbosity);
|
|
187
267
|
// Keep-alive comment every 30s to prevent proxy/firewall timeouts
|
|
188
268
|
const keepAlive = setInterval(() => {
|
|
189
269
|
res.write(': keepalive\n\n');
|
|
@@ -200,10 +280,31 @@ export class DashboardServer {
|
|
|
200
280
|
}
|
|
201
281
|
/**
|
|
202
282
|
* Broadcast an event to all connected SSE clients.
|
|
283
|
+
*
|
|
284
|
+
* Per the SSE spec, each line in a multi-line `data:` field is sent as a
|
|
285
|
+
* separate `data:` prefixed line. JSON.stringify escapes control characters
|
|
286
|
+
* but if the serialised string somehow contains literal newlines (e.g. from
|
|
287
|
+
* pre-stringified content embedded in the event) the EventSource parser
|
|
288
|
+
* would split them, breaking JSON.parse on the client. We guard against
|
|
289
|
+
* this by splitting on newlines and emitting each as its own `data:` line —
|
|
290
|
+
* the browser's EventSource will concatenate them with `\n` before handing
|
|
291
|
+
* the reassembled string to the `onmessage` handler.
|
|
203
292
|
*/
|
|
204
293
|
broadcastEvent(event) {
|
|
205
|
-
const
|
|
206
|
-
|
|
294
|
+
const json = JSON.stringify(event);
|
|
295
|
+
// Split on any literal newline that might have survived serialisation
|
|
296
|
+
const lines = json.split(/\r?\n/);
|
|
297
|
+
const payload = lines.map(l => `data: ${l}`).join('\n') + '\n\n';
|
|
298
|
+
for (const [client, verbosity] of this._sseClients) {
|
|
299
|
+
// TYPE-12: Filter events based on client's verbosity level.
|
|
300
|
+
// If the event data looks like an AgentEvent (has a type field that
|
|
301
|
+
// matches AgentEventType), apply verbosity filtering.
|
|
302
|
+
const eventData = event.data;
|
|
303
|
+
if (eventData && typeof eventData === 'object' && 'type' in eventData && 'timestamp' in eventData) {
|
|
304
|
+
if (!shouldIncludeEvent(eventData, verbosity)) {
|
|
305
|
+
continue; // Skip this event for this client
|
|
306
|
+
}
|
|
307
|
+
}
|
|
207
308
|
try {
|
|
208
309
|
client.write(payload);
|
|
209
310
|
}
|
|
@@ -221,11 +322,11 @@ export class DashboardServer {
|
|
|
221
322
|
* Starts the dashboard server on localhost.
|
|
222
323
|
*/
|
|
223
324
|
async start() {
|
|
224
|
-
const port = this._options.port ??
|
|
325
|
+
const port = this._options.port ?? 8070;
|
|
225
326
|
const host = this._options.host ?? '127.0.0.1';
|
|
226
327
|
return new Promise((resolve) => {
|
|
227
328
|
this._server = this._app.listen(port, host, () => {
|
|
228
|
-
|
|
329
|
+
log.info({ host, port }, 'Zora Tactical Interface active');
|
|
229
330
|
resolve();
|
|
230
331
|
});
|
|
231
332
|
});
|
|
@@ -235,7 +336,7 @@ export class DashboardServer {
|
|
|
235
336
|
*/
|
|
236
337
|
async stop() {
|
|
237
338
|
// Close all SSE connections
|
|
238
|
-
for (const client of this._sseClients) {
|
|
339
|
+
for (const [client] of this._sseClients) {
|
|
239
340
|
client.end();
|
|
240
341
|
}
|
|
241
342
|
this._sseClients.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AASzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAiB/D,MAAM,OAAO,eAAe;IACT,IAAI,CAAsB;IAC1B,QAAQ,CAAmB;IACpC,OAAO,CAAqB;IACnB,WAAW,GAAyB,IAAI,GAAG,EAAE,CAAC;IAE/D,YAAY,OAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;QAEtB,iCAAiC;QACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAE9C,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAEzC,kDAAkD;QAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAE1C,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACK,kBAAkB;QACxB,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChC,MAAM,WAAW,GAAG,GAAG,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8C,CAAC;QACtE,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACxB,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;YAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAEvB,wCAAwC;YACxC,IAAI,GAAG,GAAG,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;gBACtC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC;oBACjC,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG;wBAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9C,CAAC;gBACD,WAAW,GAAG,GAAG,CAAC;YACpB,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAE/B,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC;gBACvD,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;gBAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC,CAAC;IACJ,CAAC;IAEO,YAAY;QAClB,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEvE,sBAAsB;QAEtB,iDAAiD;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC/C,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAChD,GAAG,CAAC,IAAI,CAAC;oBACP,EAAE,EAAE,IAAI;oBACR,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;wBACnE,IAAI;wBACJ,GAAG,MAAM;qBACV,CAAC,CAAC;iBACJ,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,iEAAiE;QACjE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAChD,MAAM,SAAS,GAA4B,MAAM,OAAO,CAAC,GAAG,CAC1D,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE;oBACnH,KAAK,EAAE,MAAM,CAAC,CAAC,cAAc,EAAE;oBAC/B,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC,CACJ,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,8EAA8E;QAC9E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC7C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;gBACrD,GAAG,CAAC,IAAI,CAAC;oBACP,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACvB,KAAK,EAAE,CAAC,CAAC,KAAK;wBACd,UAAU,EAAE,CAAC,CAAC,UAAU;wBACxB,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,IAAI;wBACnD,MAAM,EAAE,CAAC,CAAC,MAAM;qBACjB,CAAC,CAAC;iBACJ,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,6EAA6E;QAC7E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACzC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC;gBACP,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,EAAE;oBACN,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;oBAC9C,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;iBACjD;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,0BAA0B;QAE1B,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAE5B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC9C,kFAAkF;gBAClF,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB;QAExB,kDAAkD;QAClD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAEpD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACjG,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC;YACnG,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,eAAe,CAAC,aAAa,CAAC;oBAClC,IAAI,EAAE,OAAO;oBACb,KAAK;oBACL,OAAO;oBACP,MAAM,EAAE,MAAM,IAAI,UAAU;oBAC5B,MAAM,EAAE,MAAM,IAAI,WAAW;oBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB,CAAC,CAAC;gBACH,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,sDAAsD;QAEtD,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,YAAY;gBAC1B,mBAAmB,EAAE,IAAI;aAC1B,CAAC,CAAC;YAEH,GAAG,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE1B,kEAAkE;YAClE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;gBACjC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC/B,CAAC,EAAE,MAAM,CAAC,CAAC;YAEX,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACnB,aAAa,CAAC,SAAS,CAAC,CAAC;gBACzB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC/B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAsC;QACnD,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;QACrD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;gBAC5C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAChC,IAAI,CAAC;oBAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;QAC/C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBAC/C,OAAO,CAAC,GAAG,CAAC,wDAAwD,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;gBACpF,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,4BAA4B;QAC5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC1B,IAAI,GAAG;wBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;wBAChB,OAAO,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HookRunner — ORCH-12
|
|
3
|
+
*
|
|
4
|
+
* Executes registered lifecycle hooks in registration order.
|
|
5
|
+
* Accumulates modifications from onTaskStart/afterToolExecute.
|
|
6
|
+
* Short-circuits on beforeToolExecute when allow=false.
|
|
7
|
+
*/
|
|
8
|
+
import type { TaskContext } from '../types.js';
|
|
9
|
+
import type { HookEventName, OnTaskStartHook, BeforeToolExecuteHook, AfterToolExecuteHook, OnTaskEndHook, BeforeToolResult, OnTaskEndResult } from './hook-types.js';
|
|
10
|
+
export declare class HookRunner {
|
|
11
|
+
private readonly _hooks;
|
|
12
|
+
/**
|
|
13
|
+
* Register a hook for a specific lifecycle event.
|
|
14
|
+
*/
|
|
15
|
+
on(event: 'onTaskStart', handler: OnTaskStartHook): void;
|
|
16
|
+
on(event: 'beforeToolExecute', handler: BeforeToolExecuteHook): void;
|
|
17
|
+
on(event: 'afterToolExecute', handler: AfterToolExecuteHook): void;
|
|
18
|
+
on(event: 'onTaskEnd', handler: OnTaskEndHook): void;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the number of registered hooks for a given event.
|
|
21
|
+
*/
|
|
22
|
+
count(event: HookEventName): number;
|
|
23
|
+
/**
|
|
24
|
+
* Returns all registered hook event names that have at least one handler.
|
|
25
|
+
*/
|
|
26
|
+
activeEvents(): HookEventName[];
|
|
27
|
+
/**
|
|
28
|
+
* Lists all registered hooks with their event name and handler count.
|
|
29
|
+
*/
|
|
30
|
+
listHooks(): Array<{
|
|
31
|
+
event: HookEventName;
|
|
32
|
+
count: number;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Run all onTaskStart hooks in order, accumulating context modifications.
|
|
36
|
+
* Each hook receives the output of the previous one.
|
|
37
|
+
*/
|
|
38
|
+
runOnTaskStart(ctx: TaskContext): Promise<TaskContext>;
|
|
39
|
+
/**
|
|
40
|
+
* Run all beforeToolExecute hooks in order.
|
|
41
|
+
* Short-circuits on the first hook that returns allow=false.
|
|
42
|
+
* Accumulates argument modifications across hooks.
|
|
43
|
+
*/
|
|
44
|
+
runBeforeToolExecute(toolName: string, args: Record<string, unknown>): Promise<BeforeToolResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Run all afterToolExecute hooks in order, piping the result through each.
|
|
47
|
+
*/
|
|
48
|
+
runAfterToolExecute(toolName: string, result: unknown): Promise<unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Run all onTaskEnd hooks in order.
|
|
51
|
+
* Returns the first follow-up prompt if any hook provides one.
|
|
52
|
+
*/
|
|
53
|
+
runOnTaskEnd(ctx: TaskContext, result: string): Promise<OnTaskEndResult>;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=hook-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-runner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAIzB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAKrB;IAEF;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IACxD,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,qBAAqB,GAAG,IAAI;IACpE,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAClE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAOpD;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM;IAInC;;OAEG;IACH,YAAY,IAAI,aAAa,EAAE;IAM/B;;OAEG;IACH,SAAS,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAO3D;;;OAGG;IACG,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAa5D;;;;OAIG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC;IAoB5B;;OAEG;IACG,mBAAmB,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,CAAC;IAanB;;;OAGG;IACG,YAAY,CAChB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC;CAa5B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HookRunner — ORCH-12
|
|
3
|
+
*
|
|
4
|
+
* Executes registered lifecycle hooks in registration order.
|
|
5
|
+
* Accumulates modifications from onTaskStart/afterToolExecute.
|
|
6
|
+
* Short-circuits on beforeToolExecute when allow=false.
|
|
7
|
+
*/
|
|
8
|
+
import { createLogger } from '../utils/logger.js';
|
|
9
|
+
const log = createLogger('hook-runner');
|
|
10
|
+
export class HookRunner {
|
|
11
|
+
_hooks = {
|
|
12
|
+
onTaskStart: [],
|
|
13
|
+
beforeToolExecute: [],
|
|
14
|
+
afterToolExecute: [],
|
|
15
|
+
onTaskEnd: [],
|
|
16
|
+
};
|
|
17
|
+
on(event, handler) {
|
|
18
|
+
const arr = this._hooks[event];
|
|
19
|
+
arr.push(handler);
|
|
20
|
+
log.debug({ event, count: arr.length }, 'Hook registered');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns the number of registered hooks for a given event.
|
|
24
|
+
*/
|
|
25
|
+
count(event) {
|
|
26
|
+
return this._hooks[event].length;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns all registered hook event names that have at least one handler.
|
|
30
|
+
*/
|
|
31
|
+
activeEvents() {
|
|
32
|
+
return Object.keys(this._hooks).filter((event) => this._hooks[event].length > 0);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Lists all registered hooks with their event name and handler count.
|
|
36
|
+
*/
|
|
37
|
+
listHooks() {
|
|
38
|
+
return Object.keys(this._hooks).map((event) => ({
|
|
39
|
+
event,
|
|
40
|
+
count: this._hooks[event].length,
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run all onTaskStart hooks in order, accumulating context modifications.
|
|
45
|
+
* Each hook receives the output of the previous one.
|
|
46
|
+
*/
|
|
47
|
+
async runOnTaskStart(ctx) {
|
|
48
|
+
let current = ctx;
|
|
49
|
+
for (const hook of this._hooks.onTaskStart) {
|
|
50
|
+
try {
|
|
51
|
+
current = await hook(current);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
log.error({ err, event: 'onTaskStart' }, 'Hook threw an error');
|
|
55
|
+
// Continue with current context — hooks should not crash the pipeline
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return current;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Run all beforeToolExecute hooks in order.
|
|
62
|
+
* Short-circuits on the first hook that returns allow=false.
|
|
63
|
+
* Accumulates argument modifications across hooks.
|
|
64
|
+
*/
|
|
65
|
+
async runBeforeToolExecute(toolName, args) {
|
|
66
|
+
let currentArgs = args;
|
|
67
|
+
for (const hook of this._hooks.beforeToolExecute) {
|
|
68
|
+
try {
|
|
69
|
+
const result = await hook(toolName, currentArgs);
|
|
70
|
+
if (!result.allow) {
|
|
71
|
+
log.info({ tool: toolName, message: result.message }, 'Tool blocked by beforeToolExecute hook');
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
if (result.args) {
|
|
75
|
+
currentArgs = result.args;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
log.error({ err, event: 'beforeToolExecute', tool: toolName }, 'Hook threw an error');
|
|
80
|
+
// Continue — do not block on hook errors
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { allow: true, args: currentArgs };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run all afterToolExecute hooks in order, piping the result through each.
|
|
87
|
+
*/
|
|
88
|
+
async runAfterToolExecute(toolName, result) {
|
|
89
|
+
let current = result;
|
|
90
|
+
for (const hook of this._hooks.afterToolExecute) {
|
|
91
|
+
try {
|
|
92
|
+
current = await hook(toolName, current);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
log.error({ err, event: 'afterToolExecute', tool: toolName }, 'Hook threw an error');
|
|
96
|
+
// Continue with current result
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return current;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Run all onTaskEnd hooks in order.
|
|
103
|
+
* Returns the first follow-up prompt if any hook provides one.
|
|
104
|
+
*/
|
|
105
|
+
async runOnTaskEnd(ctx, result) {
|
|
106
|
+
for (const hook of this._hooks.onTaskEnd) {
|
|
107
|
+
try {
|
|
108
|
+
const hookResult = await hook(ctx, result);
|
|
109
|
+
if (hookResult?.followUp) {
|
|
110
|
+
return hookResult;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
log.error({ err, event: 'onTaskEnd' }, 'Hook threw an error');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=hook-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-runner.js","sourceRoot":"","sources":["../../src/hooks/hook-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle Hook Types — ORCH-12
|
|
3
|
+
*
|
|
4
|
+
* Defines the typed hook interfaces for Zora's lifecycle hook system.
|
|
5
|
+
* Hooks intercept the orchestration pipeline at key stages:
|
|
6
|
+
* - onTaskStart: before routing (modify task context)
|
|
7
|
+
* - beforeToolExecute: before tool call (can block)
|
|
8
|
+
* - afterToolExecute: after tool call (can modify result)
|
|
9
|
+
* - onTaskEnd: after completion (can inject follow-up)
|
|
10
|
+
*/
|
|
11
|
+
import type { TaskContext } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Hook invoked before task routing. Can modify the TaskContext
|
|
14
|
+
* (e.g., inject system prompt additions, change capabilities).
|
|
15
|
+
*/
|
|
16
|
+
export interface OnTaskStartHook {
|
|
17
|
+
(ctx: TaskContext): Promise<TaskContext>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result from a beforeToolExecute hook.
|
|
21
|
+
* - allow=true: continue execution (optionally with modified args)
|
|
22
|
+
* - allow=false: block the tool call (message explains why)
|
|
23
|
+
*/
|
|
24
|
+
export interface BeforeToolResult {
|
|
25
|
+
allow: boolean;
|
|
26
|
+
args?: Record<string, unknown>;
|
|
27
|
+
message?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook invoked before each tool execution.
|
|
31
|
+
* Can block the call or modify its arguments.
|
|
32
|
+
*/
|
|
33
|
+
export interface BeforeToolExecuteHook {
|
|
34
|
+
(toolName: string, args: Record<string, unknown>): Promise<BeforeToolResult>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Hook invoked after each tool execution.
|
|
38
|
+
* Can modify the tool result before it's returned to the LLM.
|
|
39
|
+
*/
|
|
40
|
+
export interface AfterToolExecuteHook {
|
|
41
|
+
(toolName: string, result: unknown): Promise<unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Result from an onTaskEnd hook.
|
|
45
|
+
* If followUp is set, the orchestrator re-submits that prompt.
|
|
46
|
+
*/
|
|
47
|
+
export interface OnTaskEndResult {
|
|
48
|
+
followUp?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Hook invoked after task completion.
|
|
52
|
+
* Can inspect the result and optionally trigger a follow-up task.
|
|
53
|
+
*/
|
|
54
|
+
export interface OnTaskEndHook {
|
|
55
|
+
(ctx: TaskContext, result: string): Promise<OnTaskEndResult | void>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The four lifecycle hook points available in Zora.
|
|
59
|
+
*/
|
|
60
|
+
export interface ZoraHooks {
|
|
61
|
+
onTaskStart: OnTaskStartHook[];
|
|
62
|
+
beforeToolExecute: BeforeToolExecuteHook[];
|
|
63
|
+
afterToolExecute: AfterToolExecuteHook[];
|
|
64
|
+
onTaskEnd: OnTaskEndHook[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Hook event names for registration and config matching.
|
|
68
|
+
*/
|
|
69
|
+
export type HookEventName = keyof ZoraHooks;
|
|
70
|
+
/**
|
|
71
|
+
* All valid hook event names.
|
|
72
|
+
*/
|
|
73
|
+
export declare const HOOK_EVENT_NAMES: readonly HookEventName[];
|
|
74
|
+
/**
|
|
75
|
+
* Configuration for a hook defined in config.toml [[hooks]] section.
|
|
76
|
+
*/
|
|
77
|
+
export interface HookConfig {
|
|
78
|
+
event: HookEventName;
|
|
79
|
+
match?: string;
|
|
80
|
+
script?: string;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=hook-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-types.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9E;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;CACrE;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC;AAE5C;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAK3C,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle Hook Types — ORCH-12
|
|
3
|
+
*
|
|
4
|
+
* Defines the typed hook interfaces for Zora's lifecycle hook system.
|
|
5
|
+
* Hooks intercept the orchestration pipeline at key stages:
|
|
6
|
+
* - onTaskStart: before routing (modify task context)
|
|
7
|
+
* - beforeToolExecute: before tool call (can block)
|
|
8
|
+
* - afterToolExecute: after tool call (can modify result)
|
|
9
|
+
* - onTaskEnd: after completion (can inject follow-up)
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* All valid hook event names.
|
|
13
|
+
*/
|
|
14
|
+
export const HOOK_EVENT_NAMES = [
|
|
15
|
+
'onTaskStart',
|
|
16
|
+
'beforeToolExecute',
|
|
17
|
+
'afterToolExecute',
|
|
18
|
+
'onTaskEnd',
|
|
19
|
+
];
|
|
20
|
+
//# sourceMappingURL=hook-types.js.map
|