thatgfsj-code 1.0.3 → 3.0.0

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 (184) hide show
  1. package/CHANGELOG.md +192 -0
  2. package/DEVELOPMENT.md +286 -0
  3. package/dist/app/index.d.ts +40 -3
  4. package/dist/app/index.d.ts.map +1 -1
  5. package/dist/app/index.js +87 -12
  6. package/dist/app/index.js.map +1 -1
  7. package/dist/cache/fingerprint.d.ts +49 -0
  8. package/dist/cache/fingerprint.d.ts.map +1 -0
  9. package/dist/cache/fingerprint.js +100 -0
  10. package/dist/cache/fingerprint.js.map +1 -0
  11. package/dist/cache/index.d.ts +15 -0
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +15 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/cache/smartModel.d.ts +40 -0
  16. package/dist/cache/smartModel.d.ts.map +1 -0
  17. package/dist/cache/smartModel.js +43 -0
  18. package/dist/cache/smartModel.js.map +1 -0
  19. package/dist/cache/stats.d.ts +93 -0
  20. package/dist/cache/stats.d.ts.map +1 -0
  21. package/dist/cache/stats.js +155 -0
  22. package/dist/cache/stats.js.map +1 -0
  23. package/dist/cache/volatile.d.ts +32 -0
  24. package/dist/cache/volatile.d.ts.map +1 -0
  25. package/dist/cache/volatile.js +44 -0
  26. package/dist/cache/volatile.js.map +1 -0
  27. package/dist/cmd/index.d.ts +21 -0
  28. package/dist/cmd/index.d.ts.map +1 -1
  29. package/dist/cmd/index.js +155 -31
  30. package/dist/cmd/index.js.map +1 -1
  31. package/dist/config/index.d.ts.map +1 -1
  32. package/dist/config/index.js +8 -0
  33. package/dist/config/index.js.map +1 -1
  34. package/dist/config/types.d.ts +14 -0
  35. package/dist/config/types.d.ts.map +1 -1
  36. package/dist/llm/anthropic.d.ts +55 -5
  37. package/dist/llm/anthropic.d.ts.map +1 -1
  38. package/dist/llm/anthropic.js +172 -26
  39. package/dist/llm/anthropic.js.map +1 -1
  40. package/dist/llm/index.d.ts +26 -8
  41. package/dist/llm/index.d.ts.map +1 -1
  42. package/dist/llm/index.js +83 -15
  43. package/dist/llm/index.js.map +1 -1
  44. package/dist/llm/openai.d.ts +28 -8
  45. package/dist/llm/openai.d.ts.map +1 -1
  46. package/dist/llm/openai.js +58 -8
  47. package/dist/llm/openai.js.map +1 -1
  48. package/dist/llm/provider.d.ts +40 -8
  49. package/dist/llm/provider.d.ts.map +1 -1
  50. package/dist/llm/provider.js +8 -1
  51. package/dist/llm/provider.js.map +1 -1
  52. package/dist/prompts/index.d.ts +32 -0
  53. package/dist/prompts/index.d.ts.map +1 -1
  54. package/dist/prompts/index.js +33 -11
  55. package/dist/prompts/index.js.map +1 -1
  56. package/dist/session/index.d.ts +43 -3
  57. package/dist/session/index.d.ts.map +1 -1
  58. package/dist/session/index.js +114 -17
  59. package/dist/session/index.js.map +1 -1
  60. package/dist/skills/brainstorming.js +33 -33
  61. package/dist/skills/code-review.js +35 -35
  62. package/dist/skills/executing-plans.js +18 -18
  63. package/dist/skills/frontend-design.js +25 -25
  64. package/dist/skills/git-workflow.js +26 -26
  65. package/dist/skills/improve-architecture.js +28 -28
  66. package/dist/skills/neuroweave.js +37 -37
  67. package/dist/skills/playwright.js +62 -62
  68. package/dist/skills/prototype.js +20 -20
  69. package/dist/skills/subagent.js +19 -19
  70. package/dist/skills/supabase.js +34 -34
  71. package/dist/skills/systematic-debugging.js +34 -34
  72. package/dist/skills/tdd.js +29 -29
  73. package/dist/skills/triage.js +25 -25
  74. package/dist/skills/verification.js +22 -22
  75. package/dist/skills/writing-plans.js +32 -32
  76. package/dist/tools/nwt.js +16 -16
  77. package/dist/tui/app.d.ts.map +1 -1
  78. package/dist/tui/app.js +9 -2
  79. package/dist/tui/app.js.map +1 -1
  80. package/dist/tui/components/ChatList.d.ts.map +1 -1
  81. package/dist/tui/components/ChatList.js +4 -3
  82. package/dist/tui/components/ChatList.js.map +1 -1
  83. package/dist/tui/components/Header.d.ts +8 -0
  84. package/dist/tui/components/Header.d.ts.map +1 -1
  85. package/dist/tui/components/Header.js +17 -3
  86. package/dist/tui/components/Header.js.map +1 -1
  87. package/dist/tui/components/InitWizard.d.ts +12 -1
  88. package/dist/tui/components/InitWizard.d.ts.map +1 -1
  89. package/dist/tui/components/InitWizard.js +58 -3
  90. package/dist/tui/components/InitWizard.js.map +1 -1
  91. package/dist/tui/components/ToolCall.d.ts +1 -1
  92. package/dist/tui/components/ToolCall.d.ts.map +1 -1
  93. package/dist/tui/components/ToolCall.js +4 -4
  94. package/dist/tui/components/ToolCall.js.map +1 -1
  95. package/dist/tui/hooks/useChat.d.ts +22 -0
  96. package/dist/tui/hooks/useChat.d.ts.map +1 -1
  97. package/dist/tui/hooks/useChat.js +127 -50
  98. package/dist/tui/hooks/useChat.js.map +1 -1
  99. package/dist/tui/hooks/useCommands.d.ts.map +1 -1
  100. package/dist/tui/hooks/useCommands.js +78 -0
  101. package/dist/tui/hooks/useCommands.js.map +1 -1
  102. package/dist/types.d.ts +79 -6
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/types.js +7 -0
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils/stableStringify.d.ts +21 -0
  107. package/dist/utils/stableStringify.d.ts.map +1 -0
  108. package/dist/utils/stableStringify.js +53 -0
  109. package/dist/utils/stableStringify.js.map +1 -0
  110. package/dist/utils/thinking.d.ts +59 -0
  111. package/dist/utils/thinking.d.ts.map +1 -0
  112. package/dist/utils/thinking.js +104 -0
  113. package/dist/utils/thinking.js.map +1 -0
  114. package/install.bat +63 -0
  115. package/install.ps1 +238 -0
  116. package/install.sh +113 -0
  117. package/package.json +7 -4
  118. package/src/app/index.ts +180 -108
  119. package/src/cache/fingerprint.ts +101 -0
  120. package/src/cache/index.ts +15 -0
  121. package/src/cache/smartModel.ts +52 -0
  122. package/src/cache/stats.ts +199 -0
  123. package/src/cache/volatile.ts +47 -0
  124. package/src/cmd/index.tsx +288 -160
  125. package/src/config/index.ts +156 -148
  126. package/src/config/providers.ts +234 -234
  127. package/src/config/types.ts +67 -53
  128. package/src/hooks/index.ts +111 -111
  129. package/src/llm/anthropic.ts +388 -243
  130. package/src/llm/gemini.ts +169 -169
  131. package/src/llm/index.ts +265 -200
  132. package/src/llm/openai.ts +243 -196
  133. package/src/llm/provider.ts +66 -34
  134. package/src/prompts/index.ts +260 -220
  135. package/src/session/compactor.ts +103 -103
  136. package/src/session/index.ts +181 -87
  137. package/src/session/message.ts +42 -42
  138. package/src/skills/brainstorming.ts +43 -43
  139. package/src/skills/code-review.ts +45 -45
  140. package/src/skills/executing-plans.ts +27 -27
  141. package/src/skills/frontend-design.ts +35 -35
  142. package/src/skills/git-workflow.ts +36 -36
  143. package/src/skills/improve-architecture.ts +38 -38
  144. package/src/skills/index.ts +136 -136
  145. package/src/skills/neuroweave.ts +47 -47
  146. package/src/skills/playwright.ts +72 -72
  147. package/src/skills/prototype.ts +30 -30
  148. package/src/skills/subagent.ts +28 -28
  149. package/src/skills/supabase.ts +44 -44
  150. package/src/skills/systematic-debugging.ts +44 -44
  151. package/src/skills/tdd.ts +39 -39
  152. package/src/skills/triage.ts +35 -35
  153. package/src/skills/verification.ts +31 -31
  154. package/src/skills/writing-plans.ts +42 -42
  155. package/src/tools/nwt.ts +598 -598
  156. package/src/tools/types.ts +122 -122
  157. package/src/tui/app.tsx +199 -186
  158. package/src/tui/components/ChatList.tsx +41 -32
  159. package/src/tui/components/ChatMessage.tsx +54 -54
  160. package/src/tui/components/Header.tsx +56 -28
  161. package/src/tui/components/InitWizard.tsx +217 -132
  162. package/src/tui/components/Markdown.tsx +35 -35
  163. package/src/tui/components/ModelSelector.tsx +87 -87
  164. package/src/tui/components/StatusBar.tsx +30 -30
  165. package/src/tui/components/Thinking.tsx +17 -17
  166. package/src/tui/components/ToolCall.tsx +102 -71
  167. package/src/tui/components/UserInput.tsx +131 -131
  168. package/src/tui/hooks/useChat.ts +287 -194
  169. package/src/tui/hooks/useCommands.ts +234 -154
  170. package/src/tui/index.ts +6 -6
  171. package/src/tui/welcome.ts +177 -177
  172. package/src/types.ts +104 -42
  173. package/src/utils/diff.ts +71 -71
  174. package/src/utils/project.ts +99 -99
  175. package/src/utils/stableStringify.ts +47 -0
  176. package/src/utils/thinking.ts +119 -0
  177. package/tests/cache/fingerprint.test.ts +75 -0
  178. package/tests/cache/stableStringify.test.ts +43 -0
  179. package/tests/cache/stats.test.ts +146 -0
  180. package/tests/cache/volatile.test.ts +75 -0
  181. package/tests/smoke-pollution.mjs +78 -0
  182. package/tests/smoke-thinking.mjs +110 -0
  183. package/tests/smoke-tool-stream.mjs +69 -0
  184. package/tests/smoke-tool.mjs +117 -0
