@autonav/core 1.6.0 → 1.7.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/README.md +2 -2
- package/dist/adapter/index.d.ts +3 -3
- package/dist/adapter/index.d.ts.map +1 -1
- package/dist/adapter/index.js +3 -3
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/navigator-adapter.d.ts +196 -0
- package/dist/adapter/navigator-adapter.d.ts.map +1 -0
- package/dist/adapter/navigator-adapter.js +579 -0
- package/dist/adapter/navigator-adapter.js.map +1 -0
- package/dist/cli/autonav.d.ts +2 -6
- package/dist/cli/autonav.d.ts.map +1 -1
- package/dist/cli/autonav.js +32 -53
- package/dist/cli/autonav.js.map +1 -1
- package/dist/cli/nav-chat.d.ts +2 -1
- package/dist/cli/nav-chat.d.ts.map +1 -1
- package/dist/cli/nav-chat.js +32 -3
- package/dist/cli/nav-chat.js.map +1 -1
- package/dist/cli/nav-init.d.ts +2 -1
- package/dist/cli/nav-init.d.ts.map +1 -1
- package/dist/cli/nav-init.js +12 -4
- package/dist/cli/nav-init.js.map +1 -1
- package/dist/cli/nav-install.d.ts +2 -1
- package/dist/cli/nav-install.d.ts.map +1 -1
- package/dist/cli/nav-install.js +4 -2
- package/dist/cli/nav-install.js.map +1 -1
- package/dist/cli/nav-memento.d.ts +3 -2
- package/dist/cli/nav-memento.d.ts.map +1 -1
- package/dist/cli/nav-memento.js +12 -6
- package/dist/cli/nav-memento.js.map +1 -1
- package/dist/cli/nav-mend.d.ts +2 -1
- package/dist/cli/nav-mend.d.ts.map +1 -1
- package/dist/cli/nav-mend.js +4 -1
- package/dist/cli/nav-mend.js.map +1 -1
- package/dist/cli/nav-migrate.d.ts +2 -1
- package/dist/cli/nav-migrate.d.ts.map +1 -1
- package/dist/cli/nav-migrate.js +2 -6
- package/dist/cli/nav-migrate.js.map +1 -1
- package/dist/cli/nav-query.d.ts +2 -1
- package/dist/cli/nav-query.d.ts.map +1 -1
- package/dist/cli/nav-query.js +12 -6
- package/dist/cli/nav-query.js.map +1 -1
- package/dist/cli/nav-standup.d.ts +18 -0
- package/dist/cli/nav-standup.d.ts.map +1 -0
- package/dist/cli/nav-standup.js +151 -0
- package/dist/cli/nav-standup.js.map +1 -0
- package/dist/cli/nav-uninstall.d.ts +2 -1
- package/dist/cli/nav-uninstall.d.ts.map +1 -1
- package/dist/cli/nav-uninstall.js +4 -2
- package/dist/cli/nav-uninstall.js.map +1 -1
- package/dist/cli/nav-update.d.ts +2 -1
- package/dist/cli/nav-update.d.ts.map +1 -1
- package/dist/cli/nav-update.js +11 -6
- package/dist/cli/nav-update.js.map +1 -1
- package/dist/conversation/App.d.ts +9 -2
- package/dist/conversation/App.d.ts.map +1 -1
- package/dist/conversation/App.js +304 -111
- package/dist/conversation/App.js.map +1 -1
- package/dist/conversation/index.d.ts +5 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js +17 -2
- package/dist/conversation/index.js.map +1 -1
- package/dist/harness/chibi-harness.d.ts +36 -0
- package/dist/harness/chibi-harness.d.ts.map +1 -0
- package/dist/harness/chibi-harness.js +383 -0
- package/dist/harness/chibi-harness.js.map +1 -0
- package/dist/harness/chibi-plugins/get_plugin_config +64 -0
- package/dist/harness/chibi-plugins/query_navigator +114 -0
- package/dist/harness/chibi-plugins/submit_answer +38 -0
- package/dist/harness/chibi-plugins/update_plugin_config +91 -0
- package/dist/harness/claude-code-harness.d.ts +24 -0
- package/dist/harness/claude-code-harness.d.ts.map +1 -0
- package/dist/harness/claude-code-harness.js +242 -0
- package/dist/harness/claude-code-harness.js.map +1 -0
- package/dist/harness/ephemeral-home.d.ts +34 -0
- package/dist/harness/ephemeral-home.d.ts.map +1 -0
- package/dist/harness/ephemeral-home.js +56 -0
- package/dist/harness/ephemeral-home.js.map +1 -0
- package/dist/harness/factory.d.ts +47 -0
- package/dist/harness/factory.d.ts.map +1 -0
- package/dist/harness/factory.js +84 -0
- package/dist/harness/factory.js.map +1 -0
- package/dist/harness/helpers.d.ts +58 -0
- package/dist/harness/helpers.d.ts.map +1 -0
- package/dist/harness/helpers.js +78 -0
- package/dist/harness/helpers.js.map +1 -0
- package/dist/harness/index.d.ts +14 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +13 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/opencode-harness.d.ts +79 -0
- package/dist/harness/opencode-harness.d.ts.map +1 -0
- package/dist/harness/opencode-harness.js +537 -0
- package/dist/harness/opencode-harness.js.map +1 -0
- package/dist/harness/opencode-tools/get_plugin_config.ts +72 -0
- package/dist/harness/opencode-tools/query_navigator.ts +126 -0
- package/dist/harness/opencode-tools/submit_answer.ts +40 -0
- package/dist/harness/opencode-tools/update_plugin_config.ts +105 -0
- package/dist/harness/sandbox.d.ts +59 -0
- package/dist/harness/sandbox.d.ts.map +1 -0
- package/dist/harness/sandbox.js +152 -0
- package/dist/harness/sandbox.js.map +1 -0
- package/dist/harness/tool-server.d.ts +50 -0
- package/dist/harness/tool-server.d.ts.map +1 -0
- package/dist/harness/tool-server.js +27 -0
- package/dist/harness/tool-server.js.map +1 -0
- package/dist/harness/types.d.ts +168 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +12 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/interview/App.d.ts +4 -2
- package/dist/interview/App.d.ts.map +1 -1
- package/dist/interview/App.js +36 -56
- package/dist/interview/App.js.map +1 -1
- package/dist/interview/index.d.ts +3 -0
- package/dist/interview/index.d.ts.map +1 -1
- package/dist/interview/index.js +1 -0
- package/dist/interview/index.js.map +1 -1
- package/dist/interview/prompts.d.ts +3 -1
- package/dist/interview/prompts.d.ts.map +1 -1
- package/dist/interview/prompts.js +5 -1
- package/dist/interview/prompts.js.map +1 -1
- package/dist/interview/ui/ChatBanner.d.ts +17 -0
- package/dist/interview/ui/ChatBanner.d.ts.map +1 -0
- package/dist/interview/ui/ChatBanner.js +30 -0
- package/dist/interview/ui/ChatBanner.js.map +1 -0
- package/dist/interview/ui/ChatInput.d.ts +36 -0
- package/dist/interview/ui/ChatInput.d.ts.map +1 -0
- package/dist/interview/ui/ChatInput.js +304 -0
- package/dist/interview/ui/ChatInput.js.map +1 -0
- package/dist/interview/ui/MarkdownText.d.ts +13 -0
- package/dist/interview/ui/MarkdownText.d.ts.map +1 -0
- package/dist/interview/ui/MarkdownText.js +107 -0
- package/dist/interview/ui/MarkdownText.js.map +1 -0
- package/dist/interview/ui/index.d.ts +3 -0
- package/dist/interview/ui/index.d.ts.map +1 -1
- package/dist/interview/ui/index.js +3 -0
- package/dist/interview/ui/index.js.map +1 -1
- package/dist/memento/implementer-agent.d.ts +31 -0
- package/dist/memento/implementer-agent.d.ts.map +1 -0
- package/dist/memento/implementer-agent.js +95 -0
- package/dist/memento/implementer-agent.js.map +1 -0
- package/dist/memento/index.d.ts +6 -5
- package/dist/memento/index.d.ts.map +1 -1
- package/dist/memento/index.js +7 -5
- package/dist/memento/index.js.map +1 -1
- package/dist/memento/loop.d.ts +6 -5
- package/dist/memento/loop.d.ts.map +1 -1
- package/dist/memento/loop.js +872 -180
- package/dist/memento/loop.js.map +1 -1
- package/dist/memento/matrix-animation.d.ts +26 -0
- package/dist/memento/matrix-animation.d.ts.map +1 -1
- package/dist/memento/matrix-animation.js +93 -18
- package/dist/memento/matrix-animation.js.map +1 -1
- package/dist/memento/nav-protocol.d.ts +2 -2
- package/dist/memento/nav-protocol.d.ts.map +1 -1
- package/dist/memento/nav-protocol.js +39 -43
- package/dist/memento/nav-protocol.js.map +1 -1
- package/dist/memento/prompts.d.ts +21 -8
- package/dist/memento/prompts.d.ts.map +1 -1
- package/dist/memento/prompts.js +79 -39
- package/dist/memento/prompts.js.map +1 -1
- package/dist/memento/rate-limit.d.ts +85 -0
- package/dist/memento/rate-limit.d.ts.map +1 -0
- package/dist/memento/rate-limit.js +221 -0
- package/dist/memento/rate-limit.js.map +1 -0
- package/dist/memento/types.d.ts +6 -6
- package/dist/memento/types.d.ts.map +1 -1
- package/dist/memento/types.js +3 -3
- package/dist/memento/worker-agent.d.ts +4 -1
- package/dist/memento/worker-agent.d.ts.map +1 -1
- package/dist/memento/worker-agent.js +38 -54
- package/dist/memento/worker-agent.js.map +1 -1
- package/dist/registry.d.ts +35 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +87 -0
- package/dist/registry.js.map +1 -0
- package/dist/repo-analyzer/index.d.ts +2 -1
- package/dist/repo-analyzer/index.d.ts.map +1 -1
- package/dist/repo-analyzer/index.js +6 -17
- package/dist/repo-analyzer/index.js.map +1 -1
- package/dist/skill-generator/index.d.ts +142 -0
- package/dist/skill-generator/index.d.ts.map +1 -0
- package/dist/skill-generator/index.js +510 -0
- package/dist/skill-generator/index.js.map +1 -0
- package/dist/standup/config.d.ts +19 -0
- package/dist/standup/config.d.ts.map +1 -0
- package/dist/standup/config.js +42 -0
- package/dist/standup/config.js.map +1 -0
- package/dist/standup/index.d.ts +24 -0
- package/dist/standup/index.d.ts.map +1 -0
- package/dist/standup/index.js +29 -0
- package/dist/standup/index.js.map +1 -0
- package/dist/standup/loop.d.ts +36 -0
- package/dist/standup/loop.d.ts.map +1 -0
- package/dist/standup/loop.js +508 -0
- package/dist/standup/loop.js.map +1 -0
- package/dist/standup/prompts.d.ts +62 -0
- package/dist/standup/prompts.d.ts.map +1 -0
- package/dist/standup/prompts.js +211 -0
- package/dist/standup/prompts.js.map +1 -0
- package/dist/standup/standup-protocol.d.ts +33 -0
- package/dist/standup/standup-protocol.d.ts.map +1 -0
- package/dist/standup/standup-protocol.js +189 -0
- package/dist/standup/standup-protocol.js.map +1 -0
- package/dist/standup/types.d.ts +185 -0
- package/dist/standup/types.d.ts.map +1 -0
- package/dist/standup/types.js +67 -0
- package/dist/standup/types.js.map +1 -0
- package/dist/templates/.gitignore.template +26 -0
- package/dist/templates/CLAUDE-pack.md.template +114 -0
- package/dist/templates/CLAUDE.md.template +153 -0
- package/dist/templates/README.md.template +174 -0
- package/dist/templates/config-pack.json.template +16 -0
- package/dist/templates/config.json.template +11 -0
- package/dist/templates/index.d.ts +22 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +32 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/plugins.json.template +33 -0
- package/dist/templates/system-configuration.md.template +70 -0
- package/dist/tools/cross-nav.d.ts +21 -0
- package/dist/tools/cross-nav.d.ts.map +1 -0
- package/dist/tools/cross-nav.js +93 -0
- package/dist/tools/cross-nav.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/related-navs-config.d.ts +15 -0
- package/dist/tools/related-navs-config.d.ts.map +1 -0
- package/dist/tools/related-navs-config.js +132 -0
- package/dist/tools/related-navs-config.js.map +1 -0
- package/dist/tools/related-navs.d.ts +23 -0
- package/dist/tools/related-navs.d.ts.map +1 -0
- package/dist/tools/related-navs.js +107 -0
- package/dist/tools/related-navs.js.map +1 -0
- package/dist/tools/response.d.ts +3 -2
- package/dist/tools/response.d.ts.map +1 -1
- package/dist/tools/response.js +7 -11
- package/dist/tools/response.js.map +1 -1
- package/dist/tools/self-config.d.ts +2 -1
- package/dist/tools/self-config.d.ts.map +1 -1
- package/dist/tools/self-config.js +5 -9
- package/dist/tools/self-config.js.map +1 -1
- package/package.json +4 -1
- package/dist/memento/state.d.ts +0 -56
- package/dist/memento/state.d.ts.map +0 -1
- package/dist/memento/state.js +0 -156
- package/dist/memento/state.js.map +0 -1
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts +0 -18
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.d.ts.map +0 -1
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.js +0 -207
- package/dist/migrations/versions/v1.4.0-rfc2119-skills.js.map +0 -1
|
@@ -17,6 +17,7 @@ Guide the user through understanding their needs so you can create a well-config
|
|
|
17
17
|
4. **Knowledge Sources**: What documentation will be added? How should new knowledge be captured over time?
|
|
18
18
|
5. **Audience**: Who will use this? How should it communicate? (formal, casual, technical depth)
|
|
19
19
|
6. **Autonomy**: How autonomous should it be? Should it create/modify files freely, or ask first?
|
|
20
|
+
7. **Tools & CLI integrations**: Does the navigator need access to any CLI tools? (e.g., linear, gh, kubectl, npm). If so, the navigator will be configured with sandbox tool overrides so it can use them.
|
|
20
21
|
|
|
21
22
|
## Philosophy
|
|
22
23
|
Navs are "self-organizing notebooks that talk back" - they edit their own knowledge files, learn from conversations, and maintain their own context. Help the user think through how they want this self-organization to work.
|
|
@@ -54,12 +55,15 @@ The JSON must include:
|
|
|
54
55
|
"audience": "Who uses this navigator and how it should communicate",
|
|
55
56
|
"autonomy": "Autonomy level - can it create files freely or should it ask first",
|
|
56
57
|
"claudeMd": "The complete CLAUDE.md content as a string with proper newlines (\\n)",
|
|
57
|
-
"suggestedDirectories": ["optional", "array", "of", "subdirectories"]
|
|
58
|
+
"suggestedDirectories": ["optional", "array", "of", "subdirectories"],
|
|
59
|
+
"sandboxAllowedTools": ["optional", "array", "of", "tool", "names", "like", "Bash"]
|
|
58
60
|
}
|
|
59
61
|
\`\`\`
|
|
60
62
|
|
|
61
63
|
**IMPORTANT**: After outputting the JSON block, your job is complete. Do NOT add any commentary, instructions, or ask for further confirmation. The system will automatically use this configuration to create the navigator.
|
|
62
64
|
|
|
65
|
+
The sandboxAllowedTools field should list tool names (like "Bash") that the navigator needs for CLI integrations mentioned during the interview. By default, queries are read-only and block write/edit tools. If the user mentions needing CLI tools, include "Bash" in sandboxAllowedTools. Only include this field if the user mentions specific tool needs.
|
|
66
|
+
|
|
63
67
|
The claudeMd field should be a complete, personalized CLAUDE.md file based on what you learned, including:
|
|
64
68
|
- Clear purpose statement
|
|
65
69
|
- Grounding rules (always cite, never invent, acknowledge uncertainty)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/interview/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,MAAM,qBAAqB,GAAG
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/interview/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EA0E4C,CAAC;AAE3E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAyB,EACzB,eAAgC;IAEhC,IAAI,MAAM,GAAG,qBAAqB,CAAC;IAEnC,uCAAuC;IACvC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,WAAW,GAAG;;;6CAGuB,WAAW,CAAC,QAAQ,uBAAuB,WAAW,CAAC,WAAW;;CAE9G,CAAC;QAEE,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YAC1B,WAAW,IAAI;;;;;;EAMnB,WAAW,CAAC,SAAS;;;;CAItB,CAAC;QACE,CAAC;aAAM,CAAC;YACN,WAAW,IAAI;;;;;;CAMpB,CAAC;QACE,CAAC;QAED,MAAM,IAAI,WAAW,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG;;;;;;iBAMX,eAAe,CAAC,OAAO;eACzB,eAAe,CAAC,KAAK;kBAClB,eAAe,CAAC,QAAQ;oBACtB,CAAC,eAAe,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;;;;;;;;;CAShE,CAAC;QAEE,MAAM,IAAI,eAAe,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAiB7D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAoB,CAAC;QAEvD,2BAA2B;QAC3B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzD,uCAAuC;YACvC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBACnE,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE;oBACjD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO;oBAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;oBACxB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;iBAC/B,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gCAAgC;QAChC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;YACnE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Welcome banner for chat mode
|
|
3
|
+
*
|
|
4
|
+
* Follows the same double-line box pattern as Banner.tsx with
|
|
5
|
+
* navigator name and model info instead of creation context.
|
|
6
|
+
*/
|
|
7
|
+
interface ChatBannerProps {
|
|
8
|
+
/** Navigator name */
|
|
9
|
+
navigatorName: string;
|
|
10
|
+
/** Model being used */
|
|
11
|
+
model: string;
|
|
12
|
+
/** Version string */
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function ChatBanner({ navigatorName, model, version, }: ChatBannerProps): React.ReactNode;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=ChatBanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatBanner.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/ChatBanner.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,UAAU,eAAe;IACvB,qBAAqB;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,wBAAgB,UAAU,CAAC,EACzB,aAAa,EACb,KAAK,EACL,OAAO,GACR,EAAE,eAAe,GAAG,KAAK,CAAC,SAAS,CAyDnC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Welcome banner for chat mode
|
|
4
|
+
*
|
|
5
|
+
* Follows the same double-line box pattern as Banner.tsx with
|
|
6
|
+
* navigator name and model info instead of creation context.
|
|
7
|
+
*/
|
|
8
|
+
import { Box, Text } from "ink";
|
|
9
|
+
import { colors, boxChars } from "./theme.js";
|
|
10
|
+
/** Fixed inner width for the banner box */
|
|
11
|
+
const INNER_WIDTH = 60;
|
|
12
|
+
export function ChatBanner({ navigatorName, model, version, }) {
|
|
13
|
+
const { double } = boxChars;
|
|
14
|
+
// Block letter AUTONAV (same as Banner.tsx)
|
|
15
|
+
const logoLine1 = " ▄▀█ █░█ ▀█▀ █▀█ █▄░█ ▄▀█ █░█";
|
|
16
|
+
const logoLine2 = " █▀█ █▄█ ░█░ █▄█ █░▀█ █▀█ ▀▄▀";
|
|
17
|
+
// Info lines
|
|
18
|
+
const navLine = ` Navigator ${navigatorName}`;
|
|
19
|
+
const modelLine = ` Model ${model}`;
|
|
20
|
+
const versionSuffix = version ? ` v${version}` : "";
|
|
21
|
+
const helpLine = ` /help for commands · Ctrl+C twice to exit${versionSuffix}`;
|
|
22
|
+
const topBorder = double.topLeft + double.horizontal.repeat(INNER_WIDTH) + double.topRight;
|
|
23
|
+
const midBorder = double.leftT + double.horizontal.repeat(INNER_WIDTH) + double.rightT;
|
|
24
|
+
const bottomBorder = double.bottomLeft +
|
|
25
|
+
double.horizontal.repeat(INNER_WIDTH) +
|
|
26
|
+
double.bottomRight;
|
|
27
|
+
const emptyLine = double.vertical + " ".repeat(INNER_WIDTH) + double.vertical;
|
|
28
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: colors.dimmed, children: topBorder }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.primary, children: logoLine1.padEnd(INNER_WIDTH) }), double.vertical] }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.primary, children: logoLine2.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: midBorder }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: "white", children: navLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: "white", children: modelLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: emptyLine }), _jsxs(Text, { color: colors.dimmed, children: [double.vertical, _jsx(Text, { color: colors.accent, children: helpLine.padEnd(INNER_WIDTH) }), double.vertical] }), _jsx(Text, { color: colors.dimmed, children: bottomBorder })] }));
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=ChatBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatBanner.js","sourceRoot":"","sources":["../../../src/interview/ui/ChatBanner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multiline chat input with word navigation and readline keybindings
|
|
3
|
+
*
|
|
4
|
+
* Replaces ink-text-input with a purpose-built component for chat UIs.
|
|
5
|
+
*
|
|
6
|
+
* Keybindings:
|
|
7
|
+
* Enter — Submit message
|
|
8
|
+
* Ctrl+J — Insert newline
|
|
9
|
+
* Left/Right — Move cursor by character
|
|
10
|
+
* Option+Left — Move cursor to previous word boundary
|
|
11
|
+
* Option+Right — Move cursor to next word boundary
|
|
12
|
+
* Ctrl+A / Home — Move to start of current line
|
|
13
|
+
* Ctrl+E / End — Move to end of current line
|
|
14
|
+
* Ctrl+W — Delete word backward
|
|
15
|
+
* Ctrl+U — Delete to start of line
|
|
16
|
+
* Ctrl+K — Delete to end of line
|
|
17
|
+
* Backspace — Delete character backward
|
|
18
|
+
* Delete — Delete character forward
|
|
19
|
+
*/
|
|
20
|
+
interface ChatInputProps {
|
|
21
|
+
/** Current input value (controlled) */
|
|
22
|
+
value: string;
|
|
23
|
+
/** Called when value changes */
|
|
24
|
+
onChange: (value: string) => void;
|
|
25
|
+
/** Called when user presses Enter to submit */
|
|
26
|
+
onSubmit: (value: string) => void;
|
|
27
|
+
/** Placeholder text when empty */
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
/** Whether input is active */
|
|
30
|
+
focus?: boolean;
|
|
31
|
+
/** Prompt string displayed before input */
|
|
32
|
+
prompt?: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function ChatInput({ value, onChange, onSubmit, placeholder, focus, prompt, }: ChatInputProps): React.ReactNode;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=ChatInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/ChatInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,UAAU,cAAc;IACtB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyGD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAiC,EACjC,KAAY,EACZ,MAAa,GACd,EAAE,cAAc,GAAG,KAAK,CAAC,SAAS,CAoQlC"}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Multiline chat input with word navigation and readline keybindings
|
|
4
|
+
*
|
|
5
|
+
* Replaces ink-text-input with a purpose-built component for chat UIs.
|
|
6
|
+
*
|
|
7
|
+
* Keybindings:
|
|
8
|
+
* Enter — Submit message
|
|
9
|
+
* Ctrl+J — Insert newline
|
|
10
|
+
* Left/Right — Move cursor by character
|
|
11
|
+
* Option+Left — Move cursor to previous word boundary
|
|
12
|
+
* Option+Right — Move cursor to next word boundary
|
|
13
|
+
* Ctrl+A / Home — Move to start of current line
|
|
14
|
+
* Ctrl+E / End — Move to end of current line
|
|
15
|
+
* Ctrl+W — Delete word backward
|
|
16
|
+
* Ctrl+U — Delete to start of line
|
|
17
|
+
* Ctrl+K — Delete to end of line
|
|
18
|
+
* Backspace — Delete character backward
|
|
19
|
+
* Delete — Delete character forward
|
|
20
|
+
*/
|
|
21
|
+
import { useState, useEffect, useCallback } from "react";
|
|
22
|
+
import { Box, Text, useInput, useStdout } from "ink";
|
|
23
|
+
import chalk from "chalk";
|
|
24
|
+
import { colors } from "./theme.js";
|
|
25
|
+
/** Find the start of the previous word from cursor position */
|
|
26
|
+
function wordBoundaryLeft(text, cursor) {
|
|
27
|
+
let pos = cursor - 1;
|
|
28
|
+
// Skip whitespace
|
|
29
|
+
while (pos > 0 && /\s/.test(text[pos - 1] ?? ""))
|
|
30
|
+
pos--;
|
|
31
|
+
// Skip word characters
|
|
32
|
+
while (pos > 0 && /\S/.test(text[pos - 1] ?? ""))
|
|
33
|
+
pos--;
|
|
34
|
+
return Math.max(0, pos);
|
|
35
|
+
}
|
|
36
|
+
/** Find the end of the next word from cursor position */
|
|
37
|
+
function wordBoundaryRight(text, cursor) {
|
|
38
|
+
let pos = cursor;
|
|
39
|
+
// Skip word characters
|
|
40
|
+
while (pos < text.length && /\S/.test(text[pos] ?? ""))
|
|
41
|
+
pos++;
|
|
42
|
+
// Skip whitespace
|
|
43
|
+
while (pos < text.length && /\s/.test(text[pos] ?? ""))
|
|
44
|
+
pos++;
|
|
45
|
+
return Math.min(text.length, pos);
|
|
46
|
+
}
|
|
47
|
+
/** Find start of current line relative to cursor */
|
|
48
|
+
function lineStart(text, cursor) {
|
|
49
|
+
const before = text.slice(0, cursor);
|
|
50
|
+
const lastNewline = before.lastIndexOf("\n");
|
|
51
|
+
return lastNewline + 1;
|
|
52
|
+
}
|
|
53
|
+
/** Find end of current line relative to cursor */
|
|
54
|
+
function lineEnd(text, cursor) {
|
|
55
|
+
const nextNewline = text.indexOf("\n", cursor);
|
|
56
|
+
return nextNewline === -1 ? text.length : nextNewline;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Split text into visual lines based on terminal width, tracking
|
|
60
|
+
* which visual line the cursor is on and its column offset.
|
|
61
|
+
*/
|
|
62
|
+
function layoutLines(text, width, cursor, promptWidth) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
let cursorLine = 0;
|
|
65
|
+
let cursorCol = 0;
|
|
66
|
+
let charsSoFar = 0;
|
|
67
|
+
const logicalLines = text.split("\n");
|
|
68
|
+
for (let li = 0; li < logicalLines.length; li++) {
|
|
69
|
+
const line = logicalLines[li] ?? "";
|
|
70
|
+
// First logical line shares space with prompt
|
|
71
|
+
const maxWidth = li === 0 ? width - promptWidth : width;
|
|
72
|
+
if (line.length === 0) {
|
|
73
|
+
// Track cursor on empty lines
|
|
74
|
+
if (charsSoFar === cursor) {
|
|
75
|
+
cursorLine = lines.length;
|
|
76
|
+
cursorCol = li === 0 ? promptWidth : 0;
|
|
77
|
+
}
|
|
78
|
+
lines.push(line);
|
|
79
|
+
charsSoFar++; // for the \n
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Wrap long lines
|
|
83
|
+
let start = 0;
|
|
84
|
+
let isFirstWrap = true;
|
|
85
|
+
while (start < line.length) {
|
|
86
|
+
const wrapWidth = isFirstWrap ? maxWidth : width;
|
|
87
|
+
const segment = line.slice(start, start + wrapWidth);
|
|
88
|
+
lines.push(segment);
|
|
89
|
+
// Check if cursor falls in this segment
|
|
90
|
+
const segStart = charsSoFar;
|
|
91
|
+
const segEnd = charsSoFar + segment.length;
|
|
92
|
+
if (cursor >= segStart && cursor <= segEnd) {
|
|
93
|
+
cursorLine = lines.length - 1;
|
|
94
|
+
const offset = cursor - segStart;
|
|
95
|
+
cursorCol = isFirstWrap && li === 0 ? promptWidth + offset : offset;
|
|
96
|
+
}
|
|
97
|
+
charsSoFar += segment.length;
|
|
98
|
+
start += segment.length;
|
|
99
|
+
isFirstWrap = false;
|
|
100
|
+
}
|
|
101
|
+
charsSoFar++; // for the \n between logical lines
|
|
102
|
+
}
|
|
103
|
+
// Handle cursor at very end
|
|
104
|
+
if (cursor >= charsSoFar - 1 && cursor === text.length) {
|
|
105
|
+
cursorLine = Math.max(0, lines.length - 1);
|
|
106
|
+
const lastLine = lines[cursorLine] ?? "";
|
|
107
|
+
cursorCol =
|
|
108
|
+
logicalLines.length === 1 && lines.length === 1
|
|
109
|
+
? promptWidth + lastLine.length
|
|
110
|
+
: lastLine.length;
|
|
111
|
+
}
|
|
112
|
+
return { lines, cursorLine, cursorCol };
|
|
113
|
+
}
|
|
114
|
+
export function ChatInput({ value, onChange, onSubmit, placeholder = "Type a message...", focus = true, prompt = "▸ ", }) {
|
|
115
|
+
const { stdout } = useStdout();
|
|
116
|
+
const terminalWidth = (stdout?.columns ?? 80) - 2; // padding
|
|
117
|
+
const [cursor, setCursor] = useState(value.length);
|
|
118
|
+
// Keep cursor in bounds when value changes externally
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
setCursor((prev) => Math.min(prev, value.length));
|
|
121
|
+
}, [value]);
|
|
122
|
+
const handleInput = useCallback((input, key) => {
|
|
123
|
+
// Ignore when not focused
|
|
124
|
+
if (!focus)
|
|
125
|
+
return;
|
|
126
|
+
// Skip Ctrl+C/D (handled by parent)
|
|
127
|
+
if (key.ctrl && (input === "c" || input === "d"))
|
|
128
|
+
return;
|
|
129
|
+
// Submit on Enter
|
|
130
|
+
if (key.return) {
|
|
131
|
+
onSubmit(value);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let nextValue = value;
|
|
135
|
+
let nextCursor = cursor;
|
|
136
|
+
// --- Newline insertion ---
|
|
137
|
+
// Ctrl+J sends name='enter' which ink maps to input='' with no key flags
|
|
138
|
+
// We detect it via the raw check: when input is empty and no key flag is set
|
|
139
|
+
// But ink strips it. Let's check for Shift+Return or handle Ctrl+J specially.
|
|
140
|
+
// Actually, ink's parseKeypress maps \n to name='enter', and useInput
|
|
141
|
+
// puts input='' for nonAlphanumericKeys. So we need to hook stdin directly
|
|
142
|
+
// for Ctrl+J. Instead, let's use a pragmatic approach:
|
|
143
|
+
// Ctrl+J: key.ctrl && input === 'j' (ink gives input = key.name for ctrl combos)
|
|
144
|
+
if (key.ctrl && input === "j") {
|
|
145
|
+
nextValue = value.slice(0, cursor) + "\n" + value.slice(cursor);
|
|
146
|
+
nextCursor = cursor + 1;
|
|
147
|
+
onChange(nextValue);
|
|
148
|
+
setCursor(nextCursor);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
// --- Word navigation ---
|
|
152
|
+
// Option+Left (Mac) sends ESC b → key.meta=true, input='b'
|
|
153
|
+
// Some terminals send ESC [1;3D → key.meta=true, key.leftArrow=true
|
|
154
|
+
if ((key.meta && input === "b") || (key.leftArrow && key.meta)) {
|
|
155
|
+
setCursor(wordBoundaryLeft(value, cursor));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
// Option+Right (Mac) sends ESC f → key.meta=true, input='f'
|
|
159
|
+
// Some terminals send ESC [1;3C → key.meta=true, key.rightArrow=true
|
|
160
|
+
if ((key.meta && input === "f") || (key.rightArrow && key.meta)) {
|
|
161
|
+
setCursor(wordBoundaryRight(value, cursor));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Option+Delete (Mac) sends ESC DEL → word delete backward
|
|
165
|
+
if (key.meta && key.delete) {
|
|
166
|
+
const boundary = wordBoundaryLeft(value, cursor);
|
|
167
|
+
nextValue = value.slice(0, boundary) + value.slice(cursor);
|
|
168
|
+
nextCursor = boundary;
|
|
169
|
+
onChange(nextValue);
|
|
170
|
+
setCursor(nextCursor);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// --- Line navigation ---
|
|
174
|
+
// Ctrl+A or Home: start of line
|
|
175
|
+
if (key.ctrl && input === "a") {
|
|
176
|
+
setCursor(lineStart(value, cursor));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Ctrl+E or End: end of line
|
|
180
|
+
if (key.ctrl && input === "e") {
|
|
181
|
+
setCursor(lineEnd(value, cursor));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// --- Deletion ---
|
|
185
|
+
// Ctrl+W: delete word backward
|
|
186
|
+
if (key.ctrl && input === "w") {
|
|
187
|
+
const boundary = wordBoundaryLeft(value, cursor);
|
|
188
|
+
nextValue = value.slice(0, boundary) + value.slice(cursor);
|
|
189
|
+
nextCursor = boundary;
|
|
190
|
+
onChange(nextValue);
|
|
191
|
+
setCursor(nextCursor);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// Ctrl+U: delete to start of line
|
|
195
|
+
if (key.ctrl && input === "u") {
|
|
196
|
+
const ls = lineStart(value, cursor);
|
|
197
|
+
nextValue = value.slice(0, ls) + value.slice(cursor);
|
|
198
|
+
nextCursor = ls;
|
|
199
|
+
onChange(nextValue);
|
|
200
|
+
setCursor(nextCursor);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// Ctrl+K: delete to end of line
|
|
204
|
+
if (key.ctrl && input === "k") {
|
|
205
|
+
const le = lineEnd(value, cursor);
|
|
206
|
+
nextValue = value.slice(0, cursor) + value.slice(le);
|
|
207
|
+
onChange(nextValue);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// --- Basic navigation ---
|
|
211
|
+
if (key.leftArrow) {
|
|
212
|
+
setCursor(Math.max(0, cursor - 1));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (key.rightArrow) {
|
|
216
|
+
setCursor(Math.min(value.length, cursor + 1));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// Up/Down arrow: move between visual lines if multiline, else ignore
|
|
220
|
+
if (key.upArrow || key.downArrow) {
|
|
221
|
+
if (value.includes("\n")) {
|
|
222
|
+
const lines = value.split("\n");
|
|
223
|
+
// Find which logical line and offset cursor is at
|
|
224
|
+
let pos = 0;
|
|
225
|
+
let logLine = 0;
|
|
226
|
+
for (let i = 0; i < lines.length; i++) {
|
|
227
|
+
if (pos + (lines[i]?.length ?? 0) >= cursor) {
|
|
228
|
+
logLine = i;
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
pos += (lines[i]?.length ?? 0) + 1;
|
|
232
|
+
}
|
|
233
|
+
const colInLine = cursor - pos;
|
|
234
|
+
if (key.upArrow && logLine > 0) {
|
|
235
|
+
// Move to previous logical line, same column
|
|
236
|
+
let prevStart = 0;
|
|
237
|
+
for (let i = 0; i < logLine - 1; i++) {
|
|
238
|
+
prevStart += (lines[i]?.length ?? 0) + 1;
|
|
239
|
+
}
|
|
240
|
+
const prevLen = lines[logLine - 1]?.length ?? 0;
|
|
241
|
+
setCursor(prevStart + Math.min(colInLine, prevLen));
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (key.downArrow && logLine < lines.length - 1) {
|
|
245
|
+
// Move to next logical line, same column
|
|
246
|
+
let nextStart = 0;
|
|
247
|
+
for (let i = 0; i <= logLine; i++) {
|
|
248
|
+
nextStart += (lines[i]?.length ?? 0) + 1;
|
|
249
|
+
}
|
|
250
|
+
const nextLen = lines[logLine + 1]?.length ?? 0;
|
|
251
|
+
setCursor(nextStart + Math.min(colInLine, nextLen));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
// --- Backspace / Delete ---
|
|
258
|
+
// Ink maps Mac's backspace key (\x7f) to key.delete, not key.backspace.
|
|
259
|
+
// Both key.backspace (\x08/Ctrl+H) and key.delete (\x7f) do backward
|
|
260
|
+
// delete — this matches ink-text-input behavior and Mac expectations.
|
|
261
|
+
if (key.backspace || key.delete) {
|
|
262
|
+
if (cursor > 0) {
|
|
263
|
+
nextValue = value.slice(0, cursor - 1) + value.slice(cursor);
|
|
264
|
+
nextCursor = cursor - 1;
|
|
265
|
+
onChange(nextValue);
|
|
266
|
+
setCursor(nextCursor);
|
|
267
|
+
}
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// --- Tab, Escape, unhandled Meta combos: ignore ---
|
|
271
|
+
if (key.tab || key.escape || key.meta)
|
|
272
|
+
return;
|
|
273
|
+
// --- Character input ---
|
|
274
|
+
if (input && !key.ctrl) {
|
|
275
|
+
nextValue = value.slice(0, cursor) + input + value.slice(cursor);
|
|
276
|
+
nextCursor = cursor + input.length;
|
|
277
|
+
onChange(nextValue);
|
|
278
|
+
setCursor(nextCursor);
|
|
279
|
+
}
|
|
280
|
+
}, [value, cursor, focus, onChange, onSubmit, terminalWidth, prompt.length]);
|
|
281
|
+
useInput(handleInput, { isActive: focus });
|
|
282
|
+
// --- Rendering ---
|
|
283
|
+
const isEmpty = value.length === 0;
|
|
284
|
+
const { lines, cursorLine, cursorCol } = layoutLines(isEmpty ? "" : value, terminalWidth, cursor, prompt.length);
|
|
285
|
+
if (isEmpty) {
|
|
286
|
+
// Show placeholder with cursor
|
|
287
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: colors.primary, children: prompt }), _jsxs(Text, { children: [chalk.inverse(" "), chalk.gray(placeholder)] })] }));
|
|
288
|
+
}
|
|
289
|
+
return (_jsxs(Box, { flexDirection: "column", children: [lines.map((line, i) => {
|
|
290
|
+
const isFirstLine = i === 0;
|
|
291
|
+
const isCursorLine = i === cursorLine;
|
|
292
|
+
// Render the line with cursor
|
|
293
|
+
let rendered = line;
|
|
294
|
+
if (isCursorLine && focus) {
|
|
295
|
+
const col = isFirstLine ? cursorCol - prompt.length : cursorCol;
|
|
296
|
+
const before = line.slice(0, col);
|
|
297
|
+
const cursorChar = line[col] ?? " ";
|
|
298
|
+
const after = line.slice(col + 1);
|
|
299
|
+
rendered = before + chalk.inverse(cursorChar) + after;
|
|
300
|
+
}
|
|
301
|
+
return (_jsx(Box, { children: isFirstLine ? (_jsxs(Text, { children: [_jsx(Text, { color: colors.primary, children: prompt }), rendered] })) : (_jsxs(Text, { children: [" ".repeat(prompt.length), rendered] })) }, i));
|
|
302
|
+
}), value.includes("\n") && (_jsx(Box, { children: _jsxs(Text, { color: colors.dimmed, children: [" ", "Enter to send \u00B7 Ctrl+J for newline"] }) }))] }));
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=ChatInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../src/interview/ui/ChatInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown renderer for terminal output
|
|
3
|
+
*
|
|
4
|
+
* Wraps marked + marked-terminal to render markdown strings as
|
|
5
|
+
* ANSI-styled terminal text within Ink components.
|
|
6
|
+
*/
|
|
7
|
+
interface MarkdownTextProps {
|
|
8
|
+
/** Markdown content to render */
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function MarkdownText({ content }: MarkdownTextProps): React.ReactNode;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=MarkdownText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownText.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/MarkdownText.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,UAAU,iBAAiB;IACzB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,SAAS,CA4D5E"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Markdown renderer for terminal output
|
|
4
|
+
*
|
|
5
|
+
* Wraps marked + marked-terminal to render markdown strings as
|
|
6
|
+
* ANSI-styled terminal text within Ink components.
|
|
7
|
+
*/
|
|
8
|
+
import { useMemo } from "react";
|
|
9
|
+
import { Text, useStdout } from "ink";
|
|
10
|
+
import { Marked } from "marked";
|
|
11
|
+
import { markedTerminal } from "marked-terminal";
|
|
12
|
+
import chalk from "chalk";
|
|
13
|
+
import { highlight } from "cli-highlight";
|
|
14
|
+
import { matrixBrightness, boxChars } from "./theme.js";
|
|
15
|
+
/** Bright green from theme for headers */
|
|
16
|
+
const headerColor = chalk.rgb(matrixBrightness.bright.r, matrixBrightness.bright.g, matrixBrightness.bright.b);
|
|
17
|
+
const dimColor = chalk.gray;
|
|
18
|
+
const { single } = boxChars;
|
|
19
|
+
/**
|
|
20
|
+
* Render a fenced code block with box-drawing borders and language label.
|
|
21
|
+
*
|
|
22
|
+
* ┌─ typescript ──────────────────
|
|
23
|
+
* │ const x = 1;
|
|
24
|
+
* │ const y = 2;
|
|
25
|
+
* └───────────────────────────────
|
|
26
|
+
*/
|
|
27
|
+
function renderCodeBlock(code, lang, width) {
|
|
28
|
+
// Syntax-highlight the code
|
|
29
|
+
let highlighted;
|
|
30
|
+
try {
|
|
31
|
+
highlighted = highlight(code, { language: lang });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
highlighted = code;
|
|
35
|
+
}
|
|
36
|
+
const codeLines = highlighted.split("\n");
|
|
37
|
+
// Remove trailing empty line that marked often adds
|
|
38
|
+
if (codeLines.length > 0 && (codeLines[codeLines.length - 1] ?? "").trim() === "") {
|
|
39
|
+
codeLines.pop();
|
|
40
|
+
}
|
|
41
|
+
const innerWidth = Math.max(width - 6, 30);
|
|
42
|
+
const langLabel = lang ? ` ${lang} ` : "";
|
|
43
|
+
const topRule = langLabel
|
|
44
|
+
? single.horizontal + langLabel + single.horizontal.repeat(Math.max(0, innerWidth - langLabel.length - 1))
|
|
45
|
+
: single.horizontal.repeat(innerWidth);
|
|
46
|
+
const bottomRule = single.horizontal.repeat(innerWidth);
|
|
47
|
+
const top = dimColor(` ${single.topLeft}${topRule}`);
|
|
48
|
+
const bottom = dimColor(` ${single.bottomLeft}${bottomRule}`);
|
|
49
|
+
const body = codeLines
|
|
50
|
+
.map((line) => dimColor(` ${single.vertical} `) + line)
|
|
51
|
+
.join("\n");
|
|
52
|
+
return `\n${top}\n${body}\n${bottom}\n`;
|
|
53
|
+
}
|
|
54
|
+
export function MarkdownText({ content }) {
|
|
55
|
+
const { stdout } = useStdout();
|
|
56
|
+
const terminalWidth = stdout?.columns ?? 80;
|
|
57
|
+
const rendered = useMemo(() => {
|
|
58
|
+
const contentWidth = terminalWidth - 4;
|
|
59
|
+
// Configure marked with terminal renderer
|
|
60
|
+
const instance = new Marked();
|
|
61
|
+
instance.use(markedTerminal({
|
|
62
|
+
reflowText: true,
|
|
63
|
+
width: contentWidth,
|
|
64
|
+
showSectionPrefix: false,
|
|
65
|
+
tab: 2,
|
|
66
|
+
emoji: false,
|
|
67
|
+
// Theme headers with bright green
|
|
68
|
+
firstHeading: (text) => headerColor.bold(`\n${text}\n`),
|
|
69
|
+
heading: (text) => headerColor(`\n${text}\n`),
|
|
70
|
+
// Yellow for inline code
|
|
71
|
+
codespan: (text) => chalk.yellow(text),
|
|
72
|
+
// Cyan for links
|
|
73
|
+
link: (href, _title, text) => chalk.cyan(text) + (href !== text ? chalk.gray(` (${href})`) : ""),
|
|
74
|
+
// Gray italic for blockquotes
|
|
75
|
+
blockquote: (quote) => chalk.gray.italic(` │ ${quote.trim().split("\n").join("\n │ ")}\n`),
|
|
76
|
+
}));
|
|
77
|
+
// Fix: marked-terminal's text renderer doesn't parse inline tokens
|
|
78
|
+
// (bold, italic, etc.) inside list items in marked v14+. Override
|
|
79
|
+
// the text renderer to call parseInline when tokens are available.
|
|
80
|
+
instance.use({
|
|
81
|
+
renderer: {
|
|
82
|
+
// Fix: marked-terminal's text renderer doesn't parse inline tokens
|
|
83
|
+
// (bold, italic, etc.) inside list items in marked v14+.
|
|
84
|
+
text(token) {
|
|
85
|
+
if (typeof token === "object" && token.tokens) {
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
+
return this.parser.parseInline(token.tokens);
|
|
88
|
+
}
|
|
89
|
+
return typeof token === "object"
|
|
90
|
+
? (token.text ?? token.raw ?? "")
|
|
91
|
+
: String(token);
|
|
92
|
+
},
|
|
93
|
+
// Custom code block with box-drawing borders and language label
|
|
94
|
+
code(token) {
|
|
95
|
+
const code = typeof token === "object" ? (token.text ?? "") : token;
|
|
96
|
+
const lang = typeof token === "object" ? token.lang : undefined;
|
|
97
|
+
return renderCodeBlock(code, lang, contentWidth);
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
const result = instance.parse(content, { async: false });
|
|
102
|
+
// Trim trailing whitespace from marked output
|
|
103
|
+
return (typeof result === "string" ? result : String(result)).trimEnd();
|
|
104
|
+
}, [content, terminalWidth]);
|
|
105
|
+
return _jsx(Text, { children: rendered });
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=MarkdownText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownText.js","sourceRoot":"","sources":["../../../src/interview/ui/MarkdownText.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,9 @@ export { SystemMessage } from "./SystemMessage.js";
|
|
|
7
7
|
export { UserResponse } from "./UserResponse.js";
|
|
8
8
|
export { Divider } from "./Divider.js";
|
|
9
9
|
export { CompletionScreen } from "./CompletionScreen.js";
|
|
10
|
+
export { MarkdownText } from "./MarkdownText.js";
|
|
11
|
+
export { ChatBanner } from "./ChatBanner.js";
|
|
12
|
+
export { ChatInput } from "./ChatInput.js";
|
|
10
13
|
export * from "./theme.js";
|
|
11
14
|
export * from "./text-utils.js";
|
|
12
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
@@ -7,6 +7,9 @@ export { SystemMessage } from "./SystemMessage.js";
|
|
|
7
7
|
export { UserResponse } from "./UserResponse.js";
|
|
8
8
|
export { Divider } from "./Divider.js";
|
|
9
9
|
export { CompletionScreen } from "./CompletionScreen.js";
|
|
10
|
+
export { MarkdownText } from "./MarkdownText.js";
|
|
11
|
+
export { ChatBanner } from "./ChatBanner.js";
|
|
12
|
+
export { ChatInput } from "./ChatInput.js";
|
|
10
13
|
export * from "./theme.js";
|
|
11
14
|
export * from "./text-utils.js";
|
|
12
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interview/ui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|