@dyyz1993/pi-coding-agent 0.74.23 → 0.74.25

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 (142) hide show
  1. package/dist/extensions/agent-permissions/index.ts +235 -0
  2. package/dist/extensions/ask-tools/index.ts +115 -0
  3. package/dist/extensions/auto-memory/contract.d.ts +51 -0
  4. package/dist/extensions/auto-memory/contract.d.ts.map +1 -0
  5. package/dist/extensions/auto-memory/contract.js +2 -0
  6. package/dist/extensions/auto-memory/contract.js.map +1 -0
  7. package/dist/extensions/auto-memory/contract.ts +56 -0
  8. package/dist/extensions/auto-memory/index.ts +969 -0
  9. package/dist/extensions/auto-memory/prompts.ts +202 -0
  10. package/dist/extensions/auto-memory/skip-rules.ts +297 -0
  11. package/dist/extensions/auto-memory/utils.ts +208 -0
  12. package/dist/extensions/auto-session-title/index.ts +83 -0
  13. package/dist/extensions/bash-ext/contract.d.ts +79 -0
  14. package/dist/extensions/bash-ext/contract.d.ts.map +1 -0
  15. package/dist/extensions/bash-ext/contract.js +2 -0
  16. package/dist/extensions/bash-ext/contract.js.map +1 -0
  17. package/dist/extensions/bash-ext/contract.ts +69 -0
  18. package/dist/extensions/bash-ext/index.ts +858 -0
  19. package/dist/extensions/claude-hooks-compat/config-loader.ts +49 -0
  20. package/dist/extensions/claude-hooks-compat/handler-runner.ts +377 -0
  21. package/dist/extensions/claude-hooks-compat/if-parser.ts +53 -0
  22. package/dist/extensions/claude-hooks-compat/index.ts +178 -0
  23. package/dist/extensions/claude-hooks-compat/matcher.ts +17 -0
  24. package/dist/extensions/claude-hooks-compat/stdin-builder.ts +27 -0
  25. package/dist/extensions/claude-hooks-compat/types.ts +77 -0
  26. package/dist/extensions/compaction-manager/config.ts +47 -0
  27. package/dist/extensions/compaction-manager/context-fold.ts +63 -0
  28. package/dist/extensions/compaction-manager/index.ts +151 -0
  29. package/dist/extensions/compaction-manager/microcompact.ts +49 -0
  30. package/dist/extensions/compaction-manager/reactive.ts +9 -0
  31. package/dist/extensions/compaction-manager/session-memory.ts +48 -0
  32. package/dist/extensions/coordinator/INTEGRATION.md +376 -0
  33. package/dist/extensions/coordinator/handler.test.ts +277 -0
  34. package/dist/extensions/coordinator/handler.ts +189 -0
  35. package/dist/extensions/coordinator/index.ts +261 -0
  36. package/dist/extensions/coordinator/types.d.ts +100 -0
  37. package/dist/extensions/coordinator/types.d.ts.map +1 -0
  38. package/dist/extensions/coordinator/types.js +2 -0
  39. package/dist/extensions/coordinator/types.js.map +1 -0
  40. package/dist/extensions/coordinator/types.ts +72 -0
  41. package/dist/extensions/file-snapshot/index.ts +131 -0
  42. package/dist/extensions/file-time-guard/README.md +133 -0
  43. package/dist/extensions/file-time-guard/config.ts +13 -0
  44. package/dist/extensions/file-time-guard/index.ts +171 -0
  45. package/dist/extensions/hooks-engine/index.ts +117 -0
  46. package/dist/extensions/lsp/lsp/client/file-tracker.ts +70 -0
  47. package/dist/extensions/lsp/lsp/client/registry.ts +305 -0
  48. package/dist/extensions/lsp/lsp/client/runtime.ts +832 -0
  49. package/dist/extensions/lsp/lsp/config/resolver.ts +573 -0
  50. package/dist/extensions/lsp/lsp/contract.d.ts +101 -0
  51. package/dist/extensions/lsp/lsp/contract.d.ts.map +1 -0
  52. package/dist/extensions/lsp/lsp/contract.js +2 -0
  53. package/dist/extensions/lsp/lsp/contract.js.map +1 -0
  54. package/dist/extensions/lsp/lsp/contract.ts +103 -0
  55. package/dist/extensions/lsp/lsp/hooks/agent-end.ts +169 -0
  56. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.d.ts +10 -0
  57. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.d.ts.map +1 -0
  58. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.js +30 -0
  59. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.js.map +1 -0
  60. package/dist/extensions/lsp/lsp/hooks/diagnostics-mode.ts +41 -0
  61. package/dist/extensions/lsp/lsp/hooks/writethrough.ts +342 -0
  62. package/dist/extensions/lsp/lsp/index.ts +307 -0
  63. package/dist/extensions/lsp/lsp/lsp.test.ts +684 -0
  64. package/dist/extensions/lsp/lsp/monitoring/server-metrics.ts +176 -0
  65. package/dist/extensions/lsp/lsp/tools/lsp-tool.ts +402 -0
  66. package/dist/extensions/lsp/lsp/utils/dependency-resolver.ts +147 -0
  67. package/dist/extensions/lsp/lsp/utils/diagnostics-wait.ts +41 -0
  68. package/dist/extensions/lsp/lsp/utils/lsp-helpers.d.ts +20 -0
  69. package/dist/extensions/lsp/lsp/utils/lsp-helpers.d.ts.map +1 -0
  70. package/dist/extensions/lsp/lsp/utils/lsp-helpers.js +64 -0
  71. package/dist/extensions/lsp/lsp/utils/lsp-helpers.js.map +1 -0
  72. package/dist/extensions/lsp/lsp/utils/lsp-helpers.ts +76 -0
  73. package/dist/extensions/message-bridge/GUIDE.md +210 -0
  74. package/dist/extensions/message-bridge/index.ts +222 -0
  75. package/dist/extensions/output-guard/index.ts +384 -0
  76. package/dist/extensions/preview/index.ts +278 -0
  77. package/dist/extensions/rules-engine/MATCH_HISTORY_RECONCILIATION.md +111 -0
  78. package/dist/extensions/rules-engine/RULES-ENGINE-GUIDE.md +470 -0
  79. package/dist/extensions/rules-engine/cache.js +232 -0
  80. package/dist/extensions/rules-engine/cache.ts +38 -0
  81. package/dist/extensions/rules-engine/config.js +63 -0
  82. package/dist/extensions/rules-engine/config.ts +70 -0
  83. package/dist/extensions/rules-engine/index.js +1530 -0
  84. package/dist/extensions/rules-engine/index.ts +552 -0
  85. package/dist/extensions/rules-engine/injector.js +68 -0
  86. package/dist/extensions/rules-engine/injector.ts +74 -0
  87. package/dist/extensions/rules-engine/loader.js +179 -0
  88. package/dist/extensions/rules-engine/loader.ts +205 -0
  89. package/dist/extensions/rules-engine/matcher.js +534 -0
  90. package/dist/extensions/rules-engine/matcher.ts +52 -0
  91. package/dist/extensions/rules-engine/types.d.ts +156 -0
  92. package/dist/extensions/rules-engine/types.d.ts.map +1 -0
  93. package/dist/extensions/rules-engine/types.js +2 -0
  94. package/dist/extensions/rules-engine/types.js.map +1 -0
  95. package/dist/extensions/rules-engine/types.ts +169 -0
  96. package/dist/extensions/session-supervisor/checker.ts +116 -0
  97. package/dist/extensions/session-supervisor/config.ts +45 -0
  98. package/dist/extensions/session-supervisor/index.ts +726 -0
  99. package/dist/extensions/session-supervisor/prompts.ts +132 -0
  100. package/dist/extensions/session-supervisor/scheduler.ts +69 -0
  101. package/dist/extensions/session-supervisor/types.ts +215 -0
  102. package/dist/extensions/subagent/README.md +172 -0
  103. package/dist/extensions/subagent/agents/explorer.md +25 -0
  104. package/dist/extensions/subagent/agents/guide.md +27 -0
  105. package/dist/extensions/subagent/agents/planner.md +37 -0
  106. package/dist/extensions/subagent/agents/reviewer.md +35 -0
  107. package/dist/extensions/subagent/agents/scout.md +50 -0
  108. package/dist/extensions/subagent/agents/verification.md +35 -0
  109. package/dist/extensions/subagent/agents/worker.md +24 -0
  110. package/dist/extensions/subagent/agents.ts +25 -0
  111. package/dist/extensions/subagent/index.ts +987 -0
  112. package/dist/extensions/subagent/prompts/implement-and-review.md +10 -0
  113. package/dist/extensions/subagent/prompts/implement.md +10 -0
  114. package/dist/extensions/subagent/prompts/scout-and-plan.md +9 -0
  115. package/dist/extensions/subagent-ext/contract.d.ts +2 -0
  116. package/dist/extensions/subagent-ext/contract.d.ts.map +1 -0
  117. package/dist/extensions/subagent-ext/contract.js +2 -0
  118. package/dist/extensions/subagent-ext/contract.js.map +1 -0
  119. package/dist/extensions/subagent-ext/contract.ts +1 -0
  120. package/dist/extensions/subagent-ext/index.ts +347 -0
  121. package/dist/extensions/subagent-shared/contract.d.ts +25 -0
  122. package/dist/extensions/subagent-shared/contract.d.ts.map +1 -0
  123. package/dist/extensions/subagent-shared/contract.js +2 -0
  124. package/dist/extensions/subagent-shared/contract.js.map +1 -0
  125. package/dist/extensions/subagent-shared/contract.ts +28 -0
  126. package/dist/extensions/subagent-shared/index.ts +4 -0
  127. package/dist/extensions/subagent-shared/render.ts +166 -0
  128. package/dist/extensions/subagent-shared/types.ts +35 -0
  129. package/dist/extensions/subagent-shared/utils.ts +112 -0
  130. package/dist/extensions/subagent-v2/contract.d.ts +2 -0
  131. package/dist/extensions/subagent-v2/contract.d.ts.map +1 -0
  132. package/dist/extensions/subagent-v2/contract.js +2 -0
  133. package/dist/extensions/subagent-v2/contract.js.map +1 -0
  134. package/dist/extensions/subagent-v2/contract.ts +1 -0
  135. package/dist/extensions/subagent-v2/index.ts +599 -0
  136. package/dist/extensions/todo-ext/contract.d.ts +27 -0
  137. package/dist/extensions/todo-ext/contract.d.ts.map +1 -0
  138. package/dist/extensions/todo-ext/contract.js +2 -0
  139. package/dist/extensions/todo-ext/contract.js.map +1 -0
  140. package/dist/extensions/todo-ext/contract.ts +30 -0
  141. package/dist/extensions/todo-ext/index.ts +419 -0
  142. package/package.json +3 -2