@@ -1,111 +1,111 @@
1
- /**
2
- * Hooks System - Event-driven lifecycle hooks
3
- * Migrated from old src/core/hooks.ts
4
- */
5
-
6
- import type { ChatMessage, ToolCall } from '../types.js';
7
-
8
- // ==================== Hook Types ====================
9
-
10
- export type HookName =
11
- | 'beforeToolCall'
12
- | 'afterToolCall'
13
- | 'beforeAgentLoop'
14
- | 'afterAgentLoop'
15
- | 'onError';
16
-
17
- export interface HookContext {
18
- toolName?: string;
19
- toolParams?: Record<string, any>;
20
- toolResult?: any;
21
- messages?: ChatMessage[];
22
- error?: Error;
23
- iteration?: number;
24
- [key: string]: any;
25
- }
26
-
27
- export type HookFn = (ctx: HookContext) => void | Promise<void>;
28
-
29
- interface HookRegistration {
30
- name: HookName;
31
- fn: HookFn;
32
- priority?: number;
33
- once?: boolean;
34
- }
35
-
36
- // ==================== Hook Manager ====================
37
-
38
- export class HookManager {
39
- private hooks: Map<HookName, HookRegistration[]> = new Map();
40
-
41
- constructor() {
42
- const allHooks: HookName[] = ['beforeToolCall', 'afterToolCall', 'beforeAgentLoop', 'afterAgentLoop', 'onError'];
43
- for (const h of allHooks) {
44
- this.hooks.set(h, []);
45
- }
46
- }
47
-
48
- register(name: HookName, fn: HookFn, priority = 0, once = false): void {
49
- const regs = this.hooks.get(name) || [];
50
- regs.push({ name, fn, priority, once });
51
- regs.sort((a, b) => (b.priority || 0) - (a.priority || 0));
52
- this.hooks.set(name, regs);
53
- }
54
-
55
- unregister(name: HookName, fn: HookFn): void {
56
- const regs = this.hooks.get(name) || [];
57
- this.hooks.set(name, regs.filter(r => r.fn !== fn));
58
- }
59
-
60
- clear(name?: HookName): void {
61
- if (name) {
62
- this.hooks.set(name, []);
63
- } else {
64
- for (const regs of this.hooks.values()) {
65
- regs.length = 0;
66
- }
67
- }
68
- }
69
-
70
- async emit(name: HookName, ctx: HookContext): Promise<void> {
71
- const regs = this.hooks.get(name) || [];
72
- for (const reg of regs) {
73
- try {
74
- await Promise.resolve(reg.fn(ctx));
75
- } catch (error: any) {
76
- console.error(`[Hook ${name}] error:`, error.message);
77
- }
78
- if (reg.once) {
79
- this.unregister(name, reg.fn);
80
- }
81
- }
82
- }
83
-
84
- hasHooks(name: HookName): boolean {
85
- return (this.hooks.get(name)?.length || 0) > 0;
86
- }
87
- }
88
-
89
- // ==================== Built-in Hooks ====================
90
-
91
- /**
92
- * Audit logging hook - logs all tool calls
93
- */
94
- export function auditLogHook(ctx: HookContext): void {
95
- if (ctx.toolName) {
96
- const ts = new Date().toISOString().split('T')[1].split('.')[0];
97
- const status = ctx.toolResult?.success ? 'OK' : 'FAIL';
98
- console.log(`[AUDIT ${ts}] ${status} | tool=${ctx.toolName} | params=${JSON.stringify(ctx.toolParams || {})}`);
99
- }
100
- }
101
-
102
- // ==================== Singleton ====================
103
-
104
- let globalHookManager: HookManager | null = null;
105
-
106
- export function getHookManager(): HookManager {
107
- if (!globalHookManager) {
108
- globalHookManager = new HookManager();
109
- }
110
- return globalHookManager;
111
- }
1
+ /**
2
+ * Hooks System - Event-driven lifecycle hooks
3
+ * Migrated from old src/core/hooks.ts
4
+ */
5
+
6
+ import type { ChatMessage, ToolCall } from '../types.js';
7
+
8
+ // ==================== Hook Types ====================
9
+
10
+ export type HookName =
11
+ | 'beforeToolCall'
12
+ | 'afterToolCall'
13
+ | 'beforeAgentLoop'
14
+ | 'afterAgentLoop'
15
+ | 'onError';
16
+
17
+ export interface HookContext {
18
+ toolName?: string;
19
+ toolParams?: Record<string, any>;
20
+ toolResult?: any;
21
+ messages?: ChatMessage[];
22
+ error?: Error;
23
+ iteration?: number;
24
+ [key: string]: any;
25
+ }
26
+
27
+ export type HookFn = (ctx: HookContext) => void | Promise<void>;
28
+
29
+ interface HookRegistration {
30
+ name: HookName;
31
+ fn: HookFn;
32
+ priority?: number;
33
+ once?: boolean;
34
+ }
35
+
36
+ // ==================== Hook Manager ====================
37
+
38
+ export class HookManager {
39
+ private hooks: Map<HookName, HookRegistration[]> = new Map();
40
+
41
+ constructor() {
42
+ const allHooks: HookName[] = ['beforeToolCall', 'afterToolCall', 'beforeAgentLoop', 'afterAgentLoop', 'onError'];
43
+ for (const h of allHooks) {
44
+ this.hooks.set(h, []);
45
+ }
46
+ }
47
+
48
+ register(name: HookName, fn: HookFn, priority = 0, once = false): void {
49
+ const regs = this.hooks.get(name) || [];
50
+ regs.push({ name, fn, priority, once });
51
+ regs.sort((a, b) => (b.priority || 0) - (a.priority || 0));
52
+ this.hooks.set(name, regs);
53
+ }
54
+
55
+ unregister(name: HookName, fn: HookFn): void {
56
+ const regs = this.hooks.get(name) || [];
57
+ this.hooks.set(name, regs.filter(r => r.fn !== fn));
58
+ }
59
+
60
+ clear(name?: HookName): void {
61
+ if (name) {
62
+ this.hooks.set(name, []);
63
+ } else {
64
+ for (const regs of this.hooks.values()) {
65
+ regs.length = 0;
66
+ }
67
+ }
68
+ }
69
+
70
+ async emit(name: HookName, ctx: HookContext): Promise<void> {
71
+ const regs = this.hooks.get(name) || [];
72
+ for (const reg of regs) {
73
+ try {
74
+ await Promise.resolve(reg.fn(ctx));
75
+ } catch (error: any) {
76
+ console.error(`[Hook ${name}] error:`, error.message);
77
+ }
78
+ if (reg.once) {
79
+ this.unregister(name, reg.fn);
80
+ }
81
+ }
82
+ }
83
+
84
+ hasHooks(name: HookName): boolean {
85
+ return (this.hooks.get(name)?.length || 0) > 0;
86
+ }
87
+ }
88
+
89
+ // ==================== Built-in Hooks ====================
90
+
91
+ /**
92
+ * Audit logging hook - logs all tool calls
93
+ */
94
+ export function auditLogHook(ctx: HookContext): void {
95
+ if (ctx.toolName) {
96
+ const ts = new Date().toISOString().split('T')[1].split('.')[0];
97
+ const status = ctx.toolResult?.success ? 'OK' : 'FAIL';
98
+ console.log(`[AUDIT ${ts}] ${status} | tool=${ctx.toolName} | params=${JSON.stringify(ctx.toolParams || {})}`);
99
+ }
100
+ }
101
+
102
+ // ==================== Singleton ====================
103
+
104
+ let globalHookManager: HookManager | null = null;
105
+
106
+ export function getHookManager(): HookManager {
107
+ if (!globalHookManager) {
108
+ globalHookManager = new HookManager();
109
+ }
110
+ return globalHookManager;
111
+ }