@viewportai/daemon 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.
- package/LICENSE +176 -0
- package/README.md +157 -0
- package/bin/vpd.js +3 -0
- package/dist/adapters/claude.d.ts +119 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +621 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex-event-normalizers.d.ts +10 -0
- package/dist/adapters/codex-event-normalizers.d.ts.map +1 -0
- package/dist/adapters/codex-event-normalizers.js +208 -0
- package/dist/adapters/codex-event-normalizers.js.map +1 -0
- package/dist/adapters/codex-sdk-loader.d.ts +47 -0
- package/dist/adapters/codex-sdk-loader.d.ts.map +1 -0
- package/dist/adapters/codex-sdk-loader.js +19 -0
- package/dist/adapters/codex-sdk-loader.js.map +1 -0
- package/dist/adapters/codex.d.ts +56 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +267 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-cli.d.ts +49 -0
- package/dist/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/adapters/gemini-cli.js +181 -0
- package/dist/adapters/gemini-cli.js.map +1 -0
- package/dist/adapters/pty.d.ts +56 -0
- package/dist/adapters/pty.d.ts.map +1 -0
- package/dist/adapters/pty.js +223 -0
- package/dist/adapters/pty.js.map +1 -0
- package/dist/agents/aider.d.ts +9 -0
- package/dist/agents/aider.d.ts.map +1 -0
- package/dist/agents/aider.js +37 -0
- package/dist/agents/aider.js.map +1 -0
- package/dist/agents/built-in.d.ts +4 -0
- package/dist/agents/built-in.d.ts.map +1 -0
- package/dist/agents/built-in.js +6 -0
- package/dist/agents/built-in.js.map +1 -0
- package/dist/agents/claude.d.ts +12 -0
- package/dist/agents/claude.d.ts.map +1 -0
- package/dist/agents/claude.js +93 -0
- package/dist/agents/claude.js.map +1 -0
- package/dist/agents/codex.d.ts +6 -0
- package/dist/agents/codex.d.ts.map +1 -0
- package/dist/agents/codex.js +64 -0
- package/dist/agents/codex.js.map +1 -0
- package/dist/agents/command-detection.d.ts +6 -0
- package/dist/agents/command-detection.d.ts.map +1 -0
- package/dist/agents/command-detection.js +12 -0
- package/dist/agents/command-detection.js.map +1 -0
- package/dist/agents/gemini.d.ts +6 -0
- package/dist/agents/gemini.d.ts.map +1 -0
- package/dist/agents/gemini.js +36 -0
- package/dist/agents/gemini.js.map +1 -0
- package/dist/cli/agent-commands.d.ts +2 -0
- package/dist/cli/agent-commands.d.ts.map +1 -0
- package/dist/cli/agent-commands.js +87 -0
- package/dist/cli/agent-commands.js.map +1 -0
- package/dist/cli/args.d.ts +9 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +34 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/command-shared.d.ts +53 -0
- package/dist/cli/command-shared.d.ts.map +1 -0
- package/dist/cli/command-shared.js +239 -0
- package/dist/cli/command-shared.js.map +1 -0
- package/dist/cli/commands.d.ts +20 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +20 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/daemon-client.d.ts +30 -0
- package/dist/cli/daemon-client.d.ts.map +1 -0
- package/dist/cli/daemon-client.js +161 -0
- package/dist/cli/daemon-client.js.map +1 -0
- package/dist/cli/daemon-lifecycle.d.ts +47 -0
- package/dist/cli/daemon-lifecycle.d.ts.map +1 -0
- package/dist/cli/daemon-lifecycle.js +262 -0
- package/dist/cli/daemon-lifecycle.js.map +1 -0
- package/dist/cli/daemon-settings.d.ts +9 -0
- package/dist/cli/daemon-settings.d.ts.map +1 -0
- package/dist/cli/daemon-settings.js +168 -0
- package/dist/cli/daemon-settings.js.map +1 -0
- package/dist/cli/directory-commands.d.ts +4 -0
- package/dist/cli/directory-commands.d.ts.map +1 -0
- package/dist/cli/directory-commands.js +190 -0
- package/dist/cli/directory-commands.js.map +1 -0
- package/dist/cli/hook-command.d.ts +14 -0
- package/dist/cli/hook-command.d.ts.map +1 -0
- package/dist/cli/hook-command.js +96 -0
- package/dist/cli/hook-command.js.map +1 -0
- package/dist/cli/install-command.d.ts +2 -0
- package/dist/cli/install-command.d.ts.map +1 -0
- package/dist/cli/install-command.js +91 -0
- package/dist/cli/install-command.js.map +1 -0
- package/dist/cli/lifecycle-commands.d.ts +10 -0
- package/dist/cli/lifecycle-commands.d.ts.map +1 -0
- package/dist/cli/lifecycle-commands.js +524 -0
- package/dist/cli/lifecycle-commands.js.map +1 -0
- package/dist/cli/listen-target.d.ts +13 -0
- package/dist/cli/listen-target.d.ts.map +1 -0
- package/dist/cli/listen-target.js +102 -0
- package/dist/cli/listen-target.js.map +1 -0
- package/dist/cli/orchestration-commands.d.ts +8 -0
- package/dist/cli/orchestration-commands.d.ts.map +1 -0
- package/dist/cli/orchestration-commands.js +340 -0
- package/dist/cli/orchestration-commands.js.map +1 -0
- package/dist/cli/permission-commands.d.ts +2 -0
- package/dist/cli/permission-commands.d.ts.map +1 -0
- package/dist/cli/permission-commands.js +138 -0
- package/dist/cli/permission-commands.js.map +1 -0
- package/dist/cli/runtime-toolchain.d.ts +35 -0
- package/dist/cli/runtime-toolchain.d.ts.map +1 -0
- package/dist/cli/runtime-toolchain.js +184 -0
- package/dist/cli/runtime-toolchain.js.map +1 -0
- package/dist/cli/service-commands.d.ts +19 -0
- package/dist/cli/service-commands.d.ts.map +1 -0
- package/dist/cli/service-commands.js +273 -0
- package/dist/cli/service-commands.js.map +1 -0
- package/dist/cli/session-commands.d.ts +3 -0
- package/dist/cli/session-commands.d.ts.map +1 -0
- package/dist/cli/session-commands.js +146 -0
- package/dist/cli/session-commands.js.map +1 -0
- package/dist/cli/setup-command.d.ts +12 -0
- package/dist/cli/setup-command.d.ts.map +1 -0
- package/dist/cli/setup-command.js +223 -0
- package/dist/cli/setup-command.js.map +1 -0
- package/dist/cli/supervisor-protocol.d.ts +20 -0
- package/dist/cli/supervisor-protocol.d.ts.map +1 -0
- package/dist/cli/supervisor-protocol.js +5 -0
- package/dist/cli/supervisor-protocol.js.map +1 -0
- package/dist/cli/supervisor.d.ts +10 -0
- package/dist/cli/supervisor.d.ts.map +1 -0
- package/dist/cli/supervisor.js +218 -0
- package/dist/cli/supervisor.js.map +1 -0
- package/dist/cli/worktree-commands.d.ts +2 -0
- package/dist/cli/worktree-commands.d.ts.map +1 -0
- package/dist/cli/worktree-commands.js +250 -0
- package/dist/cli/worktree-commands.js.map +1 -0
- package/dist/cli/ws-client.d.ts +20 -0
- package/dist/cli/ws-client.d.ts.map +1 -0
- package/dist/cli/ws-client.js +103 -0
- package/dist/cli/ws-client.js.map +1 -0
- package/dist/core/agent-registry.d.ts +128 -0
- package/dist/core/agent-registry.d.ts.map +1 -0
- package/dist/core/agent-registry.js +131 -0
- package/dist/core/agent-registry.js.map +1 -0
- package/dist/core/config-schema.d.ts +77 -0
- package/dist/core/config-schema.d.ts.map +1 -0
- package/dist/core/config-schema.js +66 -0
- package/dist/core/config-schema.js.map +1 -0
- package/dist/core/config.d.ts +111 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +244 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/daemon.d.ts +113 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +197 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/discovered-sessions.d.ts +7 -0
- package/dist/core/discovered-sessions.d.ts.map +1 -0
- package/dist/core/discovered-sessions.js +39 -0
- package/dist/core/discovered-sessions.js.map +1 -0
- package/dist/core/error-codes.d.ts +31 -0
- package/dist/core/error-codes.d.ts.map +1 -0
- package/dist/core/error-codes.js +30 -0
- package/dist/core/error-codes.js.map +1 -0
- package/dist/core/errors.d.ts +16 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +43 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events.d.ts +183 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +61 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/interfaces.d.ts +115 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +9 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/core/logger.d.ts +11 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +17 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/metrics.d.ts +24 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +32 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/output.d.ts +13 -0
- package/dist/core/output.d.ts.map +1 -0
- package/dist/core/output.js +22 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/permission-coordinator.d.ts +67 -0
- package/dist/core/permission-coordinator.d.ts.map +1 -0
- package/dist/core/permission-coordinator.js +209 -0
- package/dist/core/permission-coordinator.js.map +1 -0
- package/dist/core/session-manager.d.ts +121 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +354 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/session-state-file.d.ts +20 -0
- package/dist/core/session-state-file.d.ts.map +1 -0
- package/dist/core/session-state-file.js +49 -0
- package/dist/core/session-state-file.js.map +1 -0
- package/dist/core/types.d.ts +250 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +88 -0
- package/dist/core/types.js.map +1 -0
- package/dist/directories/manager.d.ts +32 -0
- package/dist/directories/manager.d.ts.map +1 -0
- package/dist/directories/manager.js +86 -0
- package/dist/directories/manager.js.map +1 -0
- package/dist/discovery/claude.d.ts +29 -0
- package/dist/discovery/claude.d.ts.map +1 -0
- package/dist/discovery/claude.js +55 -0
- package/dist/discovery/claude.js.map +1 -0
- package/dist/discovery/codex.d.ts +11 -0
- package/dist/discovery/codex.d.ts.map +1 -0
- package/dist/discovery/codex.js +365 -0
- package/dist/discovery/codex.js.map +1 -0
- package/dist/discovery/gemini.d.ts +15 -0
- package/dist/discovery/gemini.d.ts.map +1 -0
- package/dist/discovery/gemini.js +151 -0
- package/dist/discovery/gemini.js.map +1 -0
- package/dist/discovery/jsonl-reader.d.ts +122 -0
- package/dist/discovery/jsonl-reader.d.ts.map +1 -0
- package/dist/discovery/jsonl-reader.js +622 -0
- package/dist/discovery/jsonl-reader.js.map +1 -0
- package/dist/discovery/watcher.d.ts +29 -0
- package/dist/discovery/watcher.d.ts.map +1 -0
- package/dist/discovery/watcher.js +383 -0
- package/dist/discovery/watcher.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/installers/base.d.ts +27 -0
- package/dist/hooks/installers/base.d.ts.map +1 -0
- package/dist/hooks/installers/base.js +9 -0
- package/dist/hooks/installers/base.js.map +1 -0
- package/dist/hooks/installers/claude.d.ts +18 -0
- package/dist/hooks/installers/claude.d.ts.map +1 -0
- package/dist/hooks/installers/claude.js +120 -0
- package/dist/hooks/installers/claude.js.map +1 -0
- package/dist/hooks/router.d.ts +63 -0
- package/dist/hooks/router.d.ts.map +1 -0
- package/dist/hooks/router.js +259 -0
- package/dist/hooks/router.js.map +1 -0
- package/dist/hooks/supervision.d.ts +27 -0
- package/dist/hooks/supervision.d.ts.map +1 -0
- package/dist/hooks/supervision.js +67 -0
- package/dist/hooks/supervision.js.map +1 -0
- package/dist/hooks/types.d.ts +171 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +148 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/permissions/engine.d.ts +23 -0
- package/dist/permissions/engine.d.ts.map +1 -0
- package/dist/permissions/engine.js +43 -0
- package/dist/permissions/engine.js.map +1 -0
- package/dist/plugins/loader.d.ts +44 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +177 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/server/auth.d.ts +32 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +78 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/discovered-watch-key.d.ts +5 -0
- package/dist/server/discovered-watch-key.d.ts.map +1 -0
- package/dist/server/discovered-watch-key.js +31 -0
- package/dist/server/discovered-watch-key.js.map +1 -0
- package/dist/server/hello-builder.d.ts +17 -0
- package/dist/server/hello-builder.d.ts.map +1 -0
- package/dist/server/hello-builder.js +71 -0
- package/dist/server/hello-builder.js.map +1 -0
- package/dist/server/http-server.d.ts +30 -0
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/server/http-server.js +561 -0
- package/dist/server/http-server.js.map +1 -0
- package/dist/server/message-normalizers.d.ts +11 -0
- package/dist/server/message-normalizers.d.ts.map +1 -0
- package/dist/server/message-normalizers.js +104 -0
- package/dist/server/message-normalizers.js.map +1 -0
- package/dist/server/pairing-offers.d.ts +78 -0
- package/dist/server/pairing-offers.d.ts.map +1 -0
- package/dist/server/pairing-offers.js +502 -0
- package/dist/server/pairing-offers.js.map +1 -0
- package/dist/server/rate-limiter.d.ts +21 -0
- package/dist/server/rate-limiter.d.ts.map +1 -0
- package/dist/server/rate-limiter.js +61 -0
- package/dist/server/rate-limiter.js.map +1 -0
- package/dist/server/ring-buffer.d.ts +34 -0
- package/dist/server/ring-buffer.d.ts.map +1 -0
- package/dist/server/ring-buffer.js +73 -0
- package/dist/server/ring-buffer.js.map +1 -0
- package/dist/server/security.d.ts +22 -0
- package/dist/server/security.d.ts.map +1 -0
- package/dist/server/security.js +123 -0
- package/dist/server/security.js.map +1 -0
- package/dist/server/ws-command-handlers.d.ts +25 -0
- package/dist/server/ws-command-handlers.d.ts.map +1 -0
- package/dist/server/ws-command-handlers.js +218 -0
- package/dist/server/ws-command-handlers.js.map +1 -0
- package/dist/server/ws-daemon-event-bridge.d.ts +22 -0
- package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -0
- package/dist/server/ws-daemon-event-bridge.js +321 -0
- package/dist/server/ws-daemon-event-bridge.js.map +1 -0
- package/dist/server/ws-limits.d.ts +2 -0
- package/dist/server/ws-limits.d.ts.map +1 -0
- package/dist/server/ws-limits.js +12 -0
- package/dist/server/ws-limits.js.map +1 -0
- package/dist/server/ws-protocol.d.ts +248 -0
- package/dist/server/ws-protocol.d.ts.map +1 -0
- package/dist/server/ws-protocol.js +157 -0
- package/dist/server/ws-protocol.js.map +1 -0
- package/dist/server/ws-server.d.ts +26 -0
- package/dist/server/ws-server.d.ts.map +1 -0
- package/dist/server/ws-server.js +290 -0
- package/dist/server/ws-server.js.map +1 -0
- package/dist/startup-agents.d.ts +6 -0
- package/dist/startup-agents.d.ts.map +1 -0
- package/dist/startup-agents.js +97 -0
- package/dist/startup-agents.js.map +1 -0
- package/dist/startup-prereqs.d.ts +29 -0
- package/dist/startup-prereqs.d.ts.map +1 -0
- package/dist/startup-prereqs.js +209 -0
- package/dist/startup-prereqs.js.map +1 -0
- package/dist/startup-watchers.d.ts +7 -0
- package/dist/startup-watchers.d.ts.map +1 -0
- package/dist/startup-watchers.js +196 -0
- package/dist/startup-watchers.js.map +1 -0
- package/dist/startup.d.ts +20 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +335 -0
- package/dist/startup.js.map +1 -0
- package/dist/tracking/git-tracker.d.ts +52 -0
- package/dist/tracking/git-tracker.d.ts.map +1 -0
- package/dist/tracking/git-tracker.js +277 -0
- package/dist/tracking/git-tracker.js.map +1 -0
- package/dist/tracking/noop-tracker.d.ts +27 -0
- package/dist/tracking/noop-tracker.d.ts.map +1 -0
- package/dist/tracking/noop-tracker.js +42 -0
- package/dist/tracking/noop-tracker.js.map +1 -0
- package/docs/configuration.md +75 -0
- package/docs/developer-workflows.md +107 -0
- package/docs/protocol-matrix.json +155 -0
- package/docs/releasing.md +65 -0
- package/docs/security.md +48 -0
- package/docs/testing.md +112 -0
- package/package.json +84 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system types — adapter-agnostic event definitions for agent lifecycle hooks.
|
|
3
|
+
*
|
|
4
|
+
* The hook system allows the daemon to receive events from any agent (Claude Code,
|
|
5
|
+
* Gemini, Cursor, etc.) via lightweight CLI commands that POST to the daemon.
|
|
6
|
+
* Each hook event has a typed input schema and metadata about how it should be handled.
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - HookEventKind: all supported event names (extensible enum-like union)
|
|
10
|
+
* - HookInput<K>: typed input for each event kind
|
|
11
|
+
* - HookEventDefinition: registry entry with schema, blocking flag, handler
|
|
12
|
+
* - HookResponse: what the daemon returns to the hook command
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Hook event kinds — add new events here
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export const HOOK_EVENT_KINDS = [
|
|
19
|
+
'SessionStart',
|
|
20
|
+
'SessionEnd',
|
|
21
|
+
'PermissionRequest',
|
|
22
|
+
'Notification',
|
|
23
|
+
'Stop',
|
|
24
|
+
'PreToolUse',
|
|
25
|
+
'PostToolUse',
|
|
26
|
+
'PostToolUseFailure',
|
|
27
|
+
'SubagentStart',
|
|
28
|
+
'SubagentStop',
|
|
29
|
+
'UserPromptSubmit',
|
|
30
|
+
'TaskCompleted',
|
|
31
|
+
];
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Base input — all hook events include these fields
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
export const HookBaseInputSchema = z.object({
|
|
36
|
+
hook_event_name: z.string(),
|
|
37
|
+
session_id: z.string(),
|
|
38
|
+
transcript_path: z.string().optional(),
|
|
39
|
+
cwd: z.string().optional(),
|
|
40
|
+
permission_mode: z.string().optional(),
|
|
41
|
+
});
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Per-event input schemas
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
export const SessionStartInputSchema = HookBaseInputSchema.extend({
|
|
46
|
+
hook_event_name: z.literal('SessionStart'),
|
|
47
|
+
source: z.enum(['startup', 'resume', 'clear', 'compact']).optional(),
|
|
48
|
+
agent_type: z.string().optional(),
|
|
49
|
+
model: z.string().optional(),
|
|
50
|
+
});
|
|
51
|
+
export const SessionEndInputSchema = HookBaseInputSchema.extend({
|
|
52
|
+
hook_event_name: z.literal('SessionEnd'),
|
|
53
|
+
reason: z.string().optional(),
|
|
54
|
+
});
|
|
55
|
+
export const PermissionRequestInputSchema = HookBaseInputSchema.extend({
|
|
56
|
+
hook_event_name: z.literal('PermissionRequest'),
|
|
57
|
+
tool_name: z.string(),
|
|
58
|
+
tool_input: z.unknown().optional(),
|
|
59
|
+
});
|
|
60
|
+
export const NotificationInputSchema = HookBaseInputSchema.extend({
|
|
61
|
+
hook_event_name: z.literal('Notification'),
|
|
62
|
+
message: z.string(),
|
|
63
|
+
title: z.string().optional(),
|
|
64
|
+
notification_type: z.string().optional(),
|
|
65
|
+
});
|
|
66
|
+
export const StopInputSchema = HookBaseInputSchema.extend({
|
|
67
|
+
hook_event_name: z.literal('Stop'),
|
|
68
|
+
stop_hook_active: z.boolean().optional(),
|
|
69
|
+
last_assistant_message: z.string().optional(),
|
|
70
|
+
});
|
|
71
|
+
export const PreToolUseInputSchema = HookBaseInputSchema.extend({
|
|
72
|
+
hook_event_name: z.literal('PreToolUse'),
|
|
73
|
+
tool_name: z.string(),
|
|
74
|
+
tool_input: z.unknown().optional(),
|
|
75
|
+
tool_use_id: z.string().optional(),
|
|
76
|
+
});
|
|
77
|
+
export const PostToolUseInputSchema = HookBaseInputSchema.extend({
|
|
78
|
+
hook_event_name: z.literal('PostToolUse'),
|
|
79
|
+
tool_name: z.string(),
|
|
80
|
+
tool_input: z.unknown().optional(),
|
|
81
|
+
tool_response: z.unknown().optional(),
|
|
82
|
+
tool_use_id: z.string().optional(),
|
|
83
|
+
});
|
|
84
|
+
export const PostToolUseFailureInputSchema = HookBaseInputSchema.extend({
|
|
85
|
+
hook_event_name: z.literal('PostToolUseFailure'),
|
|
86
|
+
tool_name: z.string(),
|
|
87
|
+
tool_input: z.unknown().optional(),
|
|
88
|
+
tool_use_id: z.string().optional(),
|
|
89
|
+
error: z.string().optional(),
|
|
90
|
+
is_interrupt: z.boolean().optional(),
|
|
91
|
+
});
|
|
92
|
+
export const SubagentStartInputSchema = HookBaseInputSchema.extend({
|
|
93
|
+
hook_event_name: z.literal('SubagentStart'),
|
|
94
|
+
agent_id: z.string().optional(),
|
|
95
|
+
agent_type: z.string().optional(),
|
|
96
|
+
});
|
|
97
|
+
export const SubagentStopInputSchema = HookBaseInputSchema.extend({
|
|
98
|
+
hook_event_name: z.literal('SubagentStop'),
|
|
99
|
+
agent_id: z.string().optional(),
|
|
100
|
+
agent_type: z.string().optional(),
|
|
101
|
+
agent_transcript_path: z.string().optional(),
|
|
102
|
+
last_assistant_message: z.string().optional(),
|
|
103
|
+
});
|
|
104
|
+
export const UserPromptSubmitInputSchema = HookBaseInputSchema.extend({
|
|
105
|
+
hook_event_name: z.literal('UserPromptSubmit'),
|
|
106
|
+
prompt: z.string().optional(),
|
|
107
|
+
});
|
|
108
|
+
export const TaskCompletedInputSchema = HookBaseInputSchema.extend({
|
|
109
|
+
hook_event_name: z.literal('TaskCompleted'),
|
|
110
|
+
task_id: z.string().optional(),
|
|
111
|
+
task_subject: z.string().optional(),
|
|
112
|
+
task_description: z.string().optional(),
|
|
113
|
+
});
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Schema registry — maps event kind to its Zod schema
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
export const HOOK_INPUT_SCHEMAS = {
|
|
118
|
+
SessionStart: SessionStartInputSchema,
|
|
119
|
+
SessionEnd: SessionEndInputSchema,
|
|
120
|
+
PermissionRequest: PermissionRequestInputSchema,
|
|
121
|
+
Notification: NotificationInputSchema,
|
|
122
|
+
Stop: StopInputSchema,
|
|
123
|
+
PreToolUse: PreToolUseInputSchema,
|
|
124
|
+
PostToolUse: PostToolUseInputSchema,
|
|
125
|
+
PostToolUseFailure: PostToolUseFailureInputSchema,
|
|
126
|
+
SubagentStart: SubagentStartInputSchema,
|
|
127
|
+
SubagentStop: SubagentStopInputSchema,
|
|
128
|
+
UserPromptSubmit: UserPromptSubmitInputSchema,
|
|
129
|
+
TaskCompleted: TaskCompletedInputSchema,
|
|
130
|
+
};
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// Default event definitions — blocking vs fire-and-forget
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
export const DEFAULT_EVENT_DEFINITIONS = [
|
|
135
|
+
{ kind: 'SessionStart', blocking: false, defaultTimeoutMs: 5_000 },
|
|
136
|
+
{ kind: 'SessionEnd', blocking: false, defaultTimeoutMs: 5_000 },
|
|
137
|
+
{ kind: 'PermissionRequest', blocking: true, defaultTimeoutMs: 120_000 },
|
|
138
|
+
{ kind: 'Notification', blocking: false, defaultTimeoutMs: 5_000 },
|
|
139
|
+
{ kind: 'Stop', blocking: false, defaultTimeoutMs: 5_000 },
|
|
140
|
+
{ kind: 'PreToolUse', blocking: false, defaultTimeoutMs: 5_000 },
|
|
141
|
+
{ kind: 'PostToolUse', blocking: false, defaultTimeoutMs: 5_000 },
|
|
142
|
+
{ kind: 'PostToolUseFailure', blocking: false, defaultTimeoutMs: 5_000 },
|
|
143
|
+
{ kind: 'SubagentStart', blocking: false, defaultTimeoutMs: 5_000 },
|
|
144
|
+
{ kind: 'SubagentStop', blocking: false, defaultTimeoutMs: 5_000 },
|
|
145
|
+
{ kind: 'UserPromptSubmit', blocking: false, defaultTimeoutMs: 5_000 },
|
|
146
|
+
{ kind: 'TaskCompleted', blocking: false, defaultTimeoutMs: 5_000 },
|
|
147
|
+
];
|
|
148
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Viewport Daemon — CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* vpd start [--port 7070] Start the daemon
|
|
7
|
+
* vpd install Detect available agents
|
|
8
|
+
* vpd add <path> Register a directory
|
|
9
|
+
* vpd remove <path> Unregister a directory
|
|
10
|
+
* vpd list List directories + active sessions
|
|
11
|
+
* vpd status Daemon health check
|
|
12
|
+
* vpd stop Stop the daemon
|
|
13
|
+
* vpd restart Restart the daemon
|
|
14
|
+
* vpd worktree ... Worktree operator commands
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Viewport Daemon — CLI entry point.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* vpd start [--port 7070] Start the daemon
|
|
7
|
+
* vpd install Detect available agents
|
|
8
|
+
* vpd add <path> Register a directory
|
|
9
|
+
* vpd remove <path> Unregister a directory
|
|
10
|
+
* vpd list List directories + active sessions
|
|
11
|
+
* vpd status Daemon health check
|
|
12
|
+
* vpd stop Stop the daemon
|
|
13
|
+
* vpd restart Restart the daemon
|
|
14
|
+
* vpd worktree ... Worktree operator commands
|
|
15
|
+
*/
|
|
16
|
+
import { getCommand, getArgs } from './cli/args.js';
|
|
17
|
+
import { install, addDirectory, removeDirectory, list, status, stop, restart, run, send, logs, wait, attach, pair, update, showHelp, ls, stopSession, permit, agent, worktree, service, setup, } from './cli/commands.js';
|
|
18
|
+
import { hookNotify } from './cli/hook-command.js';
|
|
19
|
+
import { start, runSupervisorCommand, runWorkerCommand } from './startup.js';
|
|
20
|
+
const commands = {
|
|
21
|
+
start,
|
|
22
|
+
install,
|
|
23
|
+
add: addDirectory,
|
|
24
|
+
remove: removeDirectory,
|
|
25
|
+
list,
|
|
26
|
+
status,
|
|
27
|
+
stop,
|
|
28
|
+
restart,
|
|
29
|
+
run,
|
|
30
|
+
send,
|
|
31
|
+
logs,
|
|
32
|
+
wait,
|
|
33
|
+
attach,
|
|
34
|
+
pair,
|
|
35
|
+
update,
|
|
36
|
+
ls,
|
|
37
|
+
permit,
|
|
38
|
+
agent,
|
|
39
|
+
worktree,
|
|
40
|
+
service,
|
|
41
|
+
setup,
|
|
42
|
+
};
|
|
43
|
+
const command = getCommand();
|
|
44
|
+
// Sub-command: vpd hook notify --event <EventName>
|
|
45
|
+
if (command === 'hook') {
|
|
46
|
+
const subcommand = getArgs()[1];
|
|
47
|
+
if (subcommand === 'notify') {
|
|
48
|
+
hookNotify().catch(() => process.exit(1));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.error(`Unknown hook subcommand: ${subcommand}`);
|
|
52
|
+
console.error('Usage: vpd hook notify --event <EventName>');
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (command === '__supervisor') {
|
|
58
|
+
runSupervisorCommand().catch((err) => {
|
|
59
|
+
console.error(`Supervisor error: ${err.message}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else if (command === '__worker') {
|
|
64
|
+
runWorkerCommand().catch((err) => {
|
|
65
|
+
console.error(`Worker error: ${err.message}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
let handler = commands[command];
|
|
71
|
+
if (command === 'daemon') {
|
|
72
|
+
const subcommand = getArgs()[1] ?? 'status';
|
|
73
|
+
if (subcommand === 'start')
|
|
74
|
+
handler = start;
|
|
75
|
+
if (subcommand === 'status')
|
|
76
|
+
handler = status;
|
|
77
|
+
if (subcommand === 'stop')
|
|
78
|
+
handler = stop;
|
|
79
|
+
if (subcommand === 'restart')
|
|
80
|
+
handler = restart;
|
|
81
|
+
if (subcommand === 'pair')
|
|
82
|
+
handler = pair;
|
|
83
|
+
if (subcommand === 'update')
|
|
84
|
+
handler = update;
|
|
85
|
+
if (subcommand === 'service')
|
|
86
|
+
handler = service;
|
|
87
|
+
if (subcommand === 'setup')
|
|
88
|
+
handler = setup;
|
|
89
|
+
}
|
|
90
|
+
else if (command === 'session') {
|
|
91
|
+
const subcommand = getArgs()[1];
|
|
92
|
+
if (subcommand === 'stop')
|
|
93
|
+
handler = stopSession;
|
|
94
|
+
}
|
|
95
|
+
else if (command === 'permit') {
|
|
96
|
+
handler = permit;
|
|
97
|
+
}
|
|
98
|
+
else if (command === 'agent') {
|
|
99
|
+
handler = agent;
|
|
100
|
+
}
|
|
101
|
+
else if (command === 'worktree') {
|
|
102
|
+
handler = worktree;
|
|
103
|
+
}
|
|
104
|
+
if (!handler) {
|
|
105
|
+
if (command !== 'help') {
|
|
106
|
+
console.error(`Unknown command: ${command}\n`);
|
|
107
|
+
}
|
|
108
|
+
showHelp();
|
|
109
|
+
process.exit(command === 'help' ? 0 : 1);
|
|
110
|
+
}
|
|
111
|
+
handler().catch((err) => {
|
|
112
|
+
console.error(`Error: ${err.message}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# 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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission resolution engine.
|
|
3
|
+
*
|
|
4
|
+
* Resolves whether a tool call should be auto-approved, require user approval,
|
|
5
|
+
* or be denied — based on the layered PermissionsConfig.
|
|
6
|
+
*
|
|
7
|
+
* For v0.1: tool name matching only. Future: semantic Bash command matching,
|
|
8
|
+
* path-based rules, etc.
|
|
9
|
+
*/
|
|
10
|
+
import type { PermissionsConfig } from '../core/types.js';
|
|
11
|
+
export type PermissionResolution = 'auto-approve' | 'require-approval' | 'deny';
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the permission for a tool call.
|
|
14
|
+
*
|
|
15
|
+
* Priority: deny > autoApprove > requireApproval > default (require-approval)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolvePermission(toolName: string, _toolInput: Record<string, unknown> | undefined, config: PermissionsConfig): PermissionResolution;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a tool name matches any pattern in a list.
|
|
20
|
+
* For v0.1: exact match only. Future: glob/regex patterns.
|
|
21
|
+
*/
|
|
22
|
+
export declare function matchesTool(toolName: string, patterns: string[]): boolean;
|
|
23
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAEhF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC/C,MAAM,EAAE,iBAAiB,GACxB,oBAAoB,CAsBtB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAEzE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission resolution engine.
|
|
3
|
+
*
|
|
4
|
+
* Resolves whether a tool call should be auto-approved, require user approval,
|
|
5
|
+
* or be denied — based on the layered PermissionsConfig.
|
|
6
|
+
*
|
|
7
|
+
* For v0.1: tool name matching only. Future: semantic Bash command matching,
|
|
8
|
+
* path-based rules, etc.
|
|
9
|
+
*/
|
|
10
|
+
import { metrics } from '../core/metrics.js';
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the permission for a tool call.
|
|
13
|
+
*
|
|
14
|
+
* Priority: deny > autoApprove > requireApproval > default (require-approval)
|
|
15
|
+
*/
|
|
16
|
+
export function resolvePermission(toolName, _toolInput, config) {
|
|
17
|
+
// Deny takes highest priority
|
|
18
|
+
if (config.deny.includes(toolName)) {
|
|
19
|
+
metrics.increment('permissions.denied');
|
|
20
|
+
return 'deny';
|
|
21
|
+
}
|
|
22
|
+
// Auto-approve if listed
|
|
23
|
+
if (config.autoApprove.includes(toolName)) {
|
|
24
|
+
metrics.increment('permissions.auto_approved');
|
|
25
|
+
return 'auto-approve';
|
|
26
|
+
}
|
|
27
|
+
// Explicitly require approval if listed
|
|
28
|
+
if (config.requireApproval.includes(toolName)) {
|
|
29
|
+
metrics.increment('permissions.require_approval');
|
|
30
|
+
return 'require-approval';
|
|
31
|
+
}
|
|
32
|
+
// Default: require approval for unknown tools
|
|
33
|
+
metrics.increment('permissions.require_approval');
|
|
34
|
+
return 'require-approval';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a tool name matches any pattern in a list.
|
|
38
|
+
* For v0.1: exact match only. Future: glob/regex patterns.
|
|
39
|
+
*/
|
|
40
|
+
export function matchesTool(toolName, patterns) {
|
|
41
|
+
return patterns.includes(toolName);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/permissions/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAI7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAA+C,EAC/C,MAAyB;IAEzB,8BAA8B;IAC9B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QAC/C,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAClD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,8CAA8C;IAC9C,OAAO,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAClD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAkB;IAC9D,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin loader — discovers and loads agent plugins from:
|
|
3
|
+
* 1. ~/.viewport/plugins/ (user-installed plugins)
|
|
4
|
+
* 2. node_modules/ (project-local plugins)
|
|
5
|
+
*
|
|
6
|
+
* Plugins are npm packages that export an AgentDefinition.
|
|
7
|
+
* Convention: @viewport/agent-* or viewport-agent-*
|
|
8
|
+
*
|
|
9
|
+
* Each plugin's package.json must have a "viewport" field:
|
|
10
|
+
* { "viewport": { "type": "agent", "agentId": "my-agent" } }
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentDefinition } from '../core/agent-registry.js';
|
|
13
|
+
export interface PluginManifest {
|
|
14
|
+
/** Package name. */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Package version. */
|
|
17
|
+
version: string;
|
|
18
|
+
/** Viewport plugin metadata. */
|
|
19
|
+
viewport: {
|
|
20
|
+
type: 'agent';
|
|
21
|
+
agentId: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface LoadedPlugin {
|
|
25
|
+
manifest: PluginManifest;
|
|
26
|
+
definition: AgentDefinition;
|
|
27
|
+
path: string;
|
|
28
|
+
}
|
|
29
|
+
/** Get the global plugins directory. */
|
|
30
|
+
export declare function pluginsDir(): string;
|
|
31
|
+
/**
|
|
32
|
+
* Discover and load all agent plugins.
|
|
33
|
+
* Scans:
|
|
34
|
+
* 1. ~/.viewport/plugins/
|
|
35
|
+
* 2. Current project's node_modules/ (optional)
|
|
36
|
+
*/
|
|
37
|
+
export declare function loadPluginAgents(options?: {
|
|
38
|
+
projectDir?: string;
|
|
39
|
+
}): Promise<LoadedPlugin[]>;
|
|
40
|
+
/**
|
|
41
|
+
* List installed plugins (without loading them).
|
|
42
|
+
*/
|
|
43
|
+
export declare function listPlugins(): Promise<PluginManifest[]>;
|
|
44
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAMjE,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE;QACR,IAAI,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,wCAAwC;AACxC,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AA6HD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiCjG;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAU7D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin loader — discovers and loads agent plugins from:
|
|
3
|
+
* 1. ~/.viewport/plugins/ (user-installed plugins)
|
|
4
|
+
* 2. node_modules/ (project-local plugins)
|
|
5
|
+
*
|
|
6
|
+
* Plugins are npm packages that export an AgentDefinition.
|
|
7
|
+
* Convention: @viewport/agent-* or viewport-agent-*
|
|
8
|
+
*
|
|
9
|
+
* Each plugin's package.json must have a "viewport" field:
|
|
10
|
+
* { "viewport": { "type": "agent", "agentId": "my-agent" } }
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'node:fs/promises';
|
|
13
|
+
import path from 'node:path';
|
|
14
|
+
import { configDir } from '../core/config.js';
|
|
15
|
+
import { logger } from '../core/output.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Plugin directories
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/** Get the global plugins directory. */
|
|
20
|
+
export function pluginsDir() {
|
|
21
|
+
return path.join(configDir(), 'plugins');
|
|
22
|
+
}
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Plugin discovery
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/**
|
|
27
|
+
* Scan a directory for Viewport plugin packages.
|
|
28
|
+
* Returns plugin manifests found in package.json files.
|
|
29
|
+
*/
|
|
30
|
+
async function scanForPlugins(dir) {
|
|
31
|
+
const found = [];
|
|
32
|
+
try {
|
|
33
|
+
const entries = await fs.readdir(dir);
|
|
34
|
+
for (const entry of entries) {
|
|
35
|
+
const entryPath = path.join(dir, entry);
|
|
36
|
+
// Handle scoped packages (@viewport/agent-*)
|
|
37
|
+
if (entry.startsWith('@')) {
|
|
38
|
+
try {
|
|
39
|
+
const scopedEntries = await fs.readdir(entryPath);
|
|
40
|
+
for (const scopedEntry of scopedEntries) {
|
|
41
|
+
const scopedPath = path.join(entryPath, scopedEntry);
|
|
42
|
+
const manifest = await readPluginManifest(scopedPath);
|
|
43
|
+
if (manifest) {
|
|
44
|
+
found.push({ manifest, dir: scopedPath });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Not a directory or unreadable
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Handle unscoped packages (viewport-agent-*)
|
|
54
|
+
if (entry.startsWith('viewport-agent-') || entry.startsWith('@viewport')) {
|
|
55
|
+
const manifest = await readPluginManifest(entryPath);
|
|
56
|
+
if (manifest) {
|
|
57
|
+
found.push({ manifest, dir: entryPath });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Directory doesn't exist — not an error
|
|
64
|
+
}
|
|
65
|
+
return found;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Read and validate a plugin's package.json.
|
|
69
|
+
*/
|
|
70
|
+
async function readPluginManifest(pkgDir) {
|
|
71
|
+
try {
|
|
72
|
+
const pkgPath = path.join(pkgDir, 'package.json');
|
|
73
|
+
const raw = await fs.readFile(pkgPath, 'utf-8');
|
|
74
|
+
const pkg = JSON.parse(raw);
|
|
75
|
+
// Must have viewport metadata
|
|
76
|
+
const viewport = pkg['viewport'];
|
|
77
|
+
if (!viewport || viewport['type'] !== 'agent' || typeof viewport['agentId'] !== 'string') {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
name: typeof pkg['name'] === 'string' ? pkg['name'] : 'unknown',
|
|
82
|
+
version: typeof pkg['version'] === 'string' ? pkg['version'] : '0.0.0',
|
|
83
|
+
viewport: {
|
|
84
|
+
type: 'agent',
|
|
85
|
+
agentId: viewport['agentId'],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Plugin loading
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Load a single plugin from its directory.
|
|
98
|
+
* The plugin must export an AgentDefinition as default or named 'definition'.
|
|
99
|
+
*/
|
|
100
|
+
async function loadPlugin(manifest, pkgDir) {
|
|
101
|
+
try {
|
|
102
|
+
// Resolve the main entry point
|
|
103
|
+
const pkgPath = path.join(pkgDir, 'package.json');
|
|
104
|
+
const raw = await fs.readFile(pkgPath, 'utf-8');
|
|
105
|
+
const pkg = JSON.parse(raw);
|
|
106
|
+
const main = pkg['main'] ?? 'index.js';
|
|
107
|
+
const entryPath = path.resolve(pkgDir, main);
|
|
108
|
+
// Dynamic import
|
|
109
|
+
const mod = await import(entryPath);
|
|
110
|
+
const definition = mod.definition ?? mod.default?.definition ?? mod.default;
|
|
111
|
+
if (!definition || typeof definition.id !== 'string') {
|
|
112
|
+
logger.warn(`Plugin ${manifest.name}: no valid AgentDefinition exported`);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Validate the definition has required fields
|
|
116
|
+
if (!definition.displayName || !definition.tier || !definition.createAdapter) {
|
|
117
|
+
logger.warn(`Plugin ${manifest.name}: incomplete AgentDefinition`);
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return { manifest, definition, path: pkgDir };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
logger.warn(`Plugin ${manifest.name}: failed to load — ${err}`);
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Public API
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/**
|
|
131
|
+
* Discover and load all agent plugins.
|
|
132
|
+
* Scans:
|
|
133
|
+
* 1. ~/.viewport/plugins/
|
|
134
|
+
* 2. Current project's node_modules/ (optional)
|
|
135
|
+
*/
|
|
136
|
+
export async function loadPluginAgents(options) {
|
|
137
|
+
const scanDirs = [pluginsDir(), path.join(pluginsDir(), 'node_modules')];
|
|
138
|
+
// Optionally scan project-local node_modules
|
|
139
|
+
if (options?.projectDir) {
|
|
140
|
+
scanDirs.push(path.join(options.projectDir, 'node_modules'));
|
|
141
|
+
}
|
|
142
|
+
const allFound = [];
|
|
143
|
+
for (const dir of scanDirs) {
|
|
144
|
+
const found = await scanForPlugins(dir);
|
|
145
|
+
allFound.push(...found);
|
|
146
|
+
}
|
|
147
|
+
// Deduplicate by agentId (first one wins)
|
|
148
|
+
const seen = new Set();
|
|
149
|
+
const unique = allFound.filter((f) => {
|
|
150
|
+
if (seen.has(f.manifest.viewport.agentId))
|
|
151
|
+
return false;
|
|
152
|
+
seen.add(f.manifest.viewport.agentId);
|
|
153
|
+
return true;
|
|
154
|
+
});
|
|
155
|
+
// Load each plugin
|
|
156
|
+
const loaded = [];
|
|
157
|
+
for (const { manifest, dir } of unique) {
|
|
158
|
+
const plugin = await loadPlugin(manifest, dir);
|
|
159
|
+
if (plugin) {
|
|
160
|
+
loaded.push(plugin);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return loaded;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* List installed plugins (without loading them).
|
|
167
|
+
*/
|
|
168
|
+
export async function listPlugins() {
|
|
169
|
+
const scanDirs = [pluginsDir(), path.join(pluginsDir(), 'node_modules')];
|
|
170
|
+
const manifests = [];
|
|
171
|
+
for (const dir of scanDirs) {
|
|
172
|
+
const found = await scanForPlugins(dir);
|
|
173
|
+
manifests.push(...found.map((f) => f.manifest));
|
|
174
|
+
}
|
|
175
|
+
return manifests;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAyB3C,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,wCAAwC;AACxC,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC3B,GAAW;IAEX,MAAM,KAAK,GAAqD,EAAE,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAExC,6CAA6C;YAC7C,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAClD,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;wBACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;wBACrD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;wBACtD,IAAI,QAAQ,EAAE,CAAC;4BACb,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;wBAC5C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;gBACD,SAAS;YACX,CAAC;YAED,8CAA8C;YAC9C,IAAI,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACrD,IAAI,QAAQ,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAEvD,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAwC,CAAC;QACxE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,OAAO,IAAI,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,IAAI,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/D,OAAO,EAAE,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO;YACtE,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAW;aACvC;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;GAGG;AACH,KAAK,UAAU,UAAU,CAAC,QAAwB,EAAE,MAAc;IAChE,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QACvD,MAAM,IAAI,GAAI,GAAG,CAAC,MAAM,CAAY,IAAI,UAAU,CAAC;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAE7C,iBAAiB;QACjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,UAAU,GACd,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC;QAE3D,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,IAAI,qCAAqC,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,IAAI,8BAA8B,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,UAAU,QAAQ,CAAC,IAAI,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAiC;IACtE,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAEzE,6CAA6C;IAC7C,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAqD,EAAE,CAAC;IAEtE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,0CAA0C;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACzE,MAAM,SAAS,GAAqB,EAAE,CAAC;IAEvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module for the Viewport daemon.
|
|
3
|
+
*
|
|
4
|
+
* Local mode: random token saved to ~/.viewport/auth-token
|
|
5
|
+
* Relay mode (future): API key validated against relay server
|
|
6
|
+
*/
|
|
7
|
+
export interface AuthProvider {
|
|
8
|
+
/** Validate a token/key. Returns true if valid. */
|
|
9
|
+
validate(token: string): Promise<boolean>;
|
|
10
|
+
/** Get the current token (for display in terminal). Null if N/A. */
|
|
11
|
+
getDisplayToken(): string | null;
|
|
12
|
+
}
|
|
13
|
+
/** Local file-based auth. Token saved to ~/.viewport/auth-token */
|
|
14
|
+
export declare class LocalAuthProvider implements AuthProvider {
|
|
15
|
+
private token;
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
validate(token: string): Promise<boolean>;
|
|
18
|
+
getDisplayToken(): string | null;
|
|
19
|
+
}
|
|
20
|
+
/** No-op auth that allows everything. Used with --no-auth flag. */
|
|
21
|
+
export declare class NoopAuthProvider implements AuthProvider {
|
|
22
|
+
validate(): Promise<boolean>;
|
|
23
|
+
getDisplayToken(): string | null;
|
|
24
|
+
}
|
|
25
|
+
/** Extract Bearer token from Authorization header. */
|
|
26
|
+
export declare function extractBearerToken(authHeader: string | undefined): string | null;
|
|
27
|
+
export declare function extractTokenFromRequest(input: {
|
|
28
|
+
authorization?: string;
|
|
29
|
+
url?: string;
|
|
30
|
+
allowQueryToken?: boolean;
|
|
31
|
+
}): string | null;
|
|
32
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,oEAAoE;IACpE,eAAe,IAAI,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,mEAAmE;AACnE,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,KAAK,CAAuB;IAE9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/C,eAAe,IAAI,MAAM,GAAG,IAAI;CAGjC;AAED,mEAAmE;AACnE,qBAAa,gBAAiB,YAAW,YAAY;IAC7C,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAGlC,eAAe,IAAI,MAAM,GAAG,IAAI;CAGjC;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIhF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,MAAM,GAAG,IAAI,CAgBhB"}
|