waifu-code 1.0.1

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 (59) hide show
  1. package/README.md +51 -0
  2. package/dist/cli.d.ts +15 -0
  3. package/dist/cli.js +188 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config.d.ts +35 -0
  6. package/dist/config.js +73 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/observer/eventDetector.d.ts +16 -0
  9. package/dist/observer/eventDetector.js +30 -0
  10. package/dist/observer/eventDetector.js.map +1 -0
  11. package/dist/observer/streamObserver.d.ts +8 -0
  12. package/dist/observer/streamObserver.js +24 -0
  13. package/dist/observer/streamObserver.js.map +1 -0
  14. package/dist/providers/converter.d.ts +18 -0
  15. package/dist/providers/converter.js +168 -0
  16. package/dist/providers/converter.js.map +1 -0
  17. package/dist/providers/nim.d.ts +23 -0
  18. package/dist/providers/nim.js +276 -0
  19. package/dist/providers/nim.js.map +1 -0
  20. package/dist/providers/sseBuilder.d.ts +53 -0
  21. package/dist/providers/sseBuilder.js +280 -0
  22. package/dist/providers/sseBuilder.js.map +1 -0
  23. package/dist/providers/thinkParser.d.ts +21 -0
  24. package/dist/providers/thinkParser.js +130 -0
  25. package/dist/providers/thinkParser.js.map +1 -0
  26. package/dist/providers/toolParser.d.ts +31 -0
  27. package/dist/providers/toolParser.js +163 -0
  28. package/dist/providers/toolParser.js.map +1 -0
  29. package/dist/providers/types.d.ts +57 -0
  30. package/dist/providers/types.js +20 -0
  31. package/dist/providers/types.js.map +1 -0
  32. package/dist/proxy/auth.d.ts +13 -0
  33. package/dist/proxy/auth.js +37 -0
  34. package/dist/proxy/auth.js.map +1 -0
  35. package/dist/proxy/commandUtils.d.ts +15 -0
  36. package/dist/proxy/commandUtils.js +155 -0
  37. package/dist/proxy/commandUtils.js.map +1 -0
  38. package/dist/proxy/detection.d.ts +13 -0
  39. package/dist/proxy/detection.js +107 -0
  40. package/dist/proxy/detection.js.map +1 -0
  41. package/dist/proxy/optimizer.d.ts +14 -0
  42. package/dist/proxy/optimizer.js +56 -0
  43. package/dist/proxy/optimizer.js.map +1 -0
  44. package/dist/proxy/routes.d.ts +21 -0
  45. package/dist/proxy/routes.js +142 -0
  46. package/dist/proxy/routes.js.map +1 -0
  47. package/dist/proxy/server.d.ts +31 -0
  48. package/dist/proxy/server.js +87 -0
  49. package/dist/proxy/server.js.map +1 -0
  50. package/dist/proxy/tokenCounter.d.ts +12 -0
  51. package/dist/proxy/tokenCounter.js +91 -0
  52. package/dist/proxy/tokenCounter.js.map +1 -0
  53. package/dist/proxy/types.d.ts +89 -0
  54. package/dist/proxy/types.js +7 -0
  55. package/dist/proxy/types.js.map +1 -0
  56. package/dist/waifu/overlayRenderer.d.ts +14 -0
  57. package/dist/waifu/overlayRenderer.js +49 -0
  58. package/dist/waifu/overlayRenderer.js.map +1 -0
  59. package/package.json +40 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Simple token counter for API requests.
