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.
Files changed (180) hide show
  1. package/index.ts +21 -12
  2. package/package.json +1 -1
  3. package/packages/a2a-adapter/package.json +1 -1
  4. package/packages/agent-policy/package.json +1 -1
  5. package/packages/architecture-generator/package.json +1 -1
  6. package/packages/auth/package.json +1 -1
  7. package/packages/autonomous-refactor/package.json +1 -1
  8. package/packages/autonomous-runtime/package.json +1 -1
  9. package/packages/cache-strategy/package.json +1 -1
  10. package/packages/capability-registry/package.json +1 -1
  11. package/packages/checkpoint/package.json +1 -1
  12. package/packages/cli-plugin-sdk/package.json +1 -1
  13. package/packages/clipboard/package.json +1 -1
  14. package/packages/clipboard-plugin/package.json +1 -1
  15. package/packages/code-generation/package.json +1 -1
  16. package/packages/code-review/package.json +1 -1
  17. package/packages/codex-adapter/package.json +1 -1
  18. package/packages/codex-watcher/package.json +1 -1
  19. package/packages/config-capture/package.json +1 -1
  20. package/packages/connection-runtime/dist/index.d.ts +11 -0
  21. package/packages/connection-runtime/dist/index.js +11 -0
  22. package/packages/connection-runtime/dist/registry.d.ts +69 -0
  23. package/packages/connection-runtime/dist/registry.js +117 -0
  24. package/packages/connection-runtime/dist/supervisor.d.ts +89 -0
  25. package/packages/connection-runtime/dist/supervisor.js +169 -0
  26. package/packages/connection-runtime/dist/types.d.ts +70 -0
  27. package/packages/connection-runtime/dist/types.js +16 -0
  28. package/packages/connection-runtime/package.json +24 -0
  29. package/packages/connection-runtime/src/index.ts +12 -0
  30. package/packages/connection-runtime/src/registry.ts +142 -0
  31. package/packages/connection-runtime/src/supervisor.ts +224 -0
  32. package/packages/connection-runtime/src/types.ts +88 -0
  33. package/packages/context-compiler/package.json +1 -1
  34. package/packages/context-discovery/package.json +1 -1
  35. package/packages/context-manager/package.json +1 -1
  36. package/packages/contracts/dist/approvals.d.ts +273 -0
  37. package/packages/contracts/dist/approvals.js +93 -0
  38. package/packages/contracts/dist/base.d.ts +78 -0
  39. package/packages/contracts/dist/base.js +82 -0
  40. package/packages/contracts/dist/events.d.ts +99 -0
  41. package/packages/contracts/dist/events.js +65 -0
  42. package/packages/contracts/dist/index.d.ts +20 -0
  43. package/packages/contracts/dist/index.js +20 -0
  44. package/packages/contracts/dist/jobs.d.ts +234 -0
  45. package/packages/contracts/dist/jobs.js +79 -0
  46. package/packages/contracts/dist/notifications.d.ts +317 -0
  47. package/packages/contracts/dist/notifications.js +85 -0
  48. package/packages/contracts/dist/projects.d.ts +171 -0
  49. package/packages/contracts/dist/projects.js +62 -0
  50. package/packages/contracts/dist/sessions.d.ts +226 -0
  51. package/packages/contracts/dist/sessions.js +82 -0
  52. package/packages/contracts/package.json +24 -0
  53. package/packages/contracts/src/approvals.ts +115 -0
  54. package/packages/contracts/src/base.ts +126 -0
  55. package/packages/contracts/src/events.ts +78 -0
  56. package/packages/contracts/src/index.ts +21 -0
  57. package/packages/contracts/src/jobs.ts +101 -0
  58. package/packages/contracts/src/notifications.ts +104 -0
  59. package/packages/contracts/src/projects.ts +81 -0
  60. package/packages/contracts/src/sessions.ts +104 -0
  61. package/packages/cookie-sanitizer/package.json +1 -1
  62. package/packages/cost-optimizer/package.json +1 -1
  63. package/packages/dependency-analyzer/package.json +1 -1
  64. package/packages/django-plugin/package.json +1 -1
  65. package/packages/doc-generator/package.json +1 -1
  66. package/packages/durable-review/package.json +1 -1
  67. package/packages/e2e-tester/package.json +1 -1
  68. package/packages/evaluation-engine/package.json +1 -1
  69. package/packages/evaluation-runner/package.json +1 -1
  70. package/packages/event-bus/package.json +1 -1
  71. package/packages/event-sink/dist/index.d.ts +12 -0
  72. package/packages/event-sink/dist/index.js +12 -0
  73. package/packages/event-sink/dist/outbox.d.ts +51 -0
  74. package/packages/event-sink/dist/outbox.js +88 -0
  75. package/packages/event-sink/dist/projection.d.ts +41 -0
  76. package/packages/event-sink/dist/projection.js +62 -0
  77. package/packages/event-sink/dist/sink.d.ts +81 -0
  78. package/packages/event-sink/dist/sink.js +106 -0
  79. package/packages/event-sink/package.json +28 -0
  80. package/packages/event-sink/src/index.ts +15 -0
  81. package/packages/event-sink/src/outbox.ts +119 -0
  82. package/packages/event-sink/src/projection.ts +84 -0
  83. package/packages/event-sink/src/sink.ts +167 -0
  84. package/packages/event-store/package.json +1 -1
  85. package/packages/experience-replay/package.json +1 -1
  86. package/packages/feedback-collector/package.json +1 -1
  87. package/packages/file-copy-helper/package.json +1 -1
  88. package/packages/framework-detector/package.json +1 -1
  89. package/packages/framework-plugin-sdk/package.json +1 -1
  90. package/packages/frappe-plugin/package.json +1 -1
  91. package/packages/generic-web-plugin/package.json +1 -1
  92. package/packages/health-monitor/package.json +1 -1
  93. package/packages/intent-analyzer/package.json +1 -1
  94. package/packages/jev-judge/package.json +1 -1
  95. package/packages/knowledge-graph/package.json +1 -1
  96. package/packages/knowledge-retrieval/package.json +1 -1
  97. package/packages/laravel-plugin/package.json +1 -1
  98. package/packages/learning-engine/package.json +1 -1
  99. package/packages/mcp-adapter/package.json +1 -1
  100. package/packages/memory-engine/package.json +1 -1
  101. package/packages/milestone-manager/package.json +1 -1
  102. package/packages/model-registry/package.json +1 -1
  103. package/packages/nextjs-plugin/package.json +1 -1
  104. package/packages/notification/package.json +1 -1
  105. package/packages/observability/package.json +1 -1
  106. package/packages/okf-indexer/package.json +1 -1
  107. package/packages/paperclip-integration/package.json +1 -1
  108. package/packages/performance-optimizer/package.json +1 -1
  109. package/packages/permission-mode/dist/checker.d.ts +66 -0
  110. package/packages/permission-mode/dist/checker.js +64 -0
  111. package/packages/permission-mode/dist/index.d.ts +12 -0
  112. package/packages/permission-mode/dist/index.js +11 -0
  113. package/packages/permission-mode/dist/manager.d.ts +65 -0
  114. package/packages/permission-mode/dist/manager.js +91 -0
  115. package/packages/permission-mode/dist/mode.d.ts +31 -0
  116. package/packages/permission-mode/dist/mode.js +47 -0
  117. package/packages/permission-mode/package.json +24 -0
  118. package/packages/permission-mode/src/checker.ts +103 -0
  119. package/packages/permission-mode/src/index.ts +13 -0
  120. package/packages/permission-mode/src/manager.ts +154 -0
  121. package/packages/permission-mode/src/mode.ts +73 -0
  122. package/packages/privilege-broker/package.json +1 -1
  123. package/packages/project-analyzer/package.json +1 -1
  124. package/packages/project-bootstrap/package.json +1 -1
  125. package/packages/projection-engine/package.json +1 -1
  126. package/packages/prompt-compiler/package.json +1 -1
  127. package/packages/prompt-versioning/package.json +1 -1
  128. package/packages/provider-adapter-sdk/package.json +1 -1
  129. package/packages/provider-router/package.json +1 -1
  130. package/packages/provider-selector/package.json +1 -1
  131. package/packages/providers/package.json +1 -1
  132. package/packages/qdrant-skills/package.json +1 -1
  133. package/packages/quota-manager/package.json +1 -1
  134. package/packages/rate-limiter/package.json +1 -1
  135. package/packages/react-vite-plugin/package.json +1 -1
  136. package/packages/relay/dist/client.d.ts +53 -0
  137. package/packages/relay/dist/client.js +95 -0
  138. package/packages/relay/dist/index.d.ts +9 -0
  139. package/packages/relay/dist/index.js +8 -0
  140. package/packages/relay/dist/server.d.ts +58 -0
  141. package/packages/relay/dist/server.js +93 -0
  142. package/packages/relay/dist/types.d.ts +35 -0
  143. package/packages/relay/dist/types.js +4 -0
  144. package/packages/relay/package.json +24 -0
  145. package/packages/relay/src/client.ts +119 -0
  146. package/packages/relay/src/index.ts +10 -0
  147. package/packages/relay/src/server.ts +120 -0
  148. package/packages/relay/src/types.ts +38 -0
  149. package/packages/release-manager/package.json +1 -1
  150. package/packages/requirement-compiler/package.json +1 -1
  151. package/packages/runtime/package.json +1 -1
  152. package/packages/scheduler/package.json +1 -1
  153. package/packages/scheduler-adapter/package.json +1 -1
  154. package/packages/session/package.json +1 -1
  155. package/packages/session-api/package.json +1 -1
  156. package/packages/session-export/package.json +1 -1
  157. package/packages/shared-context/package.json +1 -1
  158. package/packages/skill-mcp-client/package.json +1 -1
  159. package/packages/skill-registry/package.json +1 -1
  160. package/packages/skills/package.json +1 -1
  161. package/packages/sprint-planner/package.json +1 -1
  162. package/packages/subscription-engine/package.json +1 -1
  163. package/packages/task-compiler/package.json +1 -1
  164. package/packages/telegram/package.json +1 -1
  165. package/packages/tencentdb-memory/package.json +1 -1
  166. package/packages/tencentdb-sync/package.json +1 -1
  167. package/packages/test-data-generator/package.json +1 -1
  168. package/packages/test-generator/package.json +1 -1
  169. package/packages/todo-bd-sync/package.json +1 -1
  170. package/packages/token-estimation/package.json +1 -1
  171. package/packages/token-optimizer/package.json +1 -1
  172. package/packages/trajectory/package.json +1 -1
  173. package/packages/tui/package.json +1 -1
  174. package/packages/types/package.json +1 -1
  175. package/packages/webmcp-tester/package.json +1 -1
  176. package/packages/wiki/package.json +1 -1
  177. package/packages/workflow-events/package.json +1 -1
  178. package/packages/workspace-scanner/package.json +1 -1
  179. package/packages/worktree/package.json +1 -1
  180. 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/privilege-broker",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Privilege Broker — capability registry and command executor for autonomous runtime (RFC-0101 §7)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/project-analyzer",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Project analysis system for pi-harness-runtime - detects frameworks, rules, and project structure",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/project-bootstrap",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Project scaffolding from typed ProjectSpec",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/projection-engine",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-compiler",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Deterministic prompt compiler for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/prompt-versioning",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "type": "module",
5
5
  "description": "Version control for prompts with rollback support (RFC-0019)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/provider-adapter-sdk",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "SDK for building, testing, and registering AI provider adapters",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-router",
3
- "version": "1.1.335",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/provider-selector",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Multi-Provider Selector — route requests by cost, quality, and latency (RFC-0012)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/providers",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "pi-harness-runtime — providers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/qdrant-skills",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Qdrant vector search integration for Hermes-style skill system",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/quota-manager",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "pi-harness-runtime — quota-manager",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/rate-limiter",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "type": "module",
5
5
  "description": "Rate limiting with token bucket algorithm (RFC-0023)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/react-vite-plugin",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "React/Vite framework analysis — components, config, TypeScript setup",
5
5
  "type": "module",
6
6
  "main": "./dist/index.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';
@@ -0,0 +1,8 @@
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';