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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-detector",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Framework detection system for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/framework-plugin-sdk",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Framework plugin SDK for pi-harness-runtime",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/frappe-plugin",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Frappe/ERPNext framework analysis — DocTypes, hooks, bench sites, site config",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/generic-web-plugin",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Generic web framework analysis — REST/GraphQL endpoints, OpenAPI, auth",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/health-monitor",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "type": "module",
5
5
  "description": "Health monitoring and auto-healing",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/intent-analyzer",
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-harness/jev-judge",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Jev Judge - Structured decision model for agent routing, E2E testing, and automated decisions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-graph",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Knowledge Graph extraction and provenance linking for SKILL.md files",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/knowledge-retrieval",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Knowledge retrieval via TencentDB-Agent-Memory MCP (RFC-0105)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/laravel-plugin",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Laravel framework analysis — artisan commands, Eloquent models, Blade",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/learning-engine",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Learning engine for extracting lessons from runtime execution (RFC-0058)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/mcp-adapter",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "type": "module",
5
5
  "description": "MCP server adapter for pi-harness — exposes harness capabilities as MCP tools/resources/prompts (RFC-0068)",
6
6
  "main": "dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/memory-engine",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Memory engine with OKF integration for durable knowledge management (RFC-0060)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/milestone-manager",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Track milestones and alerts when items are at risk",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/model-registry",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Model Registry for pi-harness-runtime — centralized model metadata with pricing",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/nextjs-plugin",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Next.js framework detection and analysis for pi-harness-runtime (RFC-0062)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/notification",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "pi-harness-runtime — notification",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi/observability",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Comprehensive observability system with structured logging, tracing, metrics, and alerting",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/okf-indexer",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "OKF document indexer for SKILL.md files (RFC-0106)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/paperclip-integration",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Paperclip API integration: poll agent inbox, route tasks to pi.dev, Telegram alerts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/performance-optimizer",
3
- "version": "1.1.335",
3
+ "version": "1.1.337",
4
4
  "description": "Performance optimization analyzer for pi-harness runtime (RFC-0056)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Permission Checker
