@adhdev/daemon-core 0.9.82-rc.18 → 0.9.82-rc.181
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/dist/boot/process-hardening.d.ts +50 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +22 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +178 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +106 -63
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +29 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/commands/handler.d.ts +110 -0
- package/dist/commands/mesh-coordinator.d.ts +72 -1
- package/dist/commands/router.d.ts +22 -0
- package/dist/config/chat-history.d.ts +8 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +72 -1
- package/dist/git/git-commands.d.ts +5 -1
- package/dist/index.d.ts +35 -8
- package/dist/index.js +20754 -5387
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20567 -5270
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/mesh/beads-db.d.ts +72 -0
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +30 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +90 -0
- package/dist/mesh/mesh-events.d.ts +97 -5
- package/dist/mesh/mesh-fast-forward.d.ts +41 -0
- package/dist/mesh/mesh-host-ownership.d.ts +9 -0
- package/dist/mesh/mesh-ledger.d.ts +58 -1
- package/dist/mesh/mesh-refine-status.d.ts +26 -0
- package/dist/mesh/mesh-work-queue.d.ts +54 -6
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +193 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +113 -0
- package/dist/providers/approval-utils.d.ts +13 -0
- package/dist/providers/cli-provider-instance.d.ts +35 -3
- package/dist/providers/contracts.d.ts +98 -5
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/dispatcher.d.ts +25 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +12 -0
- package/dist/providers/provider-instance.d.ts +12 -0
- package/dist/providers/provider-loader.d.ts +26 -4
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +169 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +56 -0
- package/dist/providers/spec/cli-adapter.d.ts +97 -0
- package/dist/providers/spec/driver.d.ts +159 -0
- package/dist/providers/spec/evaluator.d.ts +47 -0
- package/dist/providers/spec/loader.d.ts +14 -0
- package/dist/providers/spec/native-history-executor.d.ts +39 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/schema.gen.d.ts +511 -0
- package/dist/providers/spec/types.d.ts +212 -0
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +48 -0
- package/dist/repo-mesh-types.d.ts +102 -1
- package/dist/sessions/registry.d.ts +3 -0
- package/dist/shared-types.d.ts +42 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +1 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -2
- package/src/agent-stream/poller.ts +2 -3
- package/src/boot/daemon-lifecycle.ts +17 -10
- package/src/boot/process-hardening.ts +89 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +14 -1
- package/src/cli-adapter-types.d.ts +1 -0
- package/src/cli-adapter-types.ts +21 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1086 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +670 -1137
- package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
- package/src/cli-adapters/provider-cli-parse.ts +13 -0
- package/src/cli-adapters/provider-cli-runtime.ts +3 -1
- package/src/cli-adapters/provider-cli-shared.d.ts +2 -0
- package/src/cli-adapters/provider-cli-shared.ts +59 -11
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +17 -1
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +8 -1
- package/src/commands/chat-commands.ts +1597 -60
- package/src/commands/cli-manager.ts +230 -3
- package/src/commands/handler.ts +809 -2
- package/src/commands/mesh-coordinator.ts +231 -127
- package/src/commands/router.ts +3495 -502
- package/src/config/chat-history.ts +91 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +280 -2
- package/src/config/recent-activity.ts +8 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/detection/ide-detector.ts +26 -16
- package/src/git/git-commands.ts +17 -5
- package/src/git/git-worktree.ts +8 -1
- package/src/index.ts +113 -7
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/logger.ts +2 -1
- package/src/mesh/beads-db.ts +486 -0
- package/src/mesh/contracts.ts +329 -0
- package/src/mesh/coordinator-prompt.ts +204 -30
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +437 -0
- package/src/mesh/mesh-events.ts +963 -67
- package/src/mesh/mesh-fast-forward.ts +438 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-ledger.ts +457 -104
- package/src/mesh/mesh-refine-status.ts +144 -0
- package/src/mesh/mesh-work-queue.ts +263 -159
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +366 -0
- package/src/mesh/worktree-bootstrap-config.ts +247 -0
- package/src/providers/approval-utils.d.ts +4 -0
- package/src/providers/approval-utils.ts +47 -5
- package/src/providers/chat-message-normalization.ts +4 -11
- package/src/providers/cli-provider-instance.ts +651 -57
- package/src/providers/contracts.ts +105 -5
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +19 -5
- package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +419 -0
- package/src/providers/native-history/dispatcher.ts +231 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +30 -0
- package/src/providers/provider-instance.ts +9 -0
- package/src/providers/provider-loader.ts +585 -50
- package/src/providers/provider-schema.ts +31 -13
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +458 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +210 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +168 -0
- package/src/providers/spec/cli-adapter.ts +507 -0
- package/src/providers/spec/driver.ts +540 -0
- package/src/providers/spec/evaluator.ts +298 -0
- package/src/providers/spec/loader.ts +130 -0
- package/src/providers/spec/native-history-executor.ts +706 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/schema.gen.ts +511 -0
- package/src/providers/spec/schema.json +211 -0
- package/src/providers/spec/types.ts +231 -0
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +396 -0
- package/src/providers/version-archive.ts +38 -20
- package/src/repo-mesh-types.ts +112 -1
- package/src/sessions/registry.ts +3 -0
- package/src/shared-types.ts +45 -1
- package/src/status/builders.ts +24 -6
- package/src/status/reporter.ts +15 -0
- package/src/status/snapshot.ts +84 -25
- package/src/system/host-memory.ts +29 -12
- package/src/types.ts +5 -0
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/mesh/mesh-sync.ts +0 -111
package/dist/shared-types.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ import type { ActiveChatData as _ActiveChatData, ProviderErrorReason as _Provide
|
|
|
14
14
|
import type { WorkspaceEntry } from './config/workspaces.js';
|
|
15
15
|
import type { ProviderMeshCoordinatorConfig, ProviderResumeCapability } from './providers/contracts.js';
|
|
16
16
|
import type { GitCompactSummary, GitWorkspaceUpdate, WorkspaceGitSubscriptionParams } from './git/git-types.js';
|
|
17
|
+
import type { InteractivePrompt } from './providers/types/interactive-prompt.js';
|
|
17
18
|
export type { GitCommandName, GitCompactSummary, GitDiffSummary, GitFailureReason, GitFileChange, GitFileChangeStatus, GitRepoIdentity, GitRepoStatus, GitSnapshot, GitSnapshotCompareSummary, GitSnapshotReason, GitWorkspaceUpdate, WorkspaceGitSubscriptionParams, } from './git/git-types.js';
|
|
18
19
|
export interface SessionActiveChatData extends Omit<_ActiveChatData, 'messages'> {
|
|
19
20
|
messages?: _ActiveChatData['messages'];
|
|
@@ -49,6 +50,14 @@ export interface ReadChatSyncResult {
|
|
|
49
50
|
message: string;
|
|
50
51
|
buttons: string[];
|
|
51
52
|
} | null;
|
|
53
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
54
|
+
/**
|
|
55
|
+
* Chat source provenance from ChatSourceMachine (A2). Carries the
|
|
56
|
+
* selected source, transition cause, lock state, and legacy
|
|
57
|
+
* fallbackReason — opaque to the daemon-core, consumed by web-core
|
|
58
|
+
* for the source debug badge and SourceTimeline (A3).
|
|
59
|
+
*/
|
|
60
|
+
messageSource?: Record<string, unknown>;
|
|
52
61
|
}
|
|
53
62
|
export interface ProviderSummaryItem {
|
|
54
63
|
id: string;
|
|
@@ -268,6 +277,7 @@ export interface SessionEntry {
|
|
|
268
277
|
runtimeRecoveryState?: string | null;
|
|
269
278
|
resume?: ProviderResumeCapability;
|
|
270
279
|
activeChat: SessionActiveChatData | null;
|
|
280
|
+
activeInteractivePrompt?: InteractivePrompt | null;
|
|
271
281
|
capabilities?: SessionCapability[];
|
|
272
282
|
/** Effective message input/media support for this session. Defaults fail-closed to text-only. */
|
|
273
283
|
messageInput?: MessageInputSupport;
|
|
@@ -292,6 +302,11 @@ export interface SessionEntry {
|
|
|
292
302
|
seenCompletionMarker?: string;
|
|
293
303
|
surfaceHidden?: boolean;
|
|
294
304
|
settings?: Record<string, any>;
|
|
305
|
+
/** Set when this session is acting as a mesh coordinator for the given mesh. */
|
|
306
|
+
coordinator?: {
|
|
307
|
+
meshId: string;
|
|
308
|
+
role: 'coordinator';
|
|
309
|
+
};
|
|
295
310
|
meshQueueStats?: {
|
|
296
311
|
total?: number;
|
|
297
312
|
active?: number;
|
|
@@ -410,7 +425,33 @@ export interface AvailableProviderInfo {
|
|
|
410
425
|
lastVerification?: MachineProviderCheckResult;
|
|
411
426
|
/** Provider-declared Repo Mesh coordinator/MCP behavior. */
|
|
412
427
|
meshCoordinator?: ProviderMeshCoordinatorConfig;
|
|
413
|
-
|
|
428
|
+
/**
|
|
429
|
+
* Provider trust classification — derived from the on-disk layer the
|
|
430
|
+
* manifest came from and the shape of the manifest. Dashboards use
|
|
431
|
+
* this to render a trust badge and gate activation of
|
|
432
|
+
* `external-untrusted` providers behind a confirm modal.
|
|
433
|
+
*/
|
|
434
|
+
trust?: ProviderTrust;
|
|
435
|
+
/** Daemon-side human-readable description of the trust value. */
|
|
436
|
+
trustDescription?: string;
|
|
437
|
+
/** True when activation needs a user-side confirmation step. */
|
|
438
|
+
requiresConfirmation?: boolean;
|
|
439
|
+
/** Which on-disk layer the manifest lives in. */
|
|
440
|
+
sourceLayer?: 'user' | 'upstream' | 'external';
|
|
441
|
+
/** For external providers, the source-name namespace it came from. */
|
|
442
|
+
sourceName?: string | null;
|
|
443
|
+
/** Manifest-declared version, e.g. "1.2.1". */
|
|
444
|
+
providerVersion?: string;
|
|
445
|
+
/** Underlying executable name (CLI/binary providers). */
|
|
446
|
+
binary?: string;
|
|
447
|
+
/** Lifecycle label from the manifest: "Stable", "Beta", … */
|
|
448
|
+
status?: string;
|
|
449
|
+
/** One-line provider description from the manifest. */
|
|
450
|
+
details?: string;
|
|
451
|
+
/** Manifest-declared links: homepage, docs, repo, … */
|
|
452
|
+
links?: Record<string, string>;
|
|
453
|
+
}
|
|
454
|
+
export type ProviderTrust = 'user-custom' | 'trusted' | 'trusted-with-scripts' | 'external-safe' | 'external-untrusted';
|
|
414
455
|
export interface MachineProviderCheckResult {
|
|
415
456
|
ok: boolean;
|
|
416
457
|
stage?: 'detection' | 'runnable' | 'verification';
|
|
@@ -46,6 +46,8 @@ export declare class DaemonStatusReporter {
|
|
|
46
46
|
private lastStatusSentAt;
|
|
47
47
|
private statusPendingThrottle;
|
|
48
48
|
private lastP2PStatusHash;
|
|
49
|
+
private lastP2PStatusSentAt;
|
|
50
|
+
private p2pDebounceTimer;
|
|
49
51
|
private lastServerStatusHash;
|
|
50
52
|
private lastStatusSummary;
|
|
51
53
|
private statusTimer;
|
package/dist/types.d.ts
CHANGED
|
@@ -36,6 +36,11 @@ export interface ChatMessage {
|
|
|
36
36
|
index?: number;
|
|
37
37
|
timestamp?: number;
|
|
38
38
|
receivedAt?: number;
|
|
39
|
+
/** (A2.3) Monotonic sequence number per (session, source). Producer-asserted
|
|
40
|
+
* when emitted by v2-aware providers (transcript v2 schema); otherwise
|
|
41
|
+
* derived by the daemon from receivedAt/timestamp/index. ChatSourceMachine
|
|
42
|
+
* uses this as the native peak watermark for regression detection. */
|
|
43
|
+
sequence?: number;
|
|
39
44
|
_turnKey?: string;
|
|
40
45
|
/** Tool calls associated with this message */
|
|
41
46
|
toolCalls?: ToolCallInfo[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adhdev/daemon-core",
|
|
3
|
-
"version": "0.9.82-rc.
|
|
3
|
+
"version": "0.9.82-rc.181",
|
|
4
4
|
"description": "ADHDev daemon core — CDP, IDE detection, providers, command execution",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"scripts": {
|
|
28
28
|
"build": "tsup && npm run build:types",
|
|
29
29
|
"build:types": "tsc -p tsconfig.json --emitDeclarationOnly --declaration --declarationMap false",
|
|
30
|
-
"dev": "tsup --watch",
|
|
30
|
+
"dev": "tsup --watch --no-clean",
|
|
31
31
|
"test": "vitest run",
|
|
32
32
|
"test:watch": "vitest",
|
|
33
33
|
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
@@ -48,7 +48,11 @@
|
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@adhdev/session-host-core": "*",
|
|
50
50
|
"@agentclientprotocol/sdk": "^0.16.1",
|
|
51
|
+
"@xterm/headless": "^6.0.0",
|
|
51
52
|
"@xterm/xterm": "^6.0.0",
|
|
53
|
+
"ajv": "^8.20.0",
|
|
54
|
+
"ajv-formats": "^3.0.1",
|
|
55
|
+
"better-sqlite3": "^12.10.0",
|
|
52
56
|
"chalk": "^5.3.0",
|
|
53
57
|
"chokidar": "^4.0.3",
|
|
54
58
|
"conf": "^13.0.0",
|
|
@@ -60,6 +64,7 @@
|
|
|
60
64
|
"@adhdev/ghostty-vt-node": "*"
|
|
61
65
|
},
|
|
62
66
|
"devDependencies": {
|
|
67
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
63
68
|
"@types/js-yaml": "^4.0.9",
|
|
64
69
|
"@types/node": "^22.0.0",
|
|
65
70
|
"@types/ws": "^8.18.1",
|
|
@@ -19,7 +19,7 @@ import type { SessionRegistry } from '../sessions/registry.js';
|
|
|
19
19
|
import { reconcileIdeRuntimeSessions } from '../sessions/reconcile.js';
|
|
20
20
|
import { LOG } from '../logging/logger.js';
|
|
21
21
|
import type { AgentStreamState } from './types.js';
|
|
22
|
-
import { formatAutoApprovalMessage,
|
|
22
|
+
import { formatAutoApprovalMessage, pickAutoApprovalButton } from '../providers/approval-utils.js';
|
|
23
23
|
import type { ProviderModule } from '../providers/contracts.js';
|
|
24
24
|
import { buildRuntimeSystemChatMessage } from '../providers/chat-message-normalization.js';
|
|
25
25
|
|
|
@@ -210,8 +210,7 @@ export class AgentStreamPoller {
|
|
|
210
210
|
if (stream?.status === 'waiting_approval') {
|
|
211
211
|
const autoApprove = providerLoader.getSettings(stream.agentType).autoApprove !== false;
|
|
212
212
|
if (autoApprove && resolvedActiveSessionId) {
|
|
213
|
-
const
|
|
214
|
-
const { label: buttonLabel } = pickApprovalButton(stream.activeModal?.buttons, provider);
|
|
213
|
+
const { label: buttonLabel } = pickAutoApprovalButton(stream.activeModal?.buttons);
|
|
215
214
|
const approved = await agentStreamManager.resolveSessionAction(cdp, resolvedActiveSessionId, 'approve', buttonLabel);
|
|
216
215
|
if (approved) {
|
|
217
216
|
const effectId = [
|
|
@@ -37,6 +37,9 @@ import type { PtyTransportFactory } from '../cli-adapters/pty-transport.js';
|
|
|
37
37
|
import type { IdeProviderInstance } from '../providers/ide-provider-instance.js';
|
|
38
38
|
import { createDefaultGitCommandServices } from '../git/git-commands.js';
|
|
39
39
|
import { setupMeshEventForwarding } from '../mesh/mesh-events.js';
|
|
40
|
+
import { loadMeshCoordinatorRegistry } from '../mesh/coordinator-registry.js';
|
|
41
|
+
import { applyProcessHardening } from './process-hardening.js';
|
|
42
|
+
import { installProviderProcessShim } from '../providers/sdk/v1/sandbox/require-whitelist.js';
|
|
40
43
|
|
|
41
44
|
// ─── Init Config ───
|
|
42
45
|
|
|
@@ -129,8 +132,16 @@ export interface DaemonDevSupportOptions {
|
|
|
129
132
|
* 8. Start instance ticking
|
|
130
133
|
*/
|
|
131
134
|
export async function initDaemonComponents(config: DaemonInitConfig): Promise<DaemonComponents> {
|
|
135
|
+
// 0. Process-level hardening (must run before any provider script is loaded).
|
|
136
|
+
// Freezes built-in prototypes (Object/Array/Function/String/Number/Boolean/Promise)
|
|
137
|
+
// and shadows process.exit/kill/abort/binding/dlopen so provider-script callers
|
|
138
|
+
// throw instead of killing the daemon. See ./process-hardening.ts for details.
|
|
139
|
+
applyProcessHardening();
|
|
140
|
+
installProviderProcessShim();
|
|
141
|
+
|
|
132
142
|
// 1. Global log interceptor
|
|
133
143
|
installGlobalInterceptor();
|
|
144
|
+
loadMeshCoordinatorRegistry();
|
|
134
145
|
|
|
135
146
|
// 2. ProviderLoader (provider source mode from config.json)
|
|
136
147
|
const appConfig = loadConfig();
|
|
@@ -142,16 +153,11 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
|
|
|
142
153
|
userDir: appConfig.providerDir,
|
|
143
154
|
});
|
|
144
155
|
|
|
145
|
-
//
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
} catch (e: any) {
|
|
151
|
-
LOG.warn('Provider', `⚠ Failed to fetch providers: ${e?.message}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
156
|
+
// Boot-time auto-sync is intentionally disabled. The user picks which
|
|
157
|
+
// providers to install via the dashboard onboarding / Providers tab; the
|
|
158
|
+
// daemon ships empty and only contains what the user explicitly installs.
|
|
159
|
+
// Manual sync is still available via the install / check_provider_updates
|
|
160
|
+
// commands (and the REST endpoint at /api/v1/providers/updates).
|
|
155
161
|
providerLoader.loadAll();
|
|
156
162
|
providerLoader.registerToDetector();
|
|
157
163
|
|
|
@@ -309,6 +315,7 @@ export async function initDaemonComponents(config: DaemonInitConfig): Promise<Da
|
|
|
309
315
|
statusInstanceId: config.statusInstanceId,
|
|
310
316
|
statusVersion: config.statusVersion,
|
|
311
317
|
getMeshPeerConnectionStatus: config.getMeshPeerConnectionStatus,
|
|
318
|
+
dispatchMeshCommand: config.dispatchMeshCommand,
|
|
312
319
|
getCdpLogFn: config.getCdpLogFn || ((ideType: string) => LOG.forComponent(`CDP:${ideType}`).asLogFn()),
|
|
313
320
|
});
|
|
314
321
|
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-level hardening — boot-time mitigations against provider scripts.
|
|
3
|
+
*
|
|
4
|
+
* Provider scripts run in-process (see providers/sdk/v1/sandbox/README-design.ts).
|
|
5
|
+
* The require() whitelist (sandbox/require-whitelist.ts) blocks the obvious
|
|
6
|
+
* attack surfaces (no `child_process.exec`, no `fs.writeFile`, no `net`, etc.)
|
|
7
|
+
* but a malicious or buggy script can still:
|
|
8
|
+
*
|
|
9
|
+
* 1. Pollute Object.prototype to influence the daemon's downstream consumers
|
|
10
|
+
* (e.g. `Object.prototype.toString = () => '...'` makes every untagged
|
|
11
|
+
* object stringify to that value across the whole process).
|
|
12
|
+
* 2. Mutate Array/Function/String prototypes for similar effect.
|
|
13
|
+
* 3. Call `process.exit()` / `process.kill()` to kill the daemon.
|
|
14
|
+
*
|
|
15
|
+
* Sandbox isolation (isolated-vm) is the proper fix but has a real perf cost
|
|
16
|
+
* and a real marshalling-complexity cost. As a cheaper layer we just freeze
|
|
17
|
+
* the built-in prototypes at boot, which is irreversible and catches every
|
|
18
|
+
* prototype-pollution variant for the lifetime of the process.
|
|
19
|
+
*
|
|
20
|
+
* `applyProcessHardening()` is idempotent — calling it twice is a no-op the
|
|
21
|
+
* second time. The function intentionally swallows any "cannot redefine
|
|
22
|
+
* property" errors that would arise if some upstream code already froze
|
|
23
|
+
* the same prototype: the post-condition (prototype is frozen) is satisfied
|
|
24
|
+
* either way.
|
|
25
|
+
*
|
|
26
|
+
* Trade-offs:
|
|
27
|
+
* - Read-only access to prototype methods (`Object.prototype.hasOwnProperty.call`,
|
|
28
|
+
* `Array.prototype.slice.call`, etc.) is unaffected — only writes throw.
|
|
29
|
+
* - Some older npm libraries patch Array.prototype or Function.prototype at
|
|
30
|
+
* import time. If a daemon-core dep does this, the import will throw. The
|
|
31
|
+
* daemon-core vitest suite is the canonical regression check for this.
|
|
32
|
+
* - We deliberately do NOT freeze RegExp.prototype, Error.prototype, Map/Set
|
|
33
|
+
* prototypes, or Date.prototype because at least one of those tends to be
|
|
34
|
+
* mutated by mainstream test/runtime libs and the value of freezing them
|
|
35
|
+
* is low (no useful prototype-pollution attack surface).
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
let _hardened = false;
|
|
39
|
+
|
|
40
|
+
/** Prototypes that get frozen at boot. */
|
|
41
|
+
const HARDENED_PROTOS: Array<{ name: string; proto: object }> = [
|
|
42
|
+
{ name: 'Object', proto: Object.prototype },
|
|
43
|
+
{ name: 'Array', proto: Array.prototype },
|
|
44
|
+
{ name: 'Function', proto: Function.prototype },
|
|
45
|
+
{ name: 'String', proto: String.prototype },
|
|
46
|
+
{ name: 'Number', proto: Number.prototype },
|
|
47
|
+
{ name: 'Boolean', proto: Boolean.prototype },
|
|
48
|
+
{ name: 'Promise', proto: Promise.prototype },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Freeze the canonical built-in prototypes so provider scripts (and anything
|
|
53
|
+
* else running in this process) cannot mutate them. Idempotent.
|
|
54
|
+
*
|
|
55
|
+
* Returns the list of prototype names that were newly frozen — primarily for
|
|
56
|
+
* tests / observability. Already-frozen prototypes are not re-reported.
|
|
57
|
+
*/
|
|
58
|
+
export function applyProcessHardening(): string[] {
|
|
59
|
+
if (_hardened) return [];
|
|
60
|
+
_hardened = true;
|
|
61
|
+
|
|
62
|
+
const newlyFrozen: string[] = [];
|
|
63
|
+
for (const entry of HARDENED_PROTOS) {
|
|
64
|
+
if (Object.isFrozen(entry.proto)) continue;
|
|
65
|
+
try {
|
|
66
|
+
Object.freeze(entry.proto);
|
|
67
|
+
newlyFrozen.push(entry.name);
|
|
68
|
+
} catch {
|
|
69
|
+
// Some host/runtime combinations refuse to freeze a built-in
|
|
70
|
+
// prototype (e.g. it has a non-configurable accessor). We treat
|
|
71
|
+
// this as best-effort — log nothing here (logger not guaranteed
|
|
72
|
+
// to be initialized this early) and move on. Subsequent reads
|
|
73
|
+
// of `Object.isFrozen(proto)` will reveal the gap.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return newlyFrozen;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** For tests only — clears the internal "already hardened" flag. The
|
|
80
|
+
* prototypes themselves cannot be un-frozen, so this is mostly useful for
|
|
81
|
+
* testing the idempotency guard. */
|
|
82
|
+
export function _resetProcessHardeningForTest(): void {
|
|
83
|
+
_hardened = false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** For tests only — peek at the hardened state. */
|
|
87
|
+
export function _isProcessHardened(): boolean {
|
|
88
|
+
return _hardened;
|
|
89
|
+
}
|