pi-harness-runtime 1.1.335 → 1.1.337
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/index.ts +21 -12
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/connection-runtime/dist/index.d.ts +11 -0
- package/packages/connection-runtime/dist/index.js +11 -0
- package/packages/connection-runtime/dist/registry.d.ts +69 -0
- package/packages/connection-runtime/dist/registry.js +117 -0
- package/packages/connection-runtime/dist/supervisor.d.ts +89 -0
- package/packages/connection-runtime/dist/supervisor.js +169 -0
- package/packages/connection-runtime/dist/types.d.ts +70 -0
- package/packages/connection-runtime/dist/types.js +16 -0
- package/packages/connection-runtime/package.json +24 -0
- package/packages/connection-runtime/src/index.ts +12 -0
- package/packages/connection-runtime/src/registry.ts +142 -0
- package/packages/connection-runtime/src/supervisor.ts +224 -0
- package/packages/connection-runtime/src/types.ts +88 -0
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/contracts/dist/approvals.d.ts +273 -0
- package/packages/contracts/dist/approvals.js +93 -0
- package/packages/contracts/dist/base.d.ts +78 -0
- package/packages/contracts/dist/base.js +82 -0
- package/packages/contracts/dist/events.d.ts +99 -0
- package/packages/contracts/dist/events.js +65 -0
- package/packages/contracts/dist/index.d.ts +20 -0
- package/packages/contracts/dist/index.js +20 -0
- package/packages/contracts/dist/jobs.d.ts +234 -0
- package/packages/contracts/dist/jobs.js +79 -0
- package/packages/contracts/dist/notifications.d.ts +317 -0
- package/packages/contracts/dist/notifications.js +85 -0
- package/packages/contracts/dist/projects.d.ts +171 -0
- package/packages/contracts/dist/projects.js +62 -0
- package/packages/contracts/dist/sessions.d.ts +226 -0
- package/packages/contracts/dist/sessions.js +82 -0
- package/packages/contracts/package.json +24 -0
- package/packages/contracts/src/approvals.ts +115 -0
- package/packages/contracts/src/base.ts +126 -0
- package/packages/contracts/src/events.ts +78 -0
- package/packages/contracts/src/index.ts +21 -0
- package/packages/contracts/src/jobs.ts +101 -0
- package/packages/contracts/src/notifications.ts +104 -0
- package/packages/contracts/src/projects.ts +81 -0
- package/packages/contracts/src/sessions.ts +104 -0
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/package.json +1 -1
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-sink/dist/index.d.ts +12 -0
- package/packages/event-sink/dist/index.js +12 -0
- package/packages/event-sink/dist/outbox.d.ts +51 -0
- package/packages/event-sink/dist/outbox.js +88 -0
- package/packages/event-sink/dist/projection.d.ts +41 -0
- package/packages/event-sink/dist/projection.js +62 -0
- package/packages/event-sink/dist/sink.d.ts +81 -0
- package/packages/event-sink/dist/sink.js +106 -0
- package/packages/event-sink/package.json +28 -0
- package/packages/event-sink/src/index.ts +15 -0
- package/packages/event-sink/src/outbox.ts +119 -0
- package/packages/event-sink/src/projection.ts +84 -0
- package/packages/event-sink/src/sink.ts +167 -0
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/permission-mode/dist/checker.d.ts +66 -0
- package/packages/permission-mode/dist/checker.js +64 -0
- package/packages/permission-mode/dist/index.d.ts +12 -0
- package/packages/permission-mode/dist/index.js +11 -0
- package/packages/permission-mode/dist/manager.d.ts +65 -0
- package/packages/permission-mode/dist/manager.js +91 -0
- package/packages/permission-mode/dist/mode.d.ts +31 -0
- package/packages/permission-mode/dist/mode.js +47 -0
- package/packages/permission-mode/package.json +24 -0
- package/packages/permission-mode/src/checker.ts +103 -0
- package/packages/permission-mode/src/index.ts +13 -0
- package/packages/permission-mode/src/manager.ts +154 -0
- package/packages/permission-mode/src/mode.ts +73 -0
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/relay/dist/client.d.ts +53 -0
- package/packages/relay/dist/client.js +95 -0
- package/packages/relay/dist/index.d.ts +9 -0
- package/packages/relay/dist/index.js +8 -0
- package/packages/relay/dist/server.d.ts +58 -0
- package/packages/relay/dist/server.js +93 -0
- package/packages/relay/dist/types.d.ts +35 -0
- package/packages/relay/dist/types.js +4 -0
- package/packages/relay/package.json +24 -0
- package/packages/relay/src/client.ts +119 -0
- package/packages/relay/src/index.ts +10 -0
- package/packages/relay/src/server.ts +120 -0
- package/packages/relay/src/types.ts +38 -0
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/telegram/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/wiki/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Checker
|
|
3
|
+
*
|
|
4
|
+
* Checks if an action requires approval based on current permission mode.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { PermissionMode } from './mode.js';
|
|
8
|
+
import { requiresApproval } from './mode.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Action that can be checked for permission
|
|
12
|
+
*/
|
|
13
|
+
export interface Action {
|
|
14
|
+
/** Tool or command name */
|
|
15
|
+
tool: string;
|
|
16
|
+
/** File path if applicable */
|
|
17
|
+
file?: string;
|
|
18
|
+
/** Command string if applicable */
|
|
19
|
+
command?: string;
|
|
20
|
+
/** Additional context */
|
|
21
|
+
context?: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Permission check result
|
|
26
|
+
*/
|
|
27
|
+
export interface PermissionCheck {
|
|
28
|
+
/** Whether approval is required */
|
|
29
|
+
requiresApproval: boolean;
|
|
30
|
+
/** Reason for approval requirement */
|
|
31
|
+
reason?: string;
|
|
32
|
+
/** Tool that triggered the check */
|
|
33
|
+
tool: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Permission Checker
|
|
38
|
+
*/
|
|
39
|
+
export class PermissionChecker {
|
|
40
|
+
private mode: PermissionMode;
|
|
41
|
+
private auditLog: Array<{ action: Action; result: PermissionCheck; timestamp: string }> = [];
|
|
42
|
+
|
|
43
|
+
constructor(mode: PermissionMode) {
|
|
44
|
+
this.mode = mode;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Update the current permission mode
|
|
49
|
+
*/
|
|
50
|
+
setMode(mode: PermissionMode): void {
|
|
51
|
+
this.mode = mode;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get current permission mode
|
|
56
|
+
*/
|
|
57
|
+
getMode(): PermissionMode {
|
|
58
|
+
return { ...this.mode };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Check if an action requires approval
|
|
63
|
+
*/
|
|
64
|
+
check(action: Action): PermissionCheck {
|
|
65
|
+
const needsApproval = requiresApproval(this.mode, action.tool);
|
|
66
|
+
|
|
67
|
+
const result: PermissionCheck = {
|
|
68
|
+
requiresApproval: needsApproval,
|
|
69
|
+
tool: action.tool,
|
|
70
|
+
reason: needsApproval ? `Tool "${action.tool}" requires approval in ${this.mode.type} mode` : undefined,
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Audit log
|
|
74
|
+
this.auditLog.push({
|
|
75
|
+
action,
|
|
76
|
+
result,
|
|
77
|
+
timestamp: new Date().toISOString(),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Check multiple actions
|
|
85
|
+
*/
|
|
86
|
+
checkMany(actions: Action[]): PermissionCheck[] {
|
|
87
|
+
return actions.map(action => this.check(action));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get audit log
|
|
92
|
+
*/
|
|
93
|
+
getAuditLog(): Array<{ action: Action; result: PermissionCheck; timestamp: string }> {
|
|
94
|
+
return [...this.auditLog];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Clear audit log
|
|
99
|
+
*/
|
|
100
|
+
clearAuditLog(): void {
|
|
101
|
+
this.auditLog = [];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Mode - Runtime approval system
|
|
3
|
+
*
|
|
4
|
+
* Inspired by T3Code's permission modes:
|
|
5
|
+
* - Supervised: Requests approval for commands/edits
|
|
6
|
+
* - Auto-accept edits: Approves edits, questions still need approval
|
|
7
|
+
* - Auto: Uses automatic review for routine actions
|
|
8
|
+
* - Full access: No approval needed
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export { PermissionMode, type PermissionModeType } from './mode.js';
|
|
12
|
+
export { PermissionChecker } from './checker.js';
|
|
13
|
+
export { ApprovalManager } from './manager.js';
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the approval workflow for pending actions.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Approval request interface
|
|
9
|
+
*/
|
|
10
|
+
export interface ApprovalRequest {
|
|
11
|
+
type: string;
|
|
12
|
+
workspaceId: string;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
description: string;
|
|
15
|
+
tool?: string;
|
|
16
|
+
command?: string;
|
|
17
|
+
file?: string;
|
|
18
|
+
reason?: string;
|
|
19
|
+
expiresIn?: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Approval response interface
|
|
24
|
+
*/
|
|
25
|
+
export interface ApprovalResponse {
|
|
26
|
+
id: string;
|
|
27
|
+
approved: boolean;
|
|
28
|
+
reason?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Pending approval entry
|
|
33
|
+
*/
|
|
34
|
+
export interface PendingApproval {
|
|
35
|
+
id: string;
|
|
36
|
+
request: ApprovalRequest;
|
|
37
|
+
status: 'pending' | 'approved' | 'rejected' | 'expired';
|
|
38
|
+
createdAt: Date;
|
|
39
|
+
expiresAt?: Date;
|
|
40
|
+
respondedAt?: Date;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Approval manager options
|
|
45
|
+
*/
|
|
46
|
+
export interface ApprovalManagerOptions {
|
|
47
|
+
defaultTimeout?: number;
|
|
48
|
+
onApprovalRequest?: (approval: PendingApproval) => void;
|
|
49
|
+
onApprovalGranted?: (approval: PendingApproval) => void;
|
|
50
|
+
onApprovalRejected?: (approval: PendingApproval) => void;
|
|
51
|
+
onApprovalExpired?: (approval: PendingApproval) => void;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Approval Manager
|
|
56
|
+
*/
|
|
57
|
+
export class ApprovalManager {
|
|
58
|
+
private pending = new Map<string, PendingApproval>();
|
|
59
|
+
private options: Required<ApprovalManagerOptions>;
|
|
60
|
+
|
|
61
|
+
constructor(options: ApprovalManagerOptions = {}) {
|
|
62
|
+
this.options = {
|
|
63
|
+
defaultTimeout: options.defaultTimeout ?? 300,
|
|
64
|
+
onApprovalRequest: options.onApprovalRequest ?? (() => {}),
|
|
65
|
+
onApprovalGranted: options.onApprovalGranted ?? (() => {}),
|
|
66
|
+
onApprovalRejected: options.onApprovalRejected ?? (() => {}),
|
|
67
|
+
onApprovalExpired: options.onApprovalExpired ?? (() => {}),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
requestApproval(request: ApprovalRequest): PendingApproval {
|
|
72
|
+
const id = this.generateId();
|
|
73
|
+
const createdAt = new Date();
|
|
74
|
+
const timeoutSeconds = request.expiresIn ?? this.options.defaultTimeout;
|
|
75
|
+
const expiresAt = new Date(createdAt.getTime() + timeoutSeconds * 1000);
|
|
76
|
+
|
|
77
|
+
const approval: PendingApproval = { id, request, status: 'pending', createdAt, expiresAt };
|
|
78
|
+
this.pending.set(id, approval);
|
|
79
|
+
this.options.onApprovalRequest(approval);
|
|
80
|
+
|
|
81
|
+
if (timeoutSeconds > 0) {
|
|
82
|
+
// SAFETY: globalThis always has setTimeout in JS runtimes (browsers, Node.js)
|
|
83
|
+
const global = globalThis as unknown as { setTimeout: (fn: () => void, ms: number) => void };
|
|
84
|
+
global.setTimeout(() => this.checkExpiration(id), timeoutSeconds * 1000);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return approval;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
respond(response: ApprovalResponse): PendingApproval | null {
|
|
91
|
+
const approval = this.pending.get(response.id);
|
|
92
|
+
if (!approval) return null;
|
|
93
|
+
|
|
94
|
+
approval.status = response.approved ? 'approved' : 'rejected';
|
|
95
|
+
approval.respondedAt = new Date();
|
|
96
|
+
|
|
97
|
+
if (response.approved) {
|
|
98
|
+
this.options.onApprovalGranted(approval);
|
|
99
|
+
} else {
|
|
100
|
+
this.options.onApprovalRejected(approval);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Remove from pending after a short delay
|
|
104
|
+
// SAFETY: globalThis always has setTimeout in JS runtimes
|
|
105
|
+
const global = globalThis as unknown as { setTimeout: (fn: () => void, ms: number) => void };
|
|
106
|
+
global.setTimeout(() => this.pending.delete(response.id), 1000);
|
|
107
|
+
|
|
108
|
+
return approval;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
getPending(): PendingApproval[] {
|
|
112
|
+
return Array.from(this.pending.values()).filter(a => a.status === 'pending');
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
get(id: string): PendingApproval | undefined {
|
|
116
|
+
return this.pending.get(id);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
hasPending(): boolean {
|
|
120
|
+
return this.getPending().length > 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
countPending(): number {
|
|
124
|
+
return this.getPending().length;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
cancel(id: string): boolean {
|
|
128
|
+
const approval = this.pending.get(id);
|
|
129
|
+
if (approval && approval.status === 'pending') {
|
|
130
|
+
approval.status = 'rejected';
|
|
131
|
+
approval.respondedAt = new Date();
|
|
132
|
+
this.options.onApprovalRejected(approval);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
private checkExpiration(id: string): void {
|
|
139
|
+
const approval = this.pending.get(id);
|
|
140
|
+
if (approval && approval.status === 'pending') {
|
|
141
|
+
const now = new Date();
|
|
142
|
+
if (approval.expiresAt && now >= approval.expiresAt) {
|
|
143
|
+
approval.status = 'expired';
|
|
144
|
+
approval.respondedAt = now;
|
|
145
|
+
this.pending.delete(id);
|
|
146
|
+
this.options.onApprovalExpired(approval);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private generateId(): string {
|
|
152
|
+
return `approval-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Mode Types
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Permission mode types - inspired by T3Code
|
|
7
|
+
*/
|
|
8
|
+
export type PermissionModeType =
|
|
9
|
+
| 'supervised' // Requests approval for all commands/edits
|
|
10
|
+
| 'auto-accept-edits' // Approves file edits, questions need approval
|
|
11
|
+
| 'auto' // Uses automatic review for routine actions
|
|
12
|
+
| 'full-access'; // No approval needed
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Permission mode configuration
|
|
16
|
+
*/
|
|
17
|
+
export interface PermissionMode {
|
|
18
|
+
type: PermissionModeType;
|
|
19
|
+
/** Project override for this mode */
|
|
20
|
+
projectOverride?: string;
|
|
21
|
+
/** Auto-accept certain tools without approval */
|
|
22
|
+
autoAcceptTools?: string[];
|
|
23
|
+
/** Block certain tools regardless of mode */
|
|
24
|
+
blockedTools?: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Default permission modes
|
|
29
|
+
*/
|
|
30
|
+
export const DEFAULT_PERMISSION_MODES: Record<PermissionModeType, PermissionMode> = {
|
|
31
|
+
supervised: {
|
|
32
|
+
type: 'supervised',
|
|
33
|
+
},
|
|
34
|
+
'auto-accept-edits': {
|
|
35
|
+
type: 'auto-accept-edits',
|
|
36
|
+
autoAcceptTools: ['write', 'edit', 'create'],
|
|
37
|
+
},
|
|
38
|
+
auto: {
|
|
39
|
+
type: 'auto',
|
|
40
|
+
autoAcceptTools: ['read', 'search', 'list'],
|
|
41
|
+
},
|
|
42
|
+
'full-access': {
|
|
43
|
+
type: 'full-access',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get default mode for new sessions
|
|
49
|
+
*/
|
|
50
|
+
export function getDefaultMode(): PermissionMode {
|
|
51
|
+
return { ...DEFAULT_PERMISSION_MODES['full-access'] };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Check if mode requires approval for tool
|
|
56
|
+
*/
|
|
57
|
+
export function requiresApproval(mode: PermissionMode, tool: string): boolean {
|
|
58
|
+
if (mode.blockedTools?.includes(tool)) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
switch (mode.type) {
|
|
63
|
+
case 'full-access':
|
|
64
|
+
return false;
|
|
65
|
+
case 'auto-accept-edits':
|
|
66
|
+
return !mode.autoAcceptTools?.includes(tool);
|
|
67
|
+
case 'auto':
|
|
68
|
+
return !mode.autoAcceptTools?.includes(tool);
|
|
69
|
+
case 'supervised':
|
|
70
|
+
default:
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/provider-router",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.337",
|
|
4
4
|
"description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/provider-router.js",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relay Client - Connect to relay server for remote access
|
|
3
|
+
*/
|
|
4
|
+
import type { RelayConfig, RelayTunnel, RelayMessage } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Relay Client options
|
|
7
|
+
*/
|
|
8
|
+
export interface RelayClientOptions {
|
|
9
|
+
/** Called when connected */
|
|
10
|
+
onConnected?: () => void;
|
|
11
|
+
/** Called when disconnected */
|
|
12
|
+
onDisconnected?: () => void;
|
|
13
|
+
/** Called when tunnel is established */
|
|
14
|
+
onTunnel?: (tunnel: RelayTunnel) => void;
|
|
15
|
+
/** Called on error */
|
|
16
|
+
onError?: (error: Error) => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Relay Client
|
|
20
|
+
*
|
|
21
|
+
* Connects to a relay server and establishes tunnels for remote access.
|
|
22
|
+
*/
|
|
23
|
+
export declare class RelayClient {
|
|
24
|
+
private config;
|
|
25
|
+
private options;
|
|
26
|
+
private connected;
|
|
27
|
+
private tunnel?;
|
|
28
|
+
constructor(config: RelayConfig, options: RelayClientOptions);
|
|
29
|
+
/**
|
|
30
|
+
* Connect to relay server
|
|
31
|
+
*/
|
|
32
|
+
connect(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Disconnect from relay server
|
|
35
|
+
*/
|
|
36
|
+
disconnect(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Create a tunnel
|
|
39
|
+
*/
|
|
40
|
+
createTunnel(localPort: number): Promise<RelayTunnel>;
|
|
41
|
+
/**
|
|
42
|
+
* Send a message through the tunnel
|
|
43
|
+
*/
|
|
44
|
+
send(_message: RelayMessage): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if connected
|
|
47
|
+
*/
|
|
48
|
+
isConnected(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get current tunnel
|
|
51
|
+
*/
|
|
52
|
+
getTunnel(): RelayTunnel | undefined;
|
|
53
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relay Client - Connect to relay server for remote access
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate a UUID v4
|
|
6
|
+
*/
|
|
7
|
+
function generateUUID() {
|
|
8
|
+
// Use crypto.randomUUID if available (Node.js 14.17+)
|
|
9
|
+
const crypto = globalThis;
|
|
10
|
+
if (crypto.crypto?.randomUUID) {
|
|
11
|
+
return crypto.crypto.randomUUID();
|
|
12
|
+
}
|
|
13
|
+
// Fallback: simple UUID generation
|
|
14
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
15
|
+
const r = (Math.random() * 16) | 0;
|
|
16
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
17
|
+
return v.toString(16);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Relay Client
|
|
22
|
+
*
|
|
23
|
+
* Connects to a relay server and establishes tunnels for remote access.
|
|
24
|
+
*/
|
|
25
|
+
export class RelayClient {
|
|
26
|
+
config;
|
|
27
|
+
options;
|
|
28
|
+
connected = false;
|
|
29
|
+
tunnel;
|
|
30
|
+
constructor(config, options) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.options = options;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Connect to relay server
|
|
36
|
+
*/
|
|
37
|
+
async connect() {
|
|
38
|
+
if (this.connected)
|
|
39
|
+
return;
|
|
40
|
+
try {
|
|
41
|
+
// In a real implementation, this would establish WebSocket connection
|
|
42
|
+
// to the relay server and authenticate
|
|
43
|
+
this.connected = true;
|
|
44
|
+
this.options.onConnected?.();
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
this.options.onError?.(error);
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Disconnect from relay server
|
|
53
|
+
*/
|
|
54
|
+
async disconnect() {
|
|
55
|
+
this.connected = false;
|
|
56
|
+
this.tunnel = undefined;
|
|
57
|
+
this.options.onDisconnected?.();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a tunnel
|
|
61
|
+
*/
|
|
62
|
+
async createTunnel(localPort) {
|
|
63
|
+
const tunnel = {
|
|
64
|
+
id: generateUUID(),
|
|
65
|
+
url: `${this.config.serverUrl}/tunnel/${localPort}`,
|
|
66
|
+
localPort,
|
|
67
|
+
status: this.connected ? 'connected' : 'disconnected',
|
|
68
|
+
createdAt: new Date().toISOString(),
|
|
69
|
+
};
|
|
70
|
+
this.tunnel = tunnel;
|
|
71
|
+
this.options.onTunnel?.(tunnel);
|
|
72
|
+
return tunnel;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Send a message through the tunnel
|
|
76
|
+
*/
|
|
77
|
+
async send(_message) {
|
|
78
|
+
if (!this.connected) {
|
|
79
|
+
throw new Error('Not connected to relay server');
|
|
80
|
+
}
|
|
81
|
+
// In a real implementation, this would send the message over WebSocket
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Check if connected
|
|
85
|
+
*/
|
|
86
|
+
isConnected() {
|
|
87
|
+
return this.connected;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get current tunnel
|
|
91
|
+
*/
|
|
92
|
+
getTunnel() {
|
|
93
|
+
return this.tunnel;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Relay - T3 Connect Style
|
|
3
|
+
*
|
|
4
|
+
* Enables remote access to pi-harness without router/port forwarding.
|
|
5
|
+
* Based on T3Code's T3 Connect architecture.
|
|
6
|
+
*/
|
|
7
|
+
export { RelayServer } from './server.js';
|
|
8
|
+
export { RelayClient } from './client.js';
|
|
9
|
+
export { RelayConfig, RelayTunnel } from './types.js';
|