3
+ *
4
+ * Checks if an action requires approval based on current permission mode.
5
+ */
6
+ import type { PermissionMode } from './mode.js';
7
+ /**
8
+ * Action that can be checked for permission
9
+ */
10
+ export interface Action {
11
+ /** Tool or command name */
12
+ tool: string;
13
+ /** File path if applicable */
14
+ file?: string;
15
+ /** Command string if applicable */
16
+ command?: string;
17
+ /** Additional context */
18
+ context?: Record<string, unknown>;
19
+ }
20
+ /**
21
+ * Permission check result
22
+ */
23
+ export interface PermissionCheck {
24
+ /** Whether approval is required */
25
+ requiresApproval: boolean;
26
+ /** Reason for approval requirement */
27
+ reason?: string;
28
+ /** Tool that triggered the check */
29
+ tool: string;
30
+ }
31
+ /**
32
+ * Permission Checker
33
+ */
34
+ export declare class PermissionChecker {
35
+ private mode;
36
+ private auditLog;
37
+ constructor(mode: PermissionMode);
38
+ /**
39
+ * Update the current permission mode
40
+ */
41
+ setMode(mode: PermissionMode): void;
42
+ /**
43
+ * Get current permission mode
44
+ */
45
+ getMode(): PermissionMode;
46
+ /**
47
+ * Check if an action requires approval
48
+ */
49
+ check(action: Action): PermissionCheck;
50
+ /**
51
+ * Check multiple actions
52
+ */
53
+ checkMany(actions: Action[]): PermissionCheck[];
54
+ /**
55
+ * Get audit log
56
+ */
57
+ getAuditLog(): Array<{
58
+ action: Action;
59
+ result: PermissionCheck;
60
+ timestamp: string;
61
+ }>;
62
+ /**
63
+ * Clear audit log
64
+ */
65
+ clearAuditLog(): void;
66
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Permission Checker
3
+ *
4
+ * Checks if an action requires approval based on current permission mode.
5
+ */
6
+ import { requiresApproval } from './mode.js';
7
+ /**
8
+ * Permission Checker
9
+ */
10
+ export class PermissionChecker {
11
+ mode;
12
+ auditLog = [];
13
+ constructor(mode) {
14
+ this.mode = mode;
15
+ }
16
+ /**
17
+ * Update the current permission mode
18
+ */
19
+ setMode(mode) {
20
+ this.mode = mode;
21
+ }
22
+ /**
23
+ * Get current permission mode
24
+ */
25
+ getMode() {
26
+ return { ...this.mode };
27
+ }
28
+ /**
29
+ * Check if an action requires approval
30
+ */
31
+ check(action) {
32
+ const needsApproval = requiresApproval(this.mode, action.tool);
33
+ const result = {
34
+ requiresApproval: needsApproval,
35
+ tool: action.tool,
36
+ reason: needsApproval ? `Tool "${action.tool}" requires approval in ${this.mode.type} mode` : undefined,
37
+ };
38
+ // Audit log
39
+ this.auditLog.push({
40
+ action,
41
+ result,
42
+ timestamp: new Date().toISOString(),
43
+ });
44
+ return result;
45
+ }
46
+ /**
47
+ * Check multiple actions
48
+ */
49
+ checkMany(actions) {
50
+ return actions.map(action => this.check(action));
51
+ }
52
+ /**
53
+ * Get audit log
54
+ */
55
+ getAuditLog() {
56
+ return [...this.auditLog];
57
+ }
58
+ /**
59
+ * Clear audit log
60
+ */
61
+ clearAuditLog() {
62
+ this.auditLog = [];
63
+ }
64
+ }
@@ -0,0 +1,12 @@
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
+ export { PermissionMode, type PermissionModeType } from './mode.js';
11
+ export { PermissionChecker } from './checker.js';
12
+ export { ApprovalManager } from './manager.js';
@@ -0,0 +1,11 @@
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
+ export { PermissionChecker } from './checker.js';
11
+ export { ApprovalManager } from './manager.js';
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Approval Manager
3
+ *
4
+ * Manages the approval workflow for pending actions.
5
+ */
6
+ /**
7
+ * Approval request interface
8
+ */
9
+ export interface ApprovalRequest {
10
+ type: string;
11
+ workspaceId: string;
12
+ sessionId: string;
13
+ description: string;
14
+ tool?: string;
15
+ command?: string;
16
+ file?: string;
17
+ reason?: string;
18
+ expiresIn?: number;
19
+ }
20
+ /**
21
+ * Approval response interface
22
+ */
23
+ export interface ApprovalResponse {
24
+ id: string;
25
+ approved: boolean;
26
+ reason?: string;
27
+ }
28
+ /**
29
+ * Pending approval entry
30
+ */
31
+ export interface PendingApproval {
32
+ id: string;
33
+ request: ApprovalRequest;
34
+ status: 'pending' | 'approved' | 'rejected' | 'expired';
35
+ createdAt: Date;
36
+ expiresAt?: Date;
37
+ respondedAt?: Date;
38
+ }
39
+ /**
40
+ * Approval manager options
41
+ */
42
+ export interface ApprovalManagerOptions {
43
+ defaultTimeout?: number;
44
+ onApprovalRequest?: (approval: PendingApproval) => void;
45
+ onApprovalGranted?: (approval: PendingApproval) => void;
46
+ onApprovalRejected?: (approval: PendingApproval) => void;
47
+ onApprovalExpired?: (approval: PendingApproval) => void;
48
+ }
49
+ /**
50
+ * Approval Manager
51
+ */
52
+ export declare class ApprovalManager {
53
+ private pending;
54
+ private options;
55
+ constructor(options?: ApprovalManagerOptions);
56
+ requestApproval(request: ApprovalRequest): PendingApproval;
57
+ respond(response: ApprovalResponse): PendingApproval | null;
58
+ getPending(): PendingApproval[];
59
+ get(id: string): PendingApproval | undefined;
60
+ hasPending(): boolean;
61
+ countPending(): number;
62
+ cancel(id: string): boolean;
63
+ private checkExpiration;
64
+ private generateId;
65
+ }
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Approval Manager
3
+ *
4
+ * Manages the approval workflow for pending actions.
5
+ */
6
+ /**
7
+ * Approval Manager
8
+ */
9
+ export class ApprovalManager {
10
+ pending = new Map();
11
+ options;
12
+ constructor(options = {}) {
13
+ this.options = {
14
+ defaultTimeout: options.defaultTimeout ?? 300,
15
+ onApprovalRequest: options.onApprovalRequest ?? (() => { }),
16
+ onApprovalGranted: options.onApprovalGranted ?? (() => { }),
17
+ onApprovalRejected: options.onApprovalRejected ?? (() => { }),
18
+ onApprovalExpired: options.onApprovalExpired ?? (() => { }),
19
+ };
20
+ }
21
+ requestApproval(request) {
22
+ const id = this.generateId();
23
+ const createdAt = new Date();
24
+ const timeoutSeconds = request.expiresIn ?? this.options.defaultTimeout;
25
+ const expiresAt = new Date(createdAt.getTime() + timeoutSeconds * 1000);
26
+ const approval = { id, request, status: 'pending', createdAt, expiresAt };
27
+ this.pending.set(id, approval);
28
+ this.options.onApprovalRequest(approval);
29
+ if (timeoutSeconds > 0) {
30
+ // SAFETY: globalThis always has setTimeout in JS runtimes (browsers, Node.js)
31
+ const global = globalThis;
32
+ global.setTimeout(() => this.checkExpiration(id), timeoutSeconds * 1000);
33
+ }
34
+ return approval;
35
+ }
36
+ respond(response) {
37
+ const approval = this.pending.get(response.id);
38
+ if (!approval)
39
+ return null;
40
+ approval.status = response.approved ? 'approved' : 'rejected';
41
+ approval.respondedAt = new Date();
42
+ if (response.approved) {
43
+ this.options.onApprovalGranted(approval);
44
+ }
45
+ else {
46
+ this.options.onApprovalRejected(approval);
47
+ }
48
+ // Remove from pending after a short delay
49
+ // SAFETY: globalThis always has setTimeout in JS runtimes
50
+ const global = globalThis;
51
+ global.setTimeout(() => this.pending.delete(response.id), 1000);
52
+ return approval;
53
+ }
54
+ getPending() {
55
+ return Array.from(this.pending.values()).filter(a => a.status === 'pending');
56
+ }
57
+ get(id) {
58
+ return this.pending.get(id);
59
+ }
60
+ hasPending() {
61
+ return this.getPending().length > 0;
62
+ }
63
+ countPending() {
64
+ return this.getPending().length;
65
+ }
66
+ cancel(id) {
67
+ const approval = this.pending.get(id);
68
+ if (approval && approval.status === 'pending') {
69
+ approval.status = 'rejected';
70
+ approval.respondedAt = new Date();
71
+ this.options.onApprovalRejected(approval);
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ checkExpiration(id) {
77
+ const approval = this.pending.get(id);
78
+ if (approval && approval.status === 'pending') {
79
+ const now = new Date();
80
+ if (approval.expiresAt && now >= approval.expiresAt) {
81
+ approval.status = 'expired';
82
+ approval.respondedAt = now;
83
+ this.pending.delete(id);
84
+ this.options.onApprovalExpired(approval);
85
+ }
86
+ }
87
+ }
88
+ generateId() {
89
+ return `approval-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
90
+ }
91
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Permission Mode Types
3
+ */
4
+ /**
5
+ * Permission mode types - inspired by T3Code
6
+ */
7
+ export type PermissionModeType = 'supervised' | 'auto-accept-edits' | 'auto' | 'full-access';
8
+ /**
9
+ * Permission mode configuration
10
+ */
11
+ export interface PermissionMode {
12
+ type: PermissionModeType;
13
+ /** Project override for this mode */
14
+ projectOverride?: string;
15
+ /** Auto-accept certain tools without approval */
16
+ autoAcceptTools?: string[];
17
+ /** Block certain tools regardless of mode */
18
+ blockedTools?: string[];
19
+ }
20
+ /**
21
+ * Default permission modes
22
+ */
23
+ export declare const DEFAULT_PERMISSION_MODES: Record<PermissionModeType, PermissionMode>;
24
+ /**
25
+ * Get default mode for new sessions
26
+ */
27
+ export declare function getDefaultMode(): PermissionMode;
28
+ /**
29
+ * Check if mode requires approval for tool
30
+ */
31
+ export declare function requiresApproval(mode: PermissionMode, tool: string): boolean;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Permission Mode Types
3
+ */
4
+ /**
5
+ * Default permission modes
6
+ */
7
+ export const DEFAULT_PERMISSION_MODES = {
8
+ supervised: {
9
+ type: 'supervised',
10
+ },
11
+ 'auto-accept-edits': {
12
+ type: 'auto-accept-edits',
13
+ autoAcceptTools: ['write', 'edit', 'create'],
14
+ },
15
+ auto: {
16
+ type: 'auto',
17
+ autoAcceptTools: ['read', 'search', 'list'],
18
+ },
19
+ 'full-access': {
20
+ type: 'full-access',
21
+ },
22
+ };
23
+ /**
24
+ * Get default mode for new sessions
25
+ */
26
+ export function getDefaultMode() {
27
+ return { ...DEFAULT_PERMISSION_MODES['full-access'] };
28
+ }
29
+ /**
30
+ * Check if mode requires approval for tool
31
+ */
32
+ export function requiresApproval(mode, tool) {
33
+ if (mode.blockedTools?.includes(tool)) {
34
+ return true;
35
+ }
36
+ switch (mode.type) {
37
+ case 'full-access':
38
+ return false;
39
+ case 'auto-accept-edits':
40
+ return !mode.autoAcceptTools?.includes(tool);
41
+ case 'auto':
42
+ return !mode.autoAcceptTools?.includes(tool);
43
+ case 'supervised':
44
+ default:
45
+ return true;
46
+ }
47
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@pi-harness/permission-mode",
3
+ "version": "1.1.337",
4
+ "type": "module",
5
+ "description": "Runtime permission modes for pi-harness - Supervised/Auto/Full-access",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "test": "bun test"
17
+ },
18
+ "dependencies": {
19
+ "@pi-harness/contracts": "workspace:*"
20
+ },
21
+ "devDependencies": {
22
+ "typescript": "^5.7.2"
23
+ }
24
+ }