3
+ *
4
+ * Uses character-based estimation (chars/4) since we don't want
5
+ * to bundle tiktoken's native WASM module as a dependency.
6
+ */
7
+ import type { Message, Tool, SystemContent } from "./types.js";
8
+ /**
9
+ * Estimate token count for a request.
10
+ * Uses simple char/4 heuristic (no tiktoken dependency).
11
+ */
12
+ export declare function getTokenCount(messages: Message[], system?: string | SystemContent[] | null, tools?: Tool[] | null): number;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Simple token counter for API requests.
3
+ *
4
+ * Uses character-based estimation (chars/4) since we don't want
5
+ * to bundle tiktoken's native WASM module as a dependency.
6
+ */
7
+ function getBlockAttr(block, attr, defaultVal = "") {
8
+ return block?.[attr] ?? defaultVal;
9
+ }
10
+ /**
11
+ * Estimate token count for a request.
12
+ * Uses simple char/4 heuristic (no tiktoken dependency).
13
+ */
14
+ export function getTokenCount(messages, system, tools) {
15
+ let totalTokens = 0;
16
+ // System prompt
17
+ if (system) {
18
+ if (typeof system === "string") {
19
+ totalTokens += Math.ceil(system.length / 4);
20
+ }
21
+ else if (Array.isArray(system)) {
22
+ for (const block of system) {
23
+ const text = getBlockAttr(block, "text", "");
24
+ if (text)
25
+ totalTokens += Math.ceil(String(text).length / 4);
26
+ }
27
+ }
28
+ totalTokens += 4; // formatting overhead
29
+ }
30
+ // Messages
31
+ for (const msg of messages) {
32
+ if (typeof msg.content === "string") {
33
+ totalTokens += Math.ceil(msg.content.length / 4);
34
+ }
35
+ else if (Array.isArray(msg.content)) {
36
+ for (const block of msg.content) {
37
+ const bType = getBlockAttr(block, "type");
38
+ if (bType === "text") {
39
+ totalTokens += Math.ceil(String(getBlockAttr(block, "text", "")).length / 4);
40
+ }
41
+ else if (bType === "thinking") {
42
+ totalTokens += Math.ceil(String(getBlockAttr(block, "thinking", "")).length / 4);
43
+ }
44
+ else if (bType === "tool_use") {
45
+ const name = String(getBlockAttr(block, "name", ""));
46
+ const inp = getBlockAttr(block, "input", {});
47
+ const id = String(getBlockAttr(block, "id", ""));
48
+ totalTokens += Math.ceil(name.length / 4);
49
+ totalTokens += Math.ceil(JSON.stringify(inp).length / 4);
50
+ totalTokens += Math.ceil(id.length / 4);
51
+ totalTokens += 15;
52
+ }
53
+ else if (bType === "image") {
54
+ const source = getBlockAttr(block, "source");
55
+ if (source && typeof source === "object") {
56
+ const data = source.data || source.base64 || "";
57
+ totalTokens += data ? Math.max(85, Math.ceil(data.length / 3000)) : 765;
58
+ }
59
+ else {
60
+ totalTokens += 765;
61
+ }
62
+ }
63
+ else if (bType === "tool_result") {
64
+ const content = getBlockAttr(block, "content", "");
65
+ const toolUseId = String(getBlockAttr(block, "tool_use_id", ""));
66
+ if (typeof content === "string") {
67
+ totalTokens += Math.ceil(content.length / 4);
68
+ }
69
+ else {
70
+ totalTokens += Math.ceil(JSON.stringify(content).length / 4);
71
+ }
72
+ totalTokens += Math.ceil(toolUseId.length / 4);
73
+ totalTokens += 8;
74
+ }
75
+ }
76
+ }
77
+ }
78
+ // Tools
79
+ if (tools) {
80
+ for (const tool of tools) {
81
+ const toolStr = tool.name + (tool.description || "") + JSON.stringify(tool.input_schema);
82
+ totalTokens += Math.ceil(toolStr.length / 4);
83
+ }
84
+ }
85
+ // Per-message and per-tool overhead
86
+ totalTokens += messages.length * 4;
87
+ if (tools)
88
+ totalTokens += tools.length * 5;
89
+ return Math.max(1, totalTokens);
90
+ }
91
+ //# sourceMappingURL=tokenCounter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenCounter.js","sourceRoot":"","sources":["../../src/proxy/tokenCounter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * TypeScript types for Anthropic-compatible requests and responses.
3
+ *
4
+ * These mirror the Anthropic Messages API format that claude-code uses.
5
+ */
6
+ export interface ContentBlockText {
7
+ type: "text";
8
+ text: string;
9
+ }
10
+ export interface ContentBlockImage {
11
+ type: "image";
12
+ source: Record<string, any>;
13
+ }
14
+ export interface ContentBlockToolUse {
15
+ type: "tool_use";
16
+ id: string;
17
+ name: string;
18
+ input: Record<string, any>;
19
+ }
20
+ export interface ContentBlockToolResult {
21
+ type: "tool_result";
22
+ tool_use_id: string;
23
+ content: string | any[] | Record<string, any>;
24
+ }
25
+ export interface ContentBlockThinking {
26
+ type: "thinking";
27
+ thinking: string;
28
+ }
29
+ export type ContentBlock = ContentBlockText | ContentBlockImage | ContentBlockToolUse | ContentBlockToolResult | ContentBlockThinking;
30
+ export interface Message {
31
+ role: "user" | "assistant";
32
+ content: string | ContentBlock[];
33
+ }
34
+ export interface Tool {
35
+ name: string;
36
+ description?: string | null;
37
+ input_schema: Record<string, any>;
38
+ }
39
+ export interface SystemContent {
40
+ type: "text";
41
+ text: string;
42
+ }
43
+ export interface MessagesRequest {
44
+ model: string;
45
+ max_tokens?: number | null;
46
+ messages: Message[];
47
+ system?: string | SystemContent[] | null;
48
+ stop_sequences?: string[] | null;
49
+ stream?: boolean | null;
50
+ temperature?: number | null;
51
+ top_p?: number | null;
52
+ top_k?: number | null;
53
+ metadata?: Record<string, any> | null;
54
+ tools?: Tool[] | null;
55
+ tool_choice?: Record<string, any> | null;
56
+ thinking?: {
57
+ enabled?: boolean;
58
+ } | null;
59
+ extra_body?: Record<string, any> | null;
60
+ }
61
+ export interface TokenCountRequest {
62
+ model: string;
63
+ messages: Message[];
64
+ system?: string | SystemContent[] | null;
65
+ tools?: Tool[] | null;
66
+ thinking?: {
67
+ enabled?: boolean;
68
+ } | null;
69
+ tool_choice?: Record<string, any> | null;
70
+ }
71
+ export interface Usage {
72
+ input_tokens: number;
73
+ output_tokens: number;
74
+ cache_creation_input_tokens?: number;
75
+ cache_read_input_tokens?: number;
76
+ }
77
+ export interface MessagesResponse {
78
+ id: string;
79
+ model: string;
80
+ role: "assistant";
81
+ content: any[];
82
+ type: "message";
83
+ stop_reason: "end_turn" | "max_tokens" | "stop_sequence" | "tool_use" | null;
84
+ stop_sequence: string | null;
85
+ usage: Usage;
86
+ }
87
+ export interface TokenCountResponse {
88
+ input_tokens: number;
89
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * TypeScript types for Anthropic-compatible requests and responses.
3
+ *
4
+ * These mirror the Anthropic Messages API format that claude-code uses.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/proxy/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,14 @@
1
+ import { WaifuEvent } from "../observer/eventDetector.js";
2
+ /**
3
+ * OverlayRenderer handles the visual reactions of the waifu.
4
+ * In the revised proxy-based approach, it writes reactions that don't
5
+ * interfere with the main TUI as much as possible.
6
+ */
7
+ export declare class OverlayRenderer {
8
+ private isEnabled;
9
+ private lastReaction;
10
+ private messages;
11
+ constructor(enabled?: boolean);
12
+ render(event: WaifuEvent): void;
13
+ clear(): void;
14
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OverlayRenderer handles the visual reactions of the waifu.
3
+ * In the revised proxy-based approach, it writes reactions that don't
4
+ * interfere with the main TUI as much as possible.
5
+ */
6
+ export class OverlayRenderer {
7
+ isEnabled = true;
8
+ lastReaction = "";
9
+ messages = [
10
+ "are you doing okay today?",
11
+ "hey if no one told you today im proud of you",
12
+ "hey you are doing good be proud",
13
+ "you're working so hard! I'm proud of you! (◕‿◕✿)",
14
+ "You've got this! ᕦ(ò_ó)ᕤ",
15
+ "Doing great today! (✿◠‿◠)",
16
+ "Just a moment... you're doing amazing! (´。• ᵕ •。`) ♡"
17
+ ];
18
+ constructor(enabled = true) {
19
+ this.isEnabled = enabled;
20
+ }
21
+ render(event) {
22
+ if (!this.isEnabled)
23
+ return;
24
+ let reaction = "";
25
+ switch (event) {
26
+ case "thinking":
27
+ const msg = this.messages[Math.floor(Math.random() * this.messages.length)];
28
+ reaction = `\x1b[35m(✿◠‿◠) ${msg}\x1b[0m`;
29
+ break;
30
+ case "idle":
31
+ return; // nothing to show
32
+ default:
33
+ return;
34
+ }
35
+ if (reaction && reaction !== this.lastReaction) {
36
+ // For safer rendering alongside Claude's TUI, we write to stderr
37
+ // with a clear line and return to start.
38
+ // Most TUI's handle stdout but stderr is often free.
39
+ process.stderr.write(`\n\x1b[2K\r${reaction}\n`);
40
+ this.lastReaction = reaction;
41
+ }
42
+ }
43
+ clear() {
44
+ if (this.lastReaction) {
45
+ this.lastReaction = "";
46
+ }
47
+ }
48
+ }
49
+ //# sourceMappingURL=overlayRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayRenderer.js","sourceRoot":"","sources":["../../src/waifu/overlayRenderer.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAClB,SAAS,GAAY,IAAI,CAAC;IAC1B,YAAY,GAAW,EAAE,CAAC;IAC1B,QAAQ,GAAa;QAC3B,2BAA2B;QAC3B,8CAA8C;QAC9C,iCAAiC;QACjC,kDAAkD;QAClD,0BAA0B;QAC1B,2BAA2B;QAC3B,sDAAsD;KACvD,CAAC;IAEF,YAAY,UAAmB,IAAI;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,KAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAE5B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,UAAU;gBACb,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5E,QAAQ,GAAG,kBAAkB,GAAG,SAAS,CAAC;gBAC1C,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,kBAAkB;YAC5B;gBACE,OAAO;QACX,CAAC;QAED,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,iEAAiE;YACjE,yCAAyC;YACzC,qDAAqD;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,QAAQ,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC/B,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "waifu-code",
3
+ "version": "1.0.1",
4
+ "description": "Free coding assistant CLI — Claude Code powered by NVIDIA NIM",
5
+ "type": "module",
6
+ "main": "dist/cli.js",
7
+ "bin": {
8
+ "waifu": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "npm run build",
17
+ "dev": "tsc --watch",
18
+ "start": "node dist/cli.js"
19
+ },
20
+ "keywords": [
21
+ "cli",
22
+ "coding-assistant",
23
+ "nvidia",
24
+ "nim",
25
+ "claude",
26
+ "ai"
27
+ ],
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "@anthropic-ai/sdk": "^0.82.0",
31
+ "commander": "^13.1.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^22.0.0",
35
+ "typescript": "^5.7.0"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ }
40
+ }