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.
- package/CHANGELOG.md +192 -0
- package/DEVELOPMENT.md +286 -0
- package/dist/app/index.d.ts +40 -3
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/index.js +87 -12
- package/dist/app/index.js.map +1 -1
- package/dist/cache/fingerprint.d.ts +49 -0
- package/dist/cache/fingerprint.d.ts.map +1 -0
- package/dist/cache/fingerprint.js +100 -0
- package/dist/cache/fingerprint.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +15 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/smartModel.d.ts +40 -0
- package/dist/cache/smartModel.d.ts.map +1 -0
- package/dist/cache/smartModel.js +43 -0
- package/dist/cache/smartModel.js.map +1 -0
- package/dist/cache/stats.d.ts +93 -0
- package/dist/cache/stats.d.ts.map +1 -0
- package/dist/cache/stats.js +155 -0
- package/dist/cache/stats.js.map +1 -0
- package/dist/cache/volatile.d.ts +32 -0
- package/dist/cache/volatile.d.ts.map +1 -0
- package/dist/cache/volatile.js +44 -0
- package/dist/cache/volatile.js.map +1 -0
- package/dist/cmd/index.d.ts +21 -0
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +155 -31
- package/dist/cmd/index.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.d.ts +14 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/llm/anthropic.d.ts +55 -5
- package/dist/llm/anthropic.d.ts.map +1 -1
- package/dist/llm/anthropic.js +172 -26
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/index.d.ts +26 -8
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +83 -15
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/openai.d.ts +28 -8
- package/dist/llm/openai.d.ts.map +1 -1
- package/dist/llm/openai.js +58 -8
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/provider.d.ts +40 -8
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +8 -1
- package/dist/llm/provider.js.map +1 -1
- package/dist/prompts/index.d.ts +32 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +33 -11
- package/dist/prompts/index.js.map +1 -1
- package/dist/session/index.d.ts +43 -3
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +114 -17
- package/dist/session/index.js.map +1 -1
- package/dist/skills/brainstorming.js +33 -33
- package/dist/skills/code-review.js +35 -35
- package/dist/skills/executing-plans.js +18 -18
- package/dist/skills/frontend-design.js +25 -25
- package/dist/skills/git-workflow.js +26 -26
- package/dist/skills/improve-architecture.js +28 -28
- package/dist/skills/neuroweave.js +37 -37
- package/dist/skills/playwright.js +62 -62
- package/dist/skills/prototype.js +20 -20
- package/dist/skills/subagent.js +19 -19
- package/dist/skills/supabase.js +34 -34
- package/dist/skills/systematic-debugging.js +34 -34
- package/dist/skills/tdd.js +29 -29
- package/dist/skills/triage.js +25 -25
- package/dist/skills/verification.js +22 -22
- package/dist/skills/writing-plans.js +32 -32
- package/dist/tools/nwt.js +16 -16
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +9 -2
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/ChatList.d.ts.map +1 -1
- package/dist/tui/components/ChatList.js +4 -3
- package/dist/tui/components/ChatList.js.map +1 -1
- package/dist/tui/components/Header.d.ts +8 -0
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +17 -3
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/InitWizard.d.ts +12 -1
- package/dist/tui/components/InitWizard.d.ts.map +1 -1
- package/dist/tui/components/InitWizard.js +58 -3
- package/dist/tui/components/InitWizard.js.map +1 -1
- package/dist/tui/components/ToolCall.d.ts +1 -1
- package/dist/tui/components/ToolCall.d.ts.map +1 -1
- package/dist/tui/components/ToolCall.js +4 -4
- package/dist/tui/components/ToolCall.js.map +1 -1
- package/dist/tui/hooks/useChat.d.ts +22 -0
- package/dist/tui/hooks/useChat.d.ts.map +1 -1
- package/dist/tui/hooks/useChat.js +127 -50
- package/dist/tui/hooks/useChat.js.map +1 -1
- package/dist/tui/hooks/useCommands.d.ts.map +1 -1
- package/dist/tui/hooks/useCommands.js +78 -0
- package/dist/tui/hooks/useCommands.js.map +1 -1
- package/dist/types.d.ts +79 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/stableStringify.d.ts +21 -0
- package/dist/utils/stableStringify.d.ts.map +1 -0
- package/dist/utils/stableStringify.js +53 -0
- package/dist/utils/stableStringify.js.map +1 -0
- package/dist/utils/thinking.d.ts +59 -0
- package/dist/utils/thinking.d.ts.map +1 -0
- package/dist/utils/thinking.js +104 -0
- package/dist/utils/thinking.js.map +1 -0
- package/install.bat +63 -0
- package/install.ps1 +238 -0
- package/install.sh +113 -0
- package/package.json +7 -4
- package/src/app/index.ts +180 -108
- package/src/cache/fingerprint.ts +101 -0
- package/src/cache/index.ts +15 -0
- package/src/cache/smartModel.ts +52 -0
- package/src/cache/stats.ts +199 -0
- package/src/cache/volatile.ts +47 -0
- package/src/cmd/index.tsx +288 -160
- package/src/config/index.ts +156 -148
- package/src/config/providers.ts +234 -234
- package/src/config/types.ts +67 -53
- package/src/hooks/index.ts +111 -111
- package/src/llm/anthropic.ts +388 -243
- package/src/llm/gemini.ts +169 -169
- package/src/llm/index.ts +265 -200
- package/src/llm/openai.ts +243 -196
- package/src/llm/provider.ts +66 -34
- package/src/prompts/index.ts +260 -220
- package/src/session/compactor.ts +103 -103
- package/src/session/index.ts +181 -87
- package/src/session/message.ts +42 -42
- package/src/skills/brainstorming.ts +43 -43
- package/src/skills/code-review.ts +45 -45
- package/src/skills/executing-plans.ts +27 -27
- package/src/skills/frontend-design.ts +35 -35
- package/src/skills/git-workflow.ts +36 -36
- package/src/skills/improve-architecture.ts +38 -38
- package/src/skills/index.ts +136 -136
- package/src/skills/neuroweave.ts +47 -47
- package/src/skills/playwright.ts +72 -72
- package/src/skills/prototype.ts +30 -30
- package/src/skills/subagent.ts +28 -28
- package/src/skills/supabase.ts +44 -44
- package/src/skills/systematic-debugging.ts +44 -44
- package/src/skills/tdd.ts +39 -39
- package/src/skills/triage.ts +35 -35
- package/src/skills/verification.ts +31 -31
- package/src/skills/writing-plans.ts +42 -42
- package/src/tools/nwt.ts +598 -598
- package/src/tools/types.ts +122 -122
- package/src/tui/app.tsx +199 -186
- package/src/tui/components/ChatList.tsx +41 -32
- package/src/tui/components/ChatMessage.tsx +54 -54
- package/src/tui/components/Header.tsx +56 -28
- package/src/tui/components/InitWizard.tsx +217 -132
- package/src/tui/components/Markdown.tsx +35 -35
- package/src/tui/components/ModelSelector.tsx +87 -87
- package/src/tui/components/StatusBar.tsx +30 -30
- package/src/tui/components/Thinking.tsx +17 -17
- package/src/tui/components/ToolCall.tsx +102 -71
- package/src/tui/components/UserInput.tsx +131 -131
- package/src/tui/hooks/useChat.ts +287 -194
- package/src/tui/hooks/useCommands.ts +234 -154
- package/src/tui/index.ts +6 -6
- package/src/tui/welcome.ts +177 -177
- package/src/types.ts +104 -42
- package/src/utils/diff.ts +71 -71
- package/src/utils/project.ts +99 -99
- package/src/utils/stableStringify.ts +47 -0
- package/src/utils/thinking.ts +119 -0
- package/tests/cache/fingerprint.test.ts +75 -0
- package/tests/cache/stableStringify.test.ts +43 -0
- package/tests/cache/stats.test.ts +146 -0
- package/tests/cache/volatile.test.ts +75 -0
- package/tests/smoke-pollution.mjs +78 -0
- package/tests/smoke-thinking.mjs +110 -0
- package/tests/smoke-tool-stream.mjs +69 -0
- package/tests/smoke-tool.mjs +117 -0
package/dist/prompts/index.js
CHANGED
|
@@ -16,17 +16,39 @@ export class SystemPromptBuilder {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
build() {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
return this.buildSegments()
|
|
20
|
+
.map(s => s.content)
|
|
21
|
+
.filter(Boolean)
|
|
22
|
+
.join('\n\n');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* v3.0.0: build the system prompt as named segments instead of a flat
|
|
26
|
+
* string. The provider layer (Anthropic) can attach cache_control markers
|
|
27
|
+
* to the segments it caches, and the fingerprint module can hash the
|
|
28
|
+
* static portion to detect when the immutable prefix changed.
|
|
29
|
+
*
|
|
30
|
+
* Ordering rule (Reasonix-style): immutable prefix first, volatile tail
|
|
31
|
+
* last. NWT history and Date move to the tail because both can change
|
|
32
|
+
* between rounds (Date: every build; NWT: when a new event is logged).
|
|
33
|
+
* Keeping them out of the prefix means the upstream cache keeps its
|
|
34
|
+
* prefix checkpoint stable across those changes.
|
|
35
|
+
*
|
|
36
|
+
* Segments with empty content are filtered out — they neither contribute
|
|
37
|
+
* to the string output nor to any cache fingerprint.
|
|
38
|
+
*/
|
|
39
|
+
buildSegments() {
|
|
40
|
+
return [
|
|
41
|
+
// Immutable prefix (cacheable as a single block on Anthropic)
|
|
42
|
+
{ name: 'project-instructions', content: this.buildProjectInstructions(), volatile: false },
|
|
43
|
+
{ name: 'identity', content: this.buildIdentity(), volatile: false },
|
|
44
|
+
{ name: 'tool-instructions', content: this.buildToolInstructions(), volatile: false },
|
|
45
|
+
{ name: 'environment', content: this.buildEnvironment(), volatile: false },
|
|
46
|
+
{ name: 'permission-mode', content: this.buildPermissionMode(), volatile: false },
|
|
47
|
+
{ name: 'skills', content: this.buildSkills(), volatile: false },
|
|
48
|
+
// Volatile tail — not part of the cache prefix
|
|
49
|
+
{ name: 'nwt-history', content: this.buildNwtHistory(), volatile: true },
|
|
50
|
+
{ name: 'date-info', content: this.buildDateInfo(), volatile: true },
|
|
51
|
+
].filter(s => s.content);
|
|
30
52
|
}
|
|
31
53
|
buildIdentity() {
|
|
32
54
|
return [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|
package/dist/session/index.d.ts
CHANGED
|
@@ -8,14 +8,54 @@ export declare class SessionManager {
|
|
|
8
8
|
private createdAt;
|
|
9
9
|
private compactor;
|
|
10
10
|
private maxMessages;
|
|
11
|
-
|
|
11
|
+
/** v2.2.4: counter for messages dropped by the pollution filter. */
|
|
12
|
+
private droppedCount;
|
|
13
|
+
/**
|
|
14
|
+
* v3.0.0: callback invoked when the message count exceeds maxMessages.
|
|
15
|
+
* Reasonix principle: do not mutate messages to compact; instead, signal
|
|
16
|
+
* the TUI to suggest the user call /new (start a fresh session) so that
|
|
17
|
+
* the upstream prompt cache keeps a stable prefix. NWT auto-logs every
|
|
18
|
+
* meaningful event, so no history is lost — it just moves out of the
|
|
19
|
+
* live cache window.
|
|
20
|
+
*/
|
|
21
|
+
onSuggestNewSession?: (info: {
|
|
22
|
+
currentLength: number;
|
|
23
|
+
max: number;
|
|
24
|
+
}) => void;
|
|
25
|
+
constructor(maxMessages?: number, options?: {
|
|
26
|
+
onSuggestNewSession?: SessionManager['onSuggestNewSession'];
|
|
27
|
+
});
|
|
12
28
|
addMessage(role: ChatMessage['role'], content: string, extras?: Partial<ChatMessage>): void;
|
|
29
|
+
/**
|
|
30
|
+
* v2.2.4 (port from v2.1.0): same as addMessage but returns false
|
|
31
|
+
* (and skips the push) if the message content matches a known
|
|
32
|
+
* truncation/abort pollution pattern. Use this for assistant
|
|
33
|
+
* messages whose stream might have been aborted.
|
|
34
|
+
*/
|
|
35
|
+
addMessageSafe(role: ChatMessage['role'], content: string, extras?: Partial<ChatMessage>): boolean;
|
|
36
|
+
/** v2.2.4: total messages dropped by addMessageSafe since session start. */
|
|
37
|
+
getDroppedCount(): number;
|
|
13
38
|
getMessages(): ChatMessage[];
|
|
14
39
|
getMessageCount(): number;
|
|
15
40
|
clear(): void;
|
|
16
41
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
42
|
+
* v3.0.0: "auto-compact" is now a no-op on `messages`. We instead invoke
|
|
43
|
+
* the registered `onSuggestNewSession` callback (if any) so the TUI can
|
|
44
|
+
* surface a "context is getting long, consider /new" hint. This keeps
|
|
45
|
+
* the messages array byte-stable across rounds, which is critical for
|
|
46
|
+
* prompt-cache hit-rate: any reordering or summary insertion would
|
|
47
|
+
* invalidate every cache breakpoint the upstream provider has set.
|
|
48
|
+
*
|
|
49
|
+
* Rationale (Reasonix-style): when context exceeds the model window or
|
|
50
|
+
* the configured maxMessages threshold, the right action is to start a
|
|
51
|
+
* NEW session, not to silently truncate or summarize. NWT auto-logs
|
|
52
|
+
* every meaningful event, so the user does not lose context — it just
|
|
53
|
+
* moves out of the live cache window. If the user wants a longer
|
|
54
|
+
* session, they can bump maxMessages in `~/.thatgfsj/config.json`.
|
|
55
|
+
*
|
|
56
|
+
* The original "fake compact" logic (insert `[Earlier conversation...]`
|
|
57
|
+
* summary) is preserved as `truncate()` for callers that explicitly
|
|
58
|
+
* want to compact (e.g. /new command hard-reset).
|
|
19
59
|
*/
|
|
20
60
|
private autoCompact;
|
|
21
61
|
truncate(maxMessages?: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqD/C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,oEAAoE;IACpE,OAAO,CAAC,YAAY,CAAa;IACjC;;;;;;;OAOG;IACI,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;gBAExE,WAAW,SAAK,EAAE,OAAO,CAAC,EAAE;QAAE,mBAAmB,CAAC,EAAE,cAAc,CAAC,qBAAqB,CAAC,CAAA;KAAE;IAQvG,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAK3F;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO;IASlG,4EAA4E;IAC5E,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,WAAW,EAAE;IAI5B,eAAe,IAAI,MAAM;IAIzB,KAAK,IAAI,IAAI;IAIb;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,WAAW;IAiBnB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IASpC,KAAK,IAAI,MAAM;IAIf,OAAO,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE;CAOjE;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzE,cAAc,cAAc,CAAC"}
|
package/dist/session/index.js
CHANGED
|
@@ -2,22 +2,105 @@
|
|
|
2
2
|
* Session Manager - Manages conversation history with auto-compaction
|
|
3
3
|
*/
|
|
4
4
|
import { ContextCompactor } from './compactor.js';
|
|
5
|
+
/**
|
|
6
|
+
* v2.2.4 (port from v2.1.0): patterns that, if found in an assistant
|
|
7
|
+
* message, indicate the message is a truncated/aborted response that
|
|
8
|
+
* should NOT be persisted into history. Without this filter, the next
|
|
9
|
+
* turn's LLM sees the marker and starts echoing it back, creating a
|
|
10
|
+
* self-reinforcing "[已中断]" hallucination loop.
|
|
11
|
+
*
|
|
12
|
+
* v2.2.6.1 tightening (smoke-test driven): the design here is a
|
|
13
|
+
* two-tier check:
|
|
14
|
+
* 1. STRONG markers — unambiguous pollution, always drop:
|
|
15
|
+
* - `[已中断]` bracketed (the model emits this exact form)
|
|
16
|
+
* - `[interrupted]` bracketed English equivalent
|
|
17
|
+
* 2. WEAK markers — only drop if the message is also short (<200
|
|
18
|
+
* chars). Long messages mentioning "response truncated" are
|
|
19
|
+
* legitimate conversation (e.g. user complaints about past
|
|
20
|
+
* behavior), not pollution.
|
|
21
|
+
*
|
|
22
|
+
* Earlier drafts matched bare `已中断` substrings and "response
|
|
23
|
+
* truncated" anywhere in the message — both were too greedy and
|
|
24
|
+
* dropped legitimate Chinese/English conversation.
|
|
25
|
+
*/
|
|
26
|
+
const POLLUTION_STRONG = [
|
|
27
|
+
/\[已中断\]/,
|
|
28
|
+
/\[interrupted\]/i,
|
|
29
|
+
];
|
|
30
|
+
const POLLUTION_WEAK = [
|
|
31
|
+
/^\s*[\*#>\-`]*\s*\[已中断\]/m,
|
|
32
|
+
/^\s*[\*#>\-`]*\s*\[interrupted\]/im,
|
|
33
|
+
/\bresponse (was )?(truncated|cut off|interrupted)\b/i,
|
|
34
|
+
/\boutput (was )?(truncated|cut off|interrupted)\b/i,
|
|
35
|
+
];
|
|
36
|
+
function looksPolluted(content) {
|
|
37
|
+
if (!content)
|
|
38
|
+
return false;
|
|
39
|
+
if (POLLUTION_STRONG.some(p => p.test(content)))
|
|
40
|
+
return true;
|
|
41
|
+
// WEAK pattern gate:
|
|
42
|
+
// - Message must be short (model got cut off mid-stream, so it
|
|
43
|
+
// can't be long)
|
|
44
|
+
// - Message must NOT end with '?' (questions are user complaints
|
|
45
|
+
// about past behavior, not pollution)
|
|
46
|
+
// - Message must NOT contain "last time" / "earlier" / "before"
|
|
47
|
+
// (temporal references indicate user discussing past behavior)
|
|
48
|
+
if (content.length >= 200)
|
|
49
|
+
return false;
|
|
50
|
+
if (/\?\s*$/.test(content.trim()))
|
|
51
|
+
return false;
|
|
52
|
+
if (/\b(last time|earlier|before|previously|yesterday)\b/i.test(content))
|
|
53
|
+
return false;
|
|
54
|
+
if (POLLUTION_WEAK.some(p => p.test(content)))
|
|
55
|
+
return true;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
5
58
|
export class SessionManager {
|
|
6
59
|
messages = [];
|
|
7
60
|
sessionId;
|
|
8
61
|
createdAt;
|
|
9
62
|
compactor;
|
|
10
63
|
maxMessages;
|
|
11
|
-
|
|
64
|
+
/** v2.2.4: counter for messages dropped by the pollution filter. */
|
|
65
|
+
droppedCount = 0;
|
|
66
|
+
/**
|
|
67
|
+
* v3.0.0: callback invoked when the message count exceeds maxMessages.
|
|
68
|
+
* Reasonix principle: do not mutate messages to compact; instead, signal
|
|
69
|
+
* the TUI to suggest the user call /new (start a fresh session) so that
|
|
70
|
+
* the upstream prompt cache keeps a stable prefix. NWT auto-logs every
|
|
71
|
+
* meaningful event, so no history is lost — it just moves out of the
|
|
72
|
+
* live cache window.
|
|
73
|
+
*/
|
|
74
|
+
onSuggestNewSession;
|
|
75
|
+
constructor(maxMessages = 50, options) {
|
|
12
76
|
this.maxMessages = maxMessages;
|
|
13
77
|
this.sessionId = `session_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
14
78
|
this.createdAt = new Date();
|
|
15
79
|
this.compactor = new ContextCompactor({ maxMessages });
|
|
80
|
+
this.onSuggestNewSession = options?.onSuggestNewSession;
|
|
16
81
|
}
|
|
17
82
|
addMessage(role, content, extras) {
|
|
18
83
|
this.messages.push({ role, content, ...extras });
|
|
19
84
|
this.autoCompact();
|
|
20
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* v2.2.4 (port from v2.1.0): same as addMessage but returns false
|
|
88
|
+
* (and skips the push) if the message content matches a known
|
|
89
|
+
* truncation/abort pollution pattern. Use this for assistant
|
|
90
|
+
* messages whose stream might have been aborted.
|
|
91
|
+
*/
|
|
92
|
+
addMessageSafe(role, content, extras) {
|
|
93
|
+
if (role === 'assistant' && looksPolluted(content)) {
|
|
94
|
+
this.droppedCount++;
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
this.addMessage(role, content, extras);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
/** v2.2.4: total messages dropped by addMessageSafe since session start. */
|
|
101
|
+
getDroppedCount() {
|
|
102
|
+
return this.droppedCount;
|
|
103
|
+
}
|
|
21
104
|
getMessages() {
|
|
22
105
|
return [...this.messages];
|
|
23
106
|
}
|
|
@@ -28,26 +111,40 @@ export class SessionManager {
|
|
|
28
111
|
this.messages = [];
|
|
29
112
|
}
|
|
30
113
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
114
|
+
* v3.0.0: "auto-compact" is now a no-op on `messages`. We instead invoke
|
|
115
|
+
* the registered `onSuggestNewSession` callback (if any) so the TUI can
|
|
116
|
+
* surface a "context is getting long, consider /new" hint. This keeps
|
|
117
|
+
* the messages array byte-stable across rounds, which is critical for
|
|
118
|
+
* prompt-cache hit-rate: any reordering or summary insertion would
|
|
119
|
+
* invalidate every cache breakpoint the upstream provider has set.
|
|
120
|
+
*
|
|
121
|
+
* Rationale (Reasonix-style): when context exceeds the model window or
|
|
122
|
+
* the configured maxMessages threshold, the right action is to start a
|
|
123
|
+
* NEW session, not to silently truncate or summarize. NWT auto-logs
|
|
124
|
+
* every meaningful event, so the user does not lose context — it just
|
|
125
|
+
* moves out of the live cache window. If the user wants a longer
|
|
126
|
+
* session, they can bump maxMessages in `~/.thatgfsj/config.json`.
|
|
127
|
+
*
|
|
128
|
+
* The original "fake compact" logic (insert `[Earlier conversation...]`
|
|
129
|
+
* summary) is preserved as `truncate()` for callers that explicitly
|
|
130
|
+
* want to compact (e.g. /new command hard-reset).
|
|
33
131
|
*/
|
|
34
132
|
autoCompact() {
|
|
35
133
|
if (this.messages.length <= this.maxMessages)
|
|
36
134
|
return;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.messages = [...cleanSystem, summary, ...recent];
|
|
135
|
+
// Notify the TUI. The default TUI behavior is to render a toast:
|
|
136
|
+
// ⚠️ 上下文超长({currentLength}/{max}),建议调 /new 开新会话
|
|
137
|
+
// (NWT 已自动归档历史)
|
|
138
|
+
try {
|
|
139
|
+
this.onSuggestNewSession?.({
|
|
140
|
+
currentLength: this.messages.length,
|
|
141
|
+
max: this.maxMessages,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// Callback failure must not break the chat loop.
|
|
146
|
+
}
|
|
147
|
+
// Intentionally do NOT mutate this.messages. Prefix stability matters more.
|
|
51
148
|
}
|
|
52
149
|
truncate(maxMessages) {
|
|
53
150
|
if (maxMessages) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAkB,EAAE,CAAC;IAC7B,SAAS,CAAS;IAClB,SAAS,CAAO;IAChB,SAAS,CAAmB;IAC5B,WAAW,CAAS;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,39 +4,39 @@ export const brainstormingSkill = {
|
|
|
4
4
|
description: 'Explore multiple approaches before committing to a solution',
|
|
5
5
|
category: 'planning',
|
|
6
6
|
autoActivate: ['怎么', 'how to', '方案', 'approach', '有没有', 'alternatives'],
|
|
7
|
-
prompt: `## Brainstorming Mode
|
|
8
|
-
|
|
9
|
-
When exploring solutions, don't jump to the first idea. Instead:
|
|
10
|
-
|
|
11
|
-
### 1. Generate Options
|
|
12
|
-
List 3-5 different approaches, including at least one unconventional one.
|
|
13
|
-
|
|
14
|
-
### 2. Evaluate Each
|
|
15
|
-
For each approach, briefly note:
|
|
16
|
-
- **Pros**: What makes it good
|
|
17
|
-
- **Cons**: What could go wrong
|
|
18
|
-
- **Effort**: How much work (quick/medium/heavy)
|
|
19
|
-
|
|
20
|
-
### 3. Recommend
|
|
21
|
-
Pick the best approach and explain WHY it's the best fit for this specific situation.
|
|
22
|
-
|
|
23
|
-
### Format
|
|
24
|
-
\`\`\`
|
|
25
|
-
## Approaches
|
|
26
|
-
|
|
27
|
-
### Option A: [Name]
|
|
28
|
-
- Pros: ...
|
|
29
|
-
- Cons: ...
|
|
30
|
-
- Effort: medium
|
|
31
|
-
|
|
32
|
-
### Option B: [Name]
|
|
33
|
-
- Pros: ...
|
|
34
|
-
- Cons: ...
|
|
35
|
-
- Effort: quick
|
|
36
|
-
|
|
37
|
-
**Recommendation**: Option B because [specific reason]
|
|
38
|
-
\`\`\`
|
|
39
|
-
|
|
7
|
+
prompt: `## Brainstorming Mode
|
|
8
|
+
|
|
9
|
+
When exploring solutions, don't jump to the first idea. Instead:
|
|
10
|
+
|
|
11
|
+
### 1. Generate Options
|
|
12
|
+
List 3-5 different approaches, including at least one unconventional one.
|
|
13
|
+
|
|
14
|
+
### 2. Evaluate Each
|
|
15
|
+
For each approach, briefly note:
|
|
16
|
+
- **Pros**: What makes it good
|
|
17
|
+
- **Cons**: What could go wrong
|
|
18
|
+
- **Effort**: How much work (quick/medium/heavy)
|
|
19
|
+
|
|
20
|
+
### 3. Recommend
|
|
21
|
+
Pick the best approach and explain WHY it's the best fit for this specific situation.
|
|
22
|
+
|
|
23
|
+
### Format
|
|
24
|
+
\`\`\`
|
|
25
|
+
## Approaches
|
|
26
|
+
|
|
27
|
+
### Option A: [Name]
|
|
28
|
+
- Pros: ...
|
|
29
|
+
- Cons: ...
|
|
30
|
+
- Effort: medium
|
|
31
|
+
|
|
32
|
+
### Option B: [Name]
|
|
33
|
+
- Pros: ...
|
|
34
|
+
- Cons: ...
|
|
35
|
+
- Effort: quick
|
|
36
|
+
|
|
37
|
+
**Recommendation**: Option B because [specific reason]
|
|
38
|
+
\`\`\`
|
|
39
|
+
|
|
40
40
|
Don't just list options - give a clear recommendation with reasoning.`,
|
|
41
41
|
};
|
|
42
42
|
//# sourceMappingURL=brainstorming.js.map
|
|
@@ -4,41 +4,41 @@ export const codeReviewSkill = {
|
|
|
4
4
|
description: 'Systematic code review for quality, security, and correctness',
|
|
5
5
|
category: 'review',
|
|
6
6
|
autoActivate: ['review', '审查', '检查代码', 'code quality'],
|
|
7
|
-
prompt: `## Code Review Checklist
|
|
8
|
-
|
|
9
|
-
When reviewing code (your own or others):
|
|
10
|
-
|
|
11
|
-
### Correctness
|
|
12
|
-
- Does it do what it's supposed to?
|
|
13
|
-
- Are edge cases handled?
|
|
14
|
-
- Are error cases handled?
|
|
15
|
-
|
|
16
|
-
### Security
|
|
17
|
-
- No hardcoded secrets or API keys
|
|
18
|
-
- Input validation on user data
|
|
19
|
-
- No SQL injection, XSS, or path traversal risks
|
|
20
|
-
|
|
21
|
-
### Performance
|
|
22
|
-
- No unnecessary loops or allocations
|
|
23
|
-
- Efficient data structures
|
|
24
|
-
- No N+1 queries or blocking calls
|
|
25
|
-
|
|
26
|
-
### Readability
|
|
27
|
-
- Clear variable/function names
|
|
28
|
-
- Appropriate comments (why, not what)
|
|
29
|
-
- Consistent style with codebase
|
|
30
|
-
|
|
31
|
-
### Testability
|
|
32
|
-
- Can this be easily tested?
|
|
33
|
-
- Are dependencies injectable?
|
|
34
|
-
- Are side effects isolated?
|
|
35
|
-
|
|
36
|
-
### Output Format
|
|
37
|
-
\`\`\`
|
|
38
|
-
## Review Summary
|
|
39
|
-
✅ Good: [what's done well]
|
|
40
|
-
⚠️ Suggestions: [improvements]
|
|
41
|
-
🔴 Issues: [must fix]
|
|
7
|
+
prompt: `## Code Review Checklist
|
|
8
|
+
|
|
9
|
+
When reviewing code (your own or others):
|
|
10
|
+
|
|
11
|
+
### Correctness
|
|
12
|
+
- Does it do what it's supposed to?
|
|
13
|
+
- Are edge cases handled?
|
|
14
|
+
- Are error cases handled?
|
|
15
|
+
|
|
16
|
+
### Security
|
|
17
|
+
- No hardcoded secrets or API keys
|
|
18
|
+
- Input validation on user data
|
|
19
|
+
- No SQL injection, XSS, or path traversal risks
|
|
20
|
+
|
|
21
|
+
### Performance
|
|
22
|
+
- No unnecessary loops or allocations
|
|
23
|
+
- Efficient data structures
|
|
24
|
+
- No N+1 queries or blocking calls
|
|
25
|
+
|
|
26
|
+
### Readability
|
|
27
|
+
- Clear variable/function names
|
|
28
|
+
- Appropriate comments (why, not what)
|
|
29
|
+
- Consistent style with codebase
|
|
30
|
+
|
|
31
|
+
### Testability
|
|
32
|
+
- Can this be easily tested?
|
|
33
|
+
- Are dependencies injectable?
|
|
34
|
+
- Are side effects isolated?
|
|
35
|
+
|
|
36
|
+
### Output Format
|
|
37
|
+
\`\`\`
|
|
38
|
+
## Review Summary
|
|
39
|
+
✅ Good: [what's done well]
|
|
40
|
+
⚠️ Suggestions: [improvements]
|
|
41
|
+
🔴 Issues: [must fix]
|
|
42
42
|
\`\`\``,
|
|
43
43
|
};
|
|
44
44
|
//# sourceMappingURL=code-review.js.map
|
|
@@ -3,24 +3,24 @@ export const executingPlansSkill = {
|
|
|
3
3
|
name: 'Executing Plans',
|
|
4
4
|
description: 'Execute multi-step plans methodically with verification',
|
|
5
5
|
category: 'planning',
|
|
6
|
-
prompt: `## Plan Execution Mode
|
|
7
|
-
|
|
8
|
-
When executing a plan or multi-step task:
|
|
9
|
-
|
|
10
|
-
1. **One step at a time** - Complete each step fully before moving to the next
|
|
11
|
-
2. **Verify each step** - After each change, verify it works (read the file, run a test, check syntax)
|
|
12
|
-
3. **Report progress** - Tell the user what you did for each step
|
|
13
|
-
4. **Handle failures** - If a step fails, stop and explain. Don't silently skip.
|
|
14
|
-
5. **Commit checkpoints** - After successful steps, suggest a git commit
|
|
15
|
-
|
|
16
|
-
### Progress Format
|
|
17
|
-
\`\`\`
|
|
18
|
-
✅ Step 1: [What was done] - Verified
|
|
19
|
-
✅ Step 2: [What was done] - Verified
|
|
20
|
-
⏳ Step 3: [Currently working on]
|
|
21
|
-
⬜ Step 4: [Pending]
|
|
22
|
-
\`\`\`
|
|
23
|
-
|
|
6
|
+
prompt: `## Plan Execution Mode
|
|
7
|
+
|
|
8
|
+
When executing a plan or multi-step task:
|
|
9
|
+
|
|
10
|
+
1. **One step at a time** - Complete each step fully before moving to the next
|
|
11
|
+
2. **Verify each step** - After each change, verify it works (read the file, run a test, check syntax)
|
|
12
|
+
3. **Report progress** - Tell the user what you did for each step
|
|
13
|
+
4. **Handle failures** - If a step fails, stop and explain. Don't silently skip.
|
|
14
|
+
5. **Commit checkpoints** - After successful steps, suggest a git commit
|
|
15
|
+
|
|
16
|
+
### Progress Format
|
|
17
|
+
\`\`\`
|
|
18
|
+
✅ Step 1: [What was done] - Verified
|
|
19
|
+
✅ Step 2: [What was done] - Verified
|
|
20
|
+
⏳ Step 3: [Currently working on]
|
|
21
|
+
⬜ Step 4: [Pending]
|
|
22
|
+
\`\`\`
|
|
23
|
+
|
|
24
24
|
If you encounter an unexpected issue, stop and ask the user how to proceed.`,
|
|
25
25
|
};
|
|
26
26
|
//# sourceMappingURL=executing-plans.js.map
|
|
@@ -4,31 +4,31 @@ export const frontendDesignSkill = {
|
|
|
4
4
|
description: 'UI/UX best practices for web interfaces',
|
|
5
5
|
category: 'architecture',
|
|
6
6
|
autoActivate: ['ui', 'ux', 'frontend', 'css', 'layout', 'design', '界面', '页面'],
|
|
7
|
-
prompt: `## Frontend Design Principles
|
|
8
|
-
|
|
9
|
-
### Layout
|
|
10
|
-
- Use CSS Grid for 2D layouts, Flexbox for 1D
|
|
11
|
-
- Mobile-first: design for small screens, enhance for larger
|
|
12
|
-
- Consistent spacing: use a 4px or 8px grid system
|
|
13
|
-
|
|
14
|
-
### Typography
|
|
15
|
-
- Max 2-3 font sizes per page
|
|
16
|
-
- Line height: 1.5 for body, 1.2 for headings
|
|
17
|
-
- Max line length: 60-80 characters
|
|
18
|
-
|
|
19
|
-
### Color
|
|
20
|
-
- Use a limited palette (primary, secondary, accent, neutral)
|
|
21
|
-
- Ensure contrast ratio ≥ 4.5:1 for text
|
|
22
|
-
- Use color purposefully (not just decoration)
|
|
23
|
-
|
|
24
|
-
### Components
|
|
25
|
-
- Keep components small and focused
|
|
26
|
-
- Extract reusable patterns early
|
|
27
|
-
- Props should be explicit, not spread
|
|
28
|
-
|
|
29
|
-
### Performance
|
|
30
|
-
- Lazy load images and heavy components
|
|
31
|
-
- Minimize bundle size
|
|
7
|
+
prompt: `## Frontend Design Principles
|
|
8
|
+
|
|
9
|
+
### Layout
|
|
10
|
+
- Use CSS Grid for 2D layouts, Flexbox for 1D
|
|
11
|
+
- Mobile-first: design for small screens, enhance for larger
|
|
12
|
+
- Consistent spacing: use a 4px or 8px grid system
|
|
13
|
+
|
|
14
|
+
### Typography
|
|
15
|
+
- Max 2-3 font sizes per page
|
|
16
|
+
- Line height: 1.5 for body, 1.2 for headings
|
|
17
|
+
- Max line length: 60-80 characters
|
|
18
|
+
|
|
19
|
+
### Color
|
|
20
|
+
- Use a limited palette (primary, secondary, accent, neutral)
|
|
21
|
+
- Ensure contrast ratio ≥ 4.5:1 for text
|
|
22
|
+
- Use color purposefully (not just decoration)
|
|
23
|
+
|
|
24
|
+
### Components
|
|
25
|
+
- Keep components small and focused
|
|
26
|
+
- Extract reusable patterns early
|
|
27
|
+
- Props should be explicit, not spread
|
|
28
|
+
|
|
29
|
+
### Performance
|
|
30
|
+
- Lazy load images and heavy components
|
|
31
|
+
- Minimize bundle size
|
|
32
32
|
- Use skeleton loaders for async content`,
|
|
33
33
|
};
|
|
34
34
|
//# sourceMappingURL=frontend-design.js.map
|
|
@@ -4,32 +4,32 @@ export const gitWorkflowSkill = {
|
|
|
4
4
|
description: 'Clean git practices: commits, branches, PRs',
|
|
5
5
|
category: 'workflow',
|
|
6
6
|
autoActivate: ['git', 'commit', 'branch', 'merge', 'push', 'pull request'],
|
|
7
|
-
prompt: `## Git Best Practices
|
|
8
|
-
|
|
9
|
-
### Commits
|
|
10
|
-
- **Atomic**: One logical change per commit
|
|
11
|
-
- **Message format**: \`type(scope): description\`
|
|
12
|
-
- feat: new feature
|
|
13
|
-
- fix: bug fix
|
|
14
|
-
- refactor: code restructuring
|
|
15
|
-
- docs: documentation
|
|
16
|
-
- test: adding tests
|
|
17
|
-
- chore: maintenance
|
|
18
|
-
|
|
19
|
-
### Before Committing
|
|
20
|
-
1. Review changes: \`git diff --staged\`
|
|
21
|
-
2. Run tests
|
|
22
|
-
3. Check for secrets or debug code
|
|
23
|
-
|
|
24
|
-
### Branch Naming
|
|
25
|
-
- \`feature/description\` - New features
|
|
26
|
-
- \`fix/description\` - Bug fixes
|
|
27
|
-
- \`refactor/description\` - Code improvements
|
|
28
|
-
|
|
29
|
-
### Workflow
|
|
30
|
-
1. Create branch from main
|
|
31
|
-
2. Make changes with atomic commits
|
|
32
|
-
3. Push and create PR
|
|
7
|
+
prompt: `## Git Best Practices
|
|
8
|
+
|
|
9
|
+
### Commits
|
|
10
|
+
- **Atomic**: One logical change per commit
|
|
11
|
+
- **Message format**: \`type(scope): description\`
|
|
12
|
+
- feat: new feature
|
|
13
|
+
- fix: bug fix
|
|
14
|
+
- refactor: code restructuring
|
|
15
|
+
- docs: documentation
|
|
16
|
+
- test: adding tests
|
|
17
|
+
- chore: maintenance
|
|
18
|
+
|
|
19
|
+
### Before Committing
|
|
20
|
+
1. Review changes: \`git diff --staged\`
|
|
21
|
+
2. Run tests
|
|
22
|
+
3. Check for secrets or debug code
|
|
23
|
+
|
|
24
|
+
### Branch Naming
|
|
25
|
+
- \`feature/description\` - New features
|
|
26
|
+
- \`fix/description\` - Bug fixes
|
|
27
|
+
- \`refactor/description\` - Code improvements
|
|
28
|
+
|
|
29
|
+
### Workflow
|
|
30
|
+
1. Create branch from main
|
|
31
|
+
2. Make changes with atomic commits
|
|
32
|
+
3. Push and create PR
|
|
33
33
|
4. Squash merge to main`,
|
|
34
34
|
};
|
|
35
35
|
//# sourceMappingURL=git-workflow.js.map
|