@@ -0,0 +1,156 @@
1
+ export type RuleSeverity = "critical" | "high" | "medium" | "low" | "hint";
2
+ export type RuleScope = "user" | "pi" | "project" | "managed";
3
+ export interface RuleFrontmatter {
4
+ globs?: string[];
5
+ paths?: string[];
6
+ description?: string;
7
+ severity?: RuleSeverity;
8
+ allowedTools?: string[];
9
+ whenToUse?: string;
10
+ version?: string;
11
+ model?: string;
12
+ skills?: string;
13
+ effort?: string;
14
+ userInvocable?: string;
15
+ context?: "inline" | "fork";
16
+ agent?: string;
17
+ shell?: string;
18
+ notifyOnMatch?: boolean;
19
+ skipInPrompt?: boolean;
20
+ }
21
+ export interface ParsedRule {
22
+ name: string;
23
+ filePath: string;
24
+ title: string;
25
+ content: string;
26
+ scope: RuleScope;
27
+ source: string;
28
+ frontmatter: RuleFrontmatter;
29
+ isUnconditional: boolean;
30
+ }
31
+ export interface RuleCache {
32
+ rules: ParsedRule[];
33
+ unconditional: ParsedRule[];
34
+ conditional: ParsedRule[];
35
+ loadedAt: number;
36
+ }
37
+ export interface CachedRules {
38
+ rules: ParsedRule[];
39
+ loadedAt: number;
40
+ }
41
+ export interface RulesConfig {
42
+ cacheTTL: number;
43
+ notifyOnLoad: boolean;
44
+ notifyOnMatch: boolean;
45
+ dirs?: {
46
+ user?: string[];
47
+ pi?: string[];
48
+ project?: string[];
49
+ managed?: string[];
50
+ };
51
+ }
52
+ export interface RuleDetail {
53
+ name: string;
54
+ title: string;
55
+ filePath: string;
56
+ scope: RuleScope;
57
+ source: string;
58
+ severity: RuleSeverity;
59
+ isUnconditional: boolean;
60
+ globs: string[];
61
+ description?: string;
62
+ }
63
+ export interface ScannedDir {
64
+ dir: string;
65
+ fileCount: number;
66
+ ruleNames: string[];
67
+ }
68
+ export interface MatchedRuleDetail {
69
+ name: string;
70
+ title: string;
71
+ severity: RuleSeverity;
72
+ matchedGlob: string;
73
+ /** True when this rule was already injected for the same file in a previous tool call */
74
+ alreadyLoaded?: boolean;
75
+ }
76
+ export interface MatchRecord {
77
+ filePath: string;
78
+ ruleNames: string[];
79
+ toolName: string;
80
+ toolCallId: string;
81
+ severity: "info" | "warning";
82
+ timestamp: number;
83
+ matchedRuleDetails?: MatchedRuleDetail[];
84
+ }
85
+ export interface LifecycleEntry {
86
+ event: "loaded" | "restored" | "injected" | "reloaded" | "unloaded" | "expired";
87
+ message: string;
88
+ ruleCount?: number;
89
+ timestamp: number;
90
+ details?: {
91
+ scannedDirs?: ScannedDir[];
92
+ configSource?: string;
93
+ cacheHit?: boolean;
94
+ injectedRules?: Array<{
95
+ name: string;
96
+ promptDelta: number;
97
+ }>;
98
+ };
99
+ }
100
+ export interface SnapshotPayload {
101
+ type: "snapshot";
102
+ rules: RuleDetail[];
103
+ injectedRuleNames: string[];
104
+ totalRules: number;
105
+ unconditionalCount: number;
106
+ conditionalCount: number;
107
+ matchHistory: MatchRecord[];
108
+ lifecycleLog: LifecycleEntry[];
109
+ loadedAt: number;
110
+ cacheTTL: number;
111
+ }
112
+ export interface MatchedPayload {
113
+ type: "matched";
114
+ filePath: string;
115
+ matchedRules: MatchedRuleDetail[];
116
+ toolName: string;
117
+ toolCallId: string;
118
+ severity: "info" | "warning";
119
+ timestamp: number;
120
+ /** True when all matched rules were already injected in a previous tool call */
121
+ alreadyLoaded?: boolean;
122
+ }
123
+ export interface InjectedPayload {
124
+ type: "injected";
125
+ ruleNames: string[];
126
+ systemPromptLength: number;
127
+ }
128
+ export interface ReloadedPayload {
129
+ type: "reloaded";
130
+ rules: RuleDetail[];
131
+ loadedAt: number;
132
+ }
133
+ export interface UnloadedPayload {
134
+ type: "unloaded";
135
+ reason: string;
136
+ }
137
+ export type RulesChannelEvent = SnapshotPayload | MatchedPayload | InjectedPayload | ReloadedPayload | UnloadedPayload;
138
+ export declare const RULES_CHANNEL_NAME = "rules-engine";
139
+ export interface RulesChannelContract {
140
+ methods: {
141
+ getSnapshot: {
142
+ params: {
143
+ cwd?: string;
144
+ };
145
+ return: SnapshotPayload;
146
+ };
147
+ };
148
+ events: {
149
+ snapshot: SnapshotPayload;
150
+ matched: MatchedPayload;
151
+ injected: InjectedPayload;
152
+ reloaded: ReloadedPayload;
153
+ unloaded: UnloadedPayload;
154
+ };
155
+ }
156
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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","sourcesContent":["export type RuleSeverity = \"critical\" | \"high\" | \"medium\" | \"low\" | \"hint\";\n\nexport type RuleScope = \"user\" | \"pi\" | \"project\" | \"managed\";\n\nexport interface RuleFrontmatter {\n\tglobs?: string[];\n\tpaths?: string[];\n\tdescription?: string;\n\tseverity?: RuleSeverity;\n\tallowedTools?: string[];\n\twhenToUse?: string;\n\tversion?: string;\n\tmodel?: string;\n\tskills?: string;\n\teffort?: string;\n\tuserInvocable?: string;\n\tcontext?: \"inline\" | \"fork\";\n\tagent?: string;\n\tshell?: string;\n\tnotifyOnMatch?: boolean;\n\tskipInPrompt?: boolean;\n}\n\nexport interface ParsedRule {\n\tname: string;\n\tfilePath: string;\n\ttitle: string;\n\tcontent: string;\n\tscope: RuleScope;\n\tsource: string;\n\tfrontmatter: RuleFrontmatter;\n\tisUnconditional: boolean;\n}\n\nexport interface RuleCache {\n\trules: ParsedRule[];\n\tunconditional: ParsedRule[];\n\tconditional: ParsedRule[];\n\tloadedAt: number;\n}\n\nexport interface CachedRules {\n\trules: ParsedRule[];\n\tloadedAt: number;\n}\n\nexport interface RulesConfig {\n\tcacheTTL: number;\n\tnotifyOnLoad: boolean;\n\tnotifyOnMatch: boolean;\n\tdirs?: {\n\t\tuser?: string[];\n\t\tpi?: string[];\n\t\tproject?: string[];\n\t\tmanaged?: string[];\n\t};\n}\n\nexport interface RuleDetail {\n\tname: string;\n\ttitle: string;\n\tfilePath: string;\n\tscope: RuleScope;\n\tsource: string;\n\tseverity: RuleSeverity;\n\tisUnconditional: boolean;\n\tglobs: string[];\n\tdescription?: string;\n}\n\nexport interface ScannedDir {\n\tdir: string;\n\tfileCount: number;\n\truleNames: string[];\n}\n\nexport interface MatchedRuleDetail {\n\tname: string;\n\ttitle: string;\n\tseverity: RuleSeverity;\n\tmatchedGlob: string;\n\t/** True when this rule was already injected for the same file in a previous tool call */\n\talreadyLoaded?: boolean;\n}\n\nexport interface MatchRecord {\n\tfilePath: string;\n\truleNames: string[];\n\ttoolName: string;\n\ttoolCallId: string;\n\tseverity: \"info\" | \"warning\";\n\ttimestamp: number;\n\tmatchedRuleDetails?: MatchedRuleDetail[];\n}\n\nexport interface LifecycleEntry {\n\tevent: \"loaded\" | \"restored\" | \"injected\" | \"reloaded\" | \"unloaded\" | \"expired\";\n\tmessage: string;\n\truleCount?: number;\n\ttimestamp: number;\n\tdetails?: {\n\t\tscannedDirs?: ScannedDir[];\n\t\tconfigSource?: string;\n\t\tcacheHit?: boolean;\n\t\tinjectedRules?: Array<{ name: string; promptDelta: number }>;\n\t};\n}\n\nexport interface SnapshotPayload {\n\ttype: \"snapshot\";\n\trules: RuleDetail[];\n\tinjectedRuleNames: string[];\n\ttotalRules: number;\n\tunconditionalCount: number;\n\tconditionalCount: number;\n\tmatchHistory: MatchRecord[];\n\tlifecycleLog: LifecycleEntry[];\n\tloadedAt: number;\n\tcacheTTL: number;\n}\n\nexport interface MatchedPayload {\n\ttype: \"matched\";\n\tfilePath: string;\n\tmatchedRules: MatchedRuleDetail[];\n\ttoolName: string;\n\ttoolCallId: string;\n\tseverity: \"info\" | \"warning\";\n\ttimestamp: number;\n\t/** True when all matched rules were already injected in a previous tool call */\n\talreadyLoaded?: boolean;\n}\n\nexport interface InjectedPayload {\n\ttype: \"injected\";\n\truleNames: string[];\n\tsystemPromptLength: number;\n}\n\nexport interface ReloadedPayload {\n\ttype: \"reloaded\";\n\trules: RuleDetail[];\n\tloadedAt: number;\n}\n\nexport interface UnloadedPayload {\n\ttype: \"unloaded\";\n\treason: string;\n}\n\nexport type RulesChannelEvent = SnapshotPayload | MatchedPayload | InjectedPayload | ReloadedPayload | UnloadedPayload;\n\nexport const RULES_CHANNEL_NAME = \"rules-engine\";\n\nexport interface RulesChannelContract {\n\tmethods: {\n\t\tgetSnapshot: {\n\t\t\tparams: { cwd?: string };\n\t\t\treturn: SnapshotPayload;\n\t\t};\n\t};\n\tevents: {\n\t\tsnapshot: SnapshotPayload;\n\t\tmatched: MatchedPayload;\n\t\tinjected: InjectedPayload;\n\t\treloaded: ReloadedPayload;\n\t\tunloaded: UnloadedPayload;\n\t};\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export const RULES_CHANNEL_NAME = "rules-engine";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAwJA,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAC","sourcesContent":["export type RuleSeverity = \"critical\" | \"high\" | \"medium\" | \"low\" | \"hint\";\n\nexport type RuleScope = \"user\" | \"pi\" | \"project\" | \"managed\";\n\nexport interface RuleFrontmatter {\n\tglobs?: string[];\n\tpaths?: string[];\n\tdescription?: string;\n\tseverity?: RuleSeverity;\n\tallowedTools?: string[];\n\twhenToUse?: string;\n\tversion?: string;\n\tmodel?: string;\n\tskills?: string;\n\teffort?: string;\n\tuserInvocable?: string;\n\tcontext?: \"inline\" | \"fork\";\n\tagent?: string;\n\tshell?: string;\n\tnotifyOnMatch?: boolean;\n\tskipInPrompt?: boolean;\n}\n\nexport interface ParsedRule {\n\tname: string;\n\tfilePath: string;\n\ttitle: string;\n\tcontent: string;\n\tscope: RuleScope;\n\tsource: string;\n\tfrontmatter: RuleFrontmatter;\n\tisUnconditional: boolean;\n}\n\nexport interface RuleCache {\n\trules: ParsedRule[];\n\tunconditional: ParsedRule[];\n\tconditional: ParsedRule[];\n\tloadedAt: number;\n}\n\nexport interface CachedRules {\n\trules: ParsedRule[];\n\tloadedAt: number;\n}\n\nexport interface RulesConfig {\n\tcacheTTL: number;\n\tnotifyOnLoad: boolean;\n\tnotifyOnMatch: boolean;\n\tdirs?: {\n\t\tuser?: string[];\n\t\tpi?: string[];\n\t\tproject?: string[];\n\t\tmanaged?: string[];\n\t};\n}\n\nexport interface RuleDetail {\n\tname: string;\n\ttitle: string;\n\tfilePath: string;\n\tscope: RuleScope;\n\tsource: string;\n\tseverity: RuleSeverity;\n\tisUnconditional: boolean;\n\tglobs: string[];\n\tdescription?: string;\n}\n\nexport interface ScannedDir {\n\tdir: string;\n\tfileCount: number;\n\truleNames: string[];\n}\n\nexport interface MatchedRuleDetail {\n\tname: string;\n\ttitle: string;\n\tseverity: RuleSeverity;\n\tmatchedGlob: string;\n\t/** True when this rule was already injected for the same file in a previous tool call */\n\talreadyLoaded?: boolean;\n}\n\nexport interface MatchRecord {\n\tfilePath: string;\n\truleNames: string[];\n\ttoolName: string;\n\ttoolCallId: string;\n\tseverity: \"info\" | \"warning\";\n\ttimestamp: number;\n\tmatchedRuleDetails?: MatchedRuleDetail[];\n}\n\nexport interface LifecycleEntry {\n\tevent: \"loaded\" | \"restored\" | \"injected\" | \"reloaded\" | \"unloaded\" | \"expired\";\n\tmessage: string;\n\truleCount?: number;\n\ttimestamp: number;\n\tdetails?: {\n\t\tscannedDirs?: ScannedDir[];\n\t\tconfigSource?: string;\n\t\tcacheHit?: boolean;\n\t\tinjectedRules?: Array<{ name: string; promptDelta: number }>;\n\t};\n}\n\nexport interface SnapshotPayload {\n\ttype: \"snapshot\";\n\trules: RuleDetail[];\n\tinjectedRuleNames: string[];\n\ttotalRules: number;\n\tunconditionalCount: number;\n\tconditionalCount: number;\n\tmatchHistory: MatchRecord[];\n\tlifecycleLog: LifecycleEntry[];\n\tloadedAt: number;\n\tcacheTTL: number;\n}\n\nexport interface MatchedPayload {\n\ttype: \"matched\";\n\tfilePath: string;\n\tmatchedRules: MatchedRuleDetail[];\n\ttoolName: string;\n\ttoolCallId: string;\n\tseverity: \"info\" | \"warning\";\n\ttimestamp: number;\n\t/** True when all matched rules were already injected in a previous tool call */\n\talreadyLoaded?: boolean;\n}\n\nexport interface InjectedPayload {\n\ttype: \"injected\";\n\truleNames: string[];\n\tsystemPromptLength: number;\n}\n\nexport interface ReloadedPayload {\n\ttype: \"reloaded\";\n\trules: RuleDetail[];\n\tloadedAt: number;\n}\n\nexport interface UnloadedPayload {\n\ttype: \"unloaded\";\n\treason: string;\n}\n\nexport type RulesChannelEvent = SnapshotPayload | MatchedPayload | InjectedPayload | ReloadedPayload | UnloadedPayload;\n\nexport const RULES_CHANNEL_NAME = \"rules-engine\";\n\nexport interface RulesChannelContract {\n\tmethods: {\n\t\tgetSnapshot: {\n\t\t\tparams: { cwd?: string };\n\t\t\treturn: SnapshotPayload;\n\t\t};\n\t};\n\tevents: {\n\t\tsnapshot: SnapshotPayload;\n\t\tmatched: MatchedPayload;\n\t\tinjected: InjectedPayload;\n\t\treloaded: ReloadedPayload;\n\t\tunloaded: UnloadedPayload;\n\t};\n}\n"]}
@@ -0,0 +1,169 @@
1
+ export type RuleSeverity = "critical" | "high" | "medium" | "low" | "hint";
2
+
3
+ export type RuleScope = "user" | "pi" | "project" | "managed";
4
+
5
+ export interface RuleFrontmatter {
6
+ globs?: string[];
7
+ paths?: string[];
8
+ description?: string;
9
+ severity?: RuleSeverity;
10
+ allowedTools?: string[];
11
+ whenToUse?: string;
12
+ version?: string;
13
+ model?: string;
14
+ skills?: string;
15
+ effort?: string;
16
+ userInvocable?: string;
17
+ context?: "inline" | "fork";
18
+ agent?: string;
19
+ shell?: string;
20
+ notifyOnMatch?: boolean;
21
+ skipInPrompt?: boolean;
22
+ }
23
+
24
+ export interface ParsedRule {
25
+ name: string;
26
+ filePath: string;
27
+ title: string;
28
+ content: string;
29
+ scope: RuleScope;
30
+ source: string;
31
+ frontmatter: RuleFrontmatter;
32
+ isUnconditional: boolean;
33
+ }
34
+
35
+ export interface RuleCache {
36
+ rules: ParsedRule[];
37
+ unconditional: ParsedRule[];
38
+ conditional: ParsedRule[];
39
+ loadedAt: number;
40
+ }
41
+
42
+ export interface CachedRules {
43
+ rules: ParsedRule[];
44
+ loadedAt: number;
45
+ }
46
+
47
+ export interface RulesConfig {
48
+ cacheTTL: number;
49
+ notifyOnLoad: boolean;
50
+ notifyOnMatch: boolean;
51
+ dirs?: {
52
+ user?: string[];
53
+ pi?: string[];
54
+ project?: string[];
55
+ managed?: string[];
56
+ };
57
+ }
58
+
59
+ export interface RuleDetail {
60
+ name: string;
61
+ title: string;
62
+ filePath: string;
63
+ scope: RuleScope;
64
+ source: string;
65
+ severity: RuleSeverity;
66
+ isUnconditional: boolean;
67
+ globs: string[];
68
+ description?: string;
69
+ }
70
+
71
+ export interface ScannedDir {
72
+ dir: string;
73
+ fileCount: number;
74
+ ruleNames: string[];
75
+ }
76
+
77
+ export interface MatchedRuleDetail {
78
+ name: string;
79
+ title: string;
80
+ severity: RuleSeverity;
81
+ matchedGlob: string;
82
+ /** True when this rule was already injected for the same file in a previous tool call */
83
+ alreadyLoaded?: boolean;
84
+ }
85
+
86
+ export interface MatchRecord {
87
+ filePath: string;
88
+ ruleNames: string[];
89
+ toolName: string;
90
+ toolCallId: string;
91
+ severity: "info" | "warning";
92
+ timestamp: number;
93
+ matchedRuleDetails?: MatchedRuleDetail[];
94
+ }
95
+
96
+ export interface LifecycleEntry {
97
+ event: "loaded" | "restored" | "injected" | "reloaded" | "unloaded" | "expired";
98
+ message: string;
99
+ ruleCount?: number;
100
+ timestamp: number;
101
+ details?: {
102
+ scannedDirs?: ScannedDir[];
103
+ configSource?: string;
104
+ cacheHit?: boolean;
105
+ injectedRules?: Array<{ name: string; promptDelta: number }>;
106
+ };
107
+ }
108
+
109
+ export interface SnapshotPayload {
110
+ type: "snapshot";
111
+ rules: RuleDetail[];
112
+ injectedRuleNames: string[];
113
+ totalRules: number;
114
+ unconditionalCount: number;
115
+ conditionalCount: number;
116
+ matchHistory: MatchRecord[];
117
+ lifecycleLog: LifecycleEntry[];
118
+ loadedAt: number;
119
+ cacheTTL: number;
120
+ }
121
+
122
+ export interface MatchedPayload {
123
+ type: "matched";
124
+ filePath: string;
125
+ matchedRules: MatchedRuleDetail[];
126
+ toolName: string;
127
+ toolCallId: string;
128
+ severity: "info" | "warning";
129
+ timestamp: number;
130
+ /** True when all matched rules were already injected in a previous tool call */
131
+ alreadyLoaded?: boolean;
132
+ }
133
+
134
+ export interface InjectedPayload {
135
+ type: "injected";
136
+ ruleNames: string[];
137
+ systemPromptLength: number;
138
+ }
139
+
140
+ export interface ReloadedPayload {
141
+ type: "reloaded";
142
+ rules: RuleDetail[];
143
+ loadedAt: number;
144
+ }
145
+
146
+ export interface UnloadedPayload {
147
+ type: "unloaded";
148
+ reason: string;
149
+ }
150
+
151
+ export type RulesChannelEvent = SnapshotPayload | MatchedPayload | InjectedPayload | ReloadedPayload | UnloadedPayload;
152
+
153
+ export const RULES_CHANNEL_NAME = "rules-engine";
154
+
155
+ export interface RulesChannelContract {
156
+ methods: {
157
+ getSnapshot: {
158
+ params: { cwd?: string };
159
+ return: SnapshotPayload;
160
+ };
161
+ };
162
+ events: {
163
+ snapshot: SnapshotPayload;
164
+ matched: MatchedPayload;
165
+ injected: InjectedPayload;
166
+ reloaded: ReloadedPayload;
167
+ unloaded: UnloadedPayload;
168
+ };
169
+ }
@@ -0,0 +1,116 @@
1
+ import type { ExtensionAPI } from "@dyyz1993/pi-coding-agent";
2
+ import type {
3
+ SupervisorConfig,
4
+ CheckResult,
5
+ } from "./types.js";
6
+ import { CompletionCheckSchema } from "./types.js";
7
+ import { COMPLETION_CHECK_SYSTEM_PROMPT } from "./prompts.js";
8
+ import type { TSchema } from "@sinclair/typebox";
9
+ import { Value } from "typebox/value";
10
+
11
+ export async function checkWithSmallModel(
12
+ messages: Array<{ role: string; content: unknown }>,
13
+ config: SupervisorConfig,
14
+ callLLM: ExtensionAPI["callLLM"],
15
+ signal?: AbortSignal,
16
+ ): Promise<CheckResult> {
17
+ const recentMessages = messages.slice(-10);
18
+ const conversationSummary = recentMessages
19
+ .map((m) => {
20
+ const content =
21
+ typeof m.content === "string"
22
+ ? m.content
23
+ : JSON.stringify(m.content);
24
+ return `[${m.role}]: ${content.slice(0, 500)}`;
25
+ })
26
+ .join("\n\n");
27
+
28
+ try {
29
+ const response = await callLLMStructured<{
30
+ completed: boolean;
31
+ confidence: number;
32
+ incompleteTasks: CheckResult["incompleteTasks"];
33
+ reasoning: string;
34
+ }>(
35
+ callLLM,
36
+ {
37
+ systemPrompt: COMPLETION_CHECK_SYSTEM_PROMPT,
38
+ messages: [{ role: "user" as const, content: conversationSummary }],
39
+ model: config.smallModel,
40
+ maxTokens: 1024,
41
+ signal,
42
+ },
43
+ CompletionCheckSchema,
44
+ );
45
+
46
+ return {
47
+ completed: response.completed,
48
+ confidence: response.confidence,
49
+ incompleteTasks: response.incompleteTasks,
50
+ modelResponse: response.reasoning,
51
+ };
52
+ } catch (err) {
53
+ return {
54
+ completed: true,
55
+ confidence: 0.5,
56
+ incompleteTasks: [],
57
+ modelResponse: `Check failed: ${err instanceof Error ? err.message : String(err)}`,
58
+ };
59
+ }
60
+ }
61
+
62
+ async function callLLMStructured<T>(
63
+ callLLM: ExtensionAPI["callLLM"],
64
+ options: {
65
+ systemPrompt: string;
66
+ messages: Array<{ role: "user" | "assistant"; content: string }>;
67
+ model?: string;
68
+ maxTokens?: number;
69
+ signal?: AbortSignal;
70
+ },
71
+ schema: TSchema,
72
+ ): Promise<T> {
73
+ const schemaStr = JSON.stringify(schema, null, 2);
74
+ const systemWithSchema = `${options.systemPrompt}\n\nRespond with JSON matching this schema:\n${schemaStr}`;
75
+
76
+ const maxRetries = 3;
77
+ const messages = [...options.messages];
78
+
79
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
80
+ const raw = await callLLM({
81
+ ...options,
82
+ systemPrompt: systemWithSchema,
83
+ messages,
84
+ });
85
+
86
+ try {
87
+ const jsonStr = raw
88
+ .replace(/^```(?:json)?\s*\n?/m, "")
89
+ .replace(/\n?```\s*$/m, "")
90
+ .trim();
91
+ const parsed = JSON.parse(jsonStr);
92
+ const coerced = Value.Convert(schema, parsed);
93
+
94
+ if (Value.Check(schema, coerced)) {
95
+ return coerced as T;
96
+ }
97
+
98
+ const errors = [...Value.Errors(schema, coerced)]
99
+ .map((e) => `${String(e)}: ${e.message}`)
100
+ .join("; ");
101
+ messages.push({ role: "assistant", content: raw });
102
+ messages.push({
103
+ role: "user",
104
+ content: `JSON schema validation failed: ${errors}. Please fix and return valid JSON.`,
105
+ });
106
+ } catch (parseErr) {
107
+ messages.push({ role: "assistant", content: raw });
108
+ messages.push({
109
+ role: "user",
110
+ content: `Failed to parse JSON: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}. Please return valid JSON only.`,
111
+ });
112
+ }
113
+ }
114
+
115
+ throw new Error("Failed to get structured response after max retries");
116
+ }
@@ -0,0 +1,45 @@
1
+ import { existsSync, readFileSync, appendFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { Value } from "typebox/value";
4
+ import { SupervisorConfigSchema, type SupervisorConfig } from "./types.js";
5
+
6
+ function log(msg: string) {
7
+ const ts = new Date().toISOString();
8
+ appendFileSync("/tmp/supervisor-debug.log", `[${ts}] [config] ${msg}\n`);
9
+ }
10
+
11
+ const DEFAULT_CONFIG: SupervisorConfig = {
12
+ enable: false,
13
+ checkOnAgentEnd: true,
14
+ smallModel: "fast",
15
+ maxContinueCount: 5,
16
+ defaultDelayMs: 30_000,
17
+ pauseThresholdMs: 300_000,
18
+ guards: [],
19
+ };
20
+
21
+ export function loadConfig(sessionDataDir: string, projectDataDir: string): SupervisorConfig {
22
+ const candidates = [
23
+ join(sessionDataDir, "supervisor.json"),
24
+ join(projectDataDir, "supervisor.json"),
25
+ ];
26
+
27
+ for (const p of candidates) {
28
+ if (!existsSync(p)) continue;
29
+ try {
30
+ const raw = readFileSync(p, "utf-8");
31
+ log(`Found config at ${p}, raw length=${raw.length}`);
32
+ const parsed = JSON.parse(raw);
33
+ log(`Parsed guards count: ${parsed.guards?.length ?? "undefined"}`);
34
+ const converted = Value.Convert(SupervisorConfigSchema, parsed) as Record<string, unknown>;
35
+ log(`After Value.Convert guards count: ${Array.isArray(converted.guards) ? converted.guards.length : "undefined"}`);
36
+ const merged = { ...DEFAULT_CONFIG, ...converted } as SupervisorConfig;
37
+ log(`After merge guards count: ${merged.guards?.length ?? "undefined"}`);
38
+ return merged;
39
+ } catch (err) {
40
+ log(`Config parse error: ${err instanceof Error ? err.message : String(err)}`);
41
+ }
42
+ }
43
+ log(`No config file found, using defaults`);
44
+ return { ...DEFAULT_CONFIG };
45
+ }