genaicode 2.9.1 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +142 -16
  3. package/dist/agents/cli-agent.d.ts +6 -3
  4. package/dist/agents/cli-agent.js +57 -35
  5. package/dist/agents/cli-agent.js.map +1 -1
  6. package/dist/agents/drivers/antigravity.d.ts +7 -1
  7. package/dist/agents/drivers/antigravity.js +27 -2
  8. package/dist/agents/drivers/antigravity.js.map +1 -1
  9. package/dist/agents/drivers/claude-approvals.d.ts +86 -0
  10. package/dist/agents/drivers/claude-approvals.js +277 -0
  11. package/dist/agents/drivers/claude-approvals.js.map +1 -0
  12. package/dist/agents/drivers/claude.d.ts +12 -2
  13. package/dist/agents/drivers/claude.js +73 -11
  14. package/dist/agents/drivers/claude.js.map +1 -1
  15. package/dist/agents/drivers/codex-approvals.d.ts +10 -0
  16. package/dist/agents/drivers/codex-approvals.js +102 -0
  17. package/dist/agents/drivers/codex-approvals.js.map +1 -0
  18. package/dist/agents/drivers/codex-live.d.ts +12 -1
  19. package/dist/agents/drivers/codex-live.js +46 -32
  20. package/dist/agents/drivers/codex-live.js.map +1 -1
  21. package/dist/agents/drivers/codex.d.ts +10 -1
  22. package/dist/agents/drivers/codex.js +48 -2
  23. package/dist/agents/drivers/codex.js.map +1 -1
  24. package/dist/agents/drivers/copilot.d.ts +9 -1
  25. package/dist/agents/drivers/copilot.js +31 -1
  26. package/dist/agents/drivers/copilot.js.map +1 -1
  27. package/dist/agents/drivers/cursor.d.ts +10 -1
  28. package/dist/agents/drivers/cursor.js +48 -5
  29. package/dist/agents/drivers/cursor.js.map +1 -1
  30. package/dist/agents/drivers/gemini.d.ts +11 -1
  31. package/dist/agents/drivers/gemini.js +46 -2
  32. package/dist/agents/drivers/gemini.js.map +1 -1
  33. package/dist/agents/drivers/muse-approvals.d.ts +19 -0
  34. package/dist/agents/drivers/muse-approvals.js +156 -0
  35. package/dist/agents/drivers/muse-approvals.js.map +1 -0
  36. package/dist/agents/drivers/muse-live.d.ts +5 -1
  37. package/dist/agents/drivers/muse-live.js +21 -109
  38. package/dist/agents/drivers/muse-live.js.map +1 -1
  39. package/dist/agents/drivers/opencode.d.ts +7 -1
  40. package/dist/agents/drivers/opencode.js +28 -2
  41. package/dist/agents/drivers/opencode.js.map +1 -1
  42. package/dist/agents/drivers/permission-args.d.ts +14 -0
  43. package/dist/agents/drivers/permission-args.js +40 -0
  44. package/dist/agents/drivers/permission-args.js.map +1 -0
  45. package/dist/agents/drivers/vibe.d.ts +9 -1
  46. package/dist/agents/drivers/vibe.js +40 -2
  47. package/dist/agents/drivers/vibe.js.map +1 -1
  48. package/dist/agents/hosted.js +6 -0
  49. package/dist/agents/hosted.js.map +1 -1
  50. package/dist/agents/live-agent.d.ts +49 -4
  51. package/dist/agents/live-agent.js +84 -15
  52. package/dist/agents/live-agent.js.map +1 -1
  53. package/dist/agents/permissions.d.ts +27 -0
  54. package/dist/agents/permissions.js +79 -0
  55. package/dist/agents/permissions.js.map +1 -0
  56. package/dist/agents/prepare.d.ts +12 -1
  57. package/dist/agents/prepare.js +18 -3
  58. package/dist/agents/prepare.js.map +1 -1
  59. package/dist/agents/rpc.d.ts +13 -2
  60. package/dist/agents/rpc.js +20 -2
  61. package/dist/agents/rpc.js.map +1 -1
  62. package/dist/agents/runtime.d.ts +2 -0
  63. package/dist/agents/runtime.js +10 -0
  64. package/dist/agents/runtime.js.map +1 -1
  65. package/dist/agents/session.d.ts +9 -1
  66. package/dist/agents/session.js +71 -16
  67. package/dist/agents/session.js.map +1 -1
  68. package/dist/agents/types.d.ts +56 -7
  69. package/dist/agents.d.ts +21 -13
  70. package/dist/agents.js +14 -9
  71. package/dist/agents.js.map +1 -1
  72. package/dist/react/agent-chat.css +506 -0
  73. package/dist/react/agent-chat.d.ts +65 -0
  74. package/dist/react/agent-chat.js +148 -0
  75. package/dist/react/agent-chat.js.map +1 -0
  76. package/dist/react/format.d.ts +16 -0
  77. package/dist/react/format.js +95 -0
  78. package/dist/react/format.js.map +1 -0
  79. package/dist/react/markdown.d.ts +6 -0
  80. package/dist/react/markdown.js +163 -0
  81. package/dist/react/markdown.js.map +1 -0
  82. package/dist/react.d.ts +19 -0
  83. package/dist/react.js +17 -0
  84. package/dist/react.js.map +1 -0
  85. package/dist/ui/index.js +78 -136
  86. package/dist/ui/web-client.js +520 -13
  87. package/dist/ui.d.ts +71 -0
  88. package/dist/ui.js +25 -0
  89. package/dist/ui.js.map +1 -0
  90. package/dist/vite/overlay.js +132 -8
  91. package/dist/vite/overlay.js.map +1 -1
  92. package/docs/agents.md +130 -19
  93. package/docs/semver.md +2 -0
  94. package/package.json +22 -7
package/dist/agents.js CHANGED
@@ -1,22 +1,27 @@
1
1
  export { cliAgent } from './agents/cli-agent.js';
2
2
  export { detectAgents, findExecutable } from './agents/discovery.js';
3
3
  export { claude, claudeArgs, createClaudeParser } from './agents/drivers/claude.js';
4
- export { codex, codexArgs, createCodexParser } from './agents/drivers/codex.js';
4
+ export { mergePermissionFlags, resolvePermissions, unsupportedPermissions, YOLO } from './agents/permissions.js';
5
+ export { applyPermissionArgs, PERMISSION_AGENTS } from './agents/drivers/permission-args.js';
6
+ export { CODEX_SANDBOX, codex, codexArgs, codexPermissionFlags, createCodexParser } from './agents/drivers/codex.js';
5
7
  export { createMuseParser, muse, museArgs } from './agents/drivers/muse.js';
6
- export { liveAgent, uuidv7 } from './agents/live-agent.js';
8
+ export { decideApproval, liveAgent, uuidv7 } from './agents/live-agent.js';
7
9
  export { RpcError, RpcPeer } from './agents/rpc.js';
8
- export { codexLive, codexNotification } from './agents/drivers/codex-live.js';
10
+ export { codexApprovals } from './agents/drivers/codex-approvals.js';
11
+ export { museApprovals } from './agents/drivers/muse-approvals.js';
12
+ export { CLAUDE_APPROVAL_TOOL, claudeApprovalArgs, claudeApprovalEnv, claudeApprovalRequest, claudeApprovalTool, claudePermissionFlags, claudeSandboxRefuses, startClaudeApprovalServer, } from './agents/drivers/claude-approvals.js';
13
+ export { codexLive, codexNotification, codexThreadPolicy } from './agents/drivers/codex-live.js';
9
14
  export { museLive, museNotification } from './agents/drivers/muse-live.js';
10
15
  export { PROVIDER_CREDENTIAL_VARS, scrubEnv, withoutProviderCredentials } from './agents/env.js';
11
16
  export { runWithVerify } from './agents/verify.js';
12
17
  export { claudeMcpConfig } from './agents/drivers/claude.js';
13
18
  export { codexMcpOverrides } from './agents/drivers/codex.js';
14
- export { createGeminiParser, gemini, geminiArgs } from './agents/drivers/gemini.js';
15
- export { createCursorParser, cursor, cursorArgs } from './agents/drivers/cursor.js';
16
- export { createOpencodeParser, opencode, opencodeArgs } from './agents/drivers/opencode.js';
19
+ export { createGeminiParser, gemini, geminiArgs, geminiPermissionFlags } from './agents/drivers/gemini.js';
20
+ export { createCursorParser, cursor, cursorArgs, cursorPermissionFlags } from './agents/drivers/cursor.js';
21
+ export { createOpencodeParser, opencode, opencodeArgs, opencodePermissionFlags } from './agents/drivers/opencode.js';
17
22
  export { hostedAgent } from './agents/hosted.js';
18
- export { copilot, copilotArgs, copilotMcpConfig, createCopilotParser } from './agents/drivers/copilot.js';
19
- export { createVibeParser, vibe, vibeArgs } from './agents/drivers/vibe.js';
20
- export { antigravity, antigravityArgs, createAntigravityParser } from './agents/drivers/antigravity.js';
23
+ export { copilot, copilotArgs, copilotMcpConfig, copilotPermissionFlags, createCopilotParser, } from './agents/drivers/copilot.js';
24
+ export { createVibeParser, vibe, vibeArgs, vibePermissionFlags } from './agents/drivers/vibe.js';
25
+ export { antigravity, antigravityArgs, antigravityPermissionFlags, createAntigravityParser, } from './agents/drivers/antigravity.js';
21
26
  export { createAgentSession } from './agents/session.js';
22
27
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAEhF,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAc5E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE1G,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAExG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEjH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAE7F,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAErH,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAmB5E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,sCAAsC,CAAC;AAO9C,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEjG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAEjG,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE3G,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAErH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQjD,OAAO,EACL,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEjG,OAAO,EACL,WAAW,EACX,eAAe,EACf,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,506 @@
1
+ /*
2
+ * genaicode/react: styles for <AgentChat>. Everything is scoped under .gc-chat.
3
+ *
4
+ * Theme it with these custom properties, set on .gc-chat or any ancestor (unset ones keep
5
+ * the defaults, which follow prefers-color-scheme unless the theme prop forces one). The soft
6
+ * and faint shades and the code background are mixed from the others unless set:
7
+ * --gc-bg --gc-panel --gc-border --gc-text --gc-muted --gc-faint
8
+ * --gc-accent --gc-accent-soft --gc-accent-text
9
+ * --gc-ok --gc-warn --gc-warn-soft --gc-error --gc-error-soft --gc-code-bg
10
+ * --gc-font --gc-mono --gc-font-size --gc-radius --gc-shadow --gc-max-width
11
+ */
12
+ .gc-chat {
13
+ --_bg: var(--gc-bg, #f7f7f5);
14
+ --_panel: var(--gc-panel, #ffffff);
15
+ --_border: var(--gc-border, #e4e4df);
16
+ --_text: var(--gc-text, #1d1d1b);
17
+ --_muted: var(--gc-muted, #6b6b66);
18
+ --_faint: var(--gc-faint, color-mix(in srgb, var(--_muted) 70%, var(--_bg)));
19
+ --_accent: var(--gc-accent, #3b5bdb);
20
+ --_accent-soft: var(--gc-accent-soft, color-mix(in srgb, var(--_accent) 13%, var(--_panel)));
21
+ --_accent-text: var(--gc-accent-text, #ffffff);
22
+ --_ok: var(--gc-ok, #2b8a3e);
23
+ --_warn: var(--gc-warn, #b35c00);
24
+ --_warn-soft: var(--gc-warn-soft, color-mix(in srgb, var(--_warn) 9%, var(--_panel)));
25
+ --_error: var(--gc-error, #c92a2a);
26
+ --_error-soft: var(--gc-error-soft, color-mix(in srgb, var(--_error) 8%, var(--_panel)));
27
+ --_code-bg: var(--gc-code-bg, color-mix(in srgb, var(--_text) 6%, var(--_bg)));
28
+ --_shadow: var(--gc-shadow, 0 1px 2px rgba(0, 0, 0, 0.05), 0 4px 16px rgba(0, 0, 0, 0.04));
29
+ --_font: var(--gc-font, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif);
30
+ --_mono: var(--gc-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
31
+ --_radius: var(--gc-radius, 10px);
32
+ --_max-width: var(--gc-max-width, 860px);
33
+ color-scheme: light;
34
+ }
35
+ .gc-chat[data-theme='dark'] {
36
+ --_bg: var(--gc-bg, #141414);
37
+ --_panel: var(--gc-panel, #1d1d1c);
38
+ --_border: var(--gc-border, #2e2e2c);
39
+ --_text: var(--gc-text, #ececea);
40
+ --_muted: var(--gc-muted, #a3a39e);
41
+ --_accent: var(--gc-accent, #7c9bff);
42
+ --_accent-text: var(--gc-accent-text, #0e1322);
43
+ --_ok: var(--gc-ok, #69db7c);
44
+ --_warn: var(--gc-warn, #ffb35c);
45
+ --_error: var(--gc-error, #ff8787);
46
+ --_shadow: var(--gc-shadow, 0 1px 2px rgba(0, 0, 0, 0.3));
47
+ color-scheme: dark;
48
+ }
49
+ @media (prefers-color-scheme: dark) {
50
+ .gc-chat:not([data-theme]) {
51
+ --_bg: var(--gc-bg, #141414);
52
+ --_panel: var(--gc-panel, #1d1d1c);
53
+ --_border: var(--gc-border, #2e2e2c);
54
+ --_text: var(--gc-text, #ececea);
55
+ --_muted: var(--gc-muted, #a3a39e);
56
+ --_accent: var(--gc-accent, #7c9bff);
57
+ --_accent-text: var(--gc-accent-text, #0e1322);
58
+ --_ok: var(--gc-ok, #69db7c);
59
+ --_warn: var(--gc-warn, #ffb35c);
60
+ --_error: var(--gc-error, #ff8787);
61
+ --_shadow: var(--gc-shadow, 0 1px 2px rgba(0, 0, 0, 0.3));
62
+ color-scheme: dark;
63
+ }
64
+ }
65
+
66
+ .gc-chat {
67
+ height: 100%;
68
+ min-height: 0;
69
+ display: flex;
70
+ flex-direction: column;
71
+ background: var(--_bg);
72
+ color: var(--_text);
73
+ font-family: var(--_font);
74
+ font-size: var(--gc-font-size, 15px);
75
+ line-height: 1.55;
76
+ }
77
+ .gc-chat *,
78
+ .gc-chat *::before,
79
+ .gc-chat *::after {
80
+ box-sizing: border-box;
81
+ }
82
+ .gc-chat button,
83
+ .gc-chat textarea {
84
+ font: inherit;
85
+ color: inherit;
86
+ }
87
+
88
+ /* Header */
89
+ .gc-header {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 8px;
93
+ padding: 8px 14px;
94
+ border-bottom: 1px solid var(--_border);
95
+ background: var(--_panel);
96
+ flex-wrap: wrap;
97
+ }
98
+ .gc-agent {
99
+ font-weight: 600;
100
+ }
101
+ .gc-model {
102
+ font-family: var(--_mono);
103
+ font-size: 0.8em;
104
+ color: var(--_muted);
105
+ }
106
+ .gc-spacer {
107
+ flex: 1;
108
+ }
109
+ .gc-chip {
110
+ font-size: 0.8em;
111
+ color: var(--_muted);
112
+ background: var(--_bg);
113
+ border: 1px solid var(--_border);
114
+ border-radius: 999px;
115
+ padding: 2px 10px;
116
+ white-space: nowrap;
117
+ }
118
+
119
+ /* Transcript */
120
+ .gc-scroll {
121
+ flex: 1;
122
+ min-height: 0;
123
+ overflow-y: auto;
124
+ }
125
+ .gc-thread {
126
+ max-width: var(--_max-width);
127
+ margin: 0 auto;
128
+ padding: 24px 16px 12px;
129
+ display: flex;
130
+ flex-direction: column;
131
+ gap: 20px;
132
+ }
133
+ .gc-empty {
134
+ text-align: center;
135
+ margin-top: 8vh;
136
+ color: var(--_muted);
137
+ }
138
+ .gc-empty-title {
139
+ color: var(--_text);
140
+ font-size: 1.4em;
141
+ font-weight: 600;
142
+ letter-spacing: -0.02em;
143
+ }
144
+ .gc-turn {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 10px;
148
+ }
149
+ .gc-prompt {
150
+ align-self: flex-end;
151
+ max-width: 85%;
152
+ background: var(--_accent);
153
+ color: var(--_accent-text);
154
+ padding: 10px 14px;
155
+ border-radius: 16px 16px 4px 16px;
156
+ white-space: pre-wrap;
157
+ overflow-wrap: anywhere;
158
+ }
159
+ .gc-prompt.gc-steer {
160
+ background: var(--_accent-soft);
161
+ color: var(--_text);
162
+ font-size: 0.93em;
163
+ }
164
+ .gc-prompt.gc-steer small {
165
+ display: block;
166
+ color: var(--_muted);
167
+ font-size: 0.75em;
168
+ }
169
+ .gc-agent-row {
170
+ display: flex;
171
+ gap: 10px;
172
+ align-items: flex-start;
173
+ }
174
+ .gc-avatar {
175
+ flex: none;
176
+ width: 28px;
177
+ height: 28px;
178
+ border-radius: 8px;
179
+ background: var(--_panel);
180
+ border: 1px solid var(--_border);
181
+ display: grid;
182
+ place-items: center;
183
+ font-size: 12px;
184
+ font-weight: 700;
185
+ color: var(--_accent);
186
+ text-transform: uppercase;
187
+ }
188
+ .gc-header .gc-avatar {
189
+ width: 24px;
190
+ height: 24px;
191
+ font-size: 11px;
192
+ }
193
+ .gc-steps {
194
+ flex: 1;
195
+ min-width: 0;
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: 8px;
199
+ }
200
+
201
+ /* Markdown */
202
+ .gc-md {
203
+ overflow-wrap: anywhere;
204
+ }
205
+ .gc-md p,
206
+ .gc-md ul,
207
+ .gc-md ol,
208
+ .gc-md pre,
209
+ .gc-md blockquote {
210
+ margin: 0 0 8px;
211
+ }
212
+ .gc-md > :last-child {
213
+ margin-bottom: 0;
214
+ }
215
+ .gc-md h2,
216
+ .gc-md h3,
217
+ .gc-md h4,
218
+ .gc-md h5,
219
+ .gc-md h6 {
220
+ font-size: 1em;
221
+ margin: 12px 0 6px;
222
+ }
223
+ .gc-md ul,
224
+ .gc-md ol {
225
+ padding-left: 22px;
226
+ }
227
+ .gc-md code {
228
+ font-family: var(--_mono);
229
+ font-size: 0.87em;
230
+ background: var(--_code-bg);
231
+ padding: 1px 5px;
232
+ border-radius: 5px;
233
+ }
234
+ .gc-md pre {
235
+ background: var(--_code-bg);
236
+ padding: 12px 14px;
237
+ border-radius: var(--_radius);
238
+ overflow-x: auto;
239
+ }
240
+ .gc-md pre code {
241
+ background: none;
242
+ padding: 0;
243
+ }
244
+ .gc-md a {
245
+ color: var(--_accent);
246
+ }
247
+ .gc-md blockquote {
248
+ border-left: 3px solid var(--_border);
249
+ padding-left: 12px;
250
+ color: var(--_muted);
251
+ }
252
+ .gc-md hr {
253
+ border: 0;
254
+ border-top: 1px solid var(--_border);
255
+ margin: 12px 0;
256
+ }
257
+ .gc-caret > :last-child::after,
258
+ .gc-caret:empty::after {
259
+ content: '\258D';
260
+ color: var(--_accent);
261
+ animation: gc-blink 1s steps(2) infinite;
262
+ }
263
+ @keyframes gc-blink {
264
+ 50% {
265
+ opacity: 0;
266
+ }
267
+ }
268
+
269
+ /* Tool calls */
270
+ .gc-tool {
271
+ background: var(--_panel);
272
+ border: 1px solid var(--_border);
273
+ border-radius: var(--_radius);
274
+ box-shadow: var(--_shadow);
275
+ }
276
+ .gc-tool summary {
277
+ list-style: none;
278
+ cursor: pointer;
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 8px;
282
+ padding: 7px 12px;
283
+ font-size: 0.87em;
284
+ }
285
+ .gc-tool summary::-webkit-details-marker {
286
+ display: none;
287
+ }
288
+ .gc-tool-name {
289
+ font-weight: 600;
290
+ }
291
+ .gc-tool-arg {
292
+ font-family: var(--_mono);
293
+ font-size: 0.92em;
294
+ color: var(--_muted);
295
+ overflow: hidden;
296
+ text-overflow: ellipsis;
297
+ white-space: nowrap;
298
+ flex: 1;
299
+ min-width: 0;
300
+ }
301
+ .gc-tool pre {
302
+ margin: 0;
303
+ padding: 10px 12px;
304
+ border-top: 1px solid var(--_border);
305
+ font: 12px/1.5 var(--_mono);
306
+ max-height: 320px;
307
+ overflow: auto;
308
+ white-space: pre-wrap;
309
+ color: var(--_muted);
310
+ }
311
+ .gc-state {
312
+ width: 16px;
313
+ text-align: center;
314
+ flex: none;
315
+ }
316
+ .gc-state.gc-ok {
317
+ color: var(--_ok);
318
+ }
319
+ .gc-state.gc-err {
320
+ color: var(--_error);
321
+ }
322
+ .gc-spin {
323
+ display: inline-block;
324
+ width: 12px;
325
+ height: 12px;
326
+ border: 2px solid var(--_border);
327
+ border-top-color: var(--_accent);
328
+ border-radius: 50%;
329
+ animation: gc-spin 0.8s linear infinite;
330
+ vertical-align: -2px;
331
+ }
332
+ @keyframes gc-spin {
333
+ to {
334
+ transform: rotate(360deg);
335
+ }
336
+ }
337
+ .gc-files {
338
+ display: flex;
339
+ gap: 6px;
340
+ flex-wrap: wrap;
341
+ align-items: center;
342
+ font-size: 0.87em;
343
+ color: var(--_muted);
344
+ }
345
+ .gc-files code {
346
+ font-family: var(--_mono);
347
+ font-size: 0.92em;
348
+ background: var(--_accent-soft);
349
+ color: var(--_text);
350
+ padding: 2px 8px;
351
+ border-radius: 6px;
352
+ }
353
+
354
+ /* Approvals, errors, notices */
355
+ .gc-approval {
356
+ border: 1px solid var(--_warn);
357
+ background: var(--_warn-soft);
358
+ border-radius: 12px;
359
+ padding: 12px 14px;
360
+ display: flex;
361
+ flex-direction: column;
362
+ gap: 8px;
363
+ }
364
+ .gc-approval .gc-what {
365
+ font-family: var(--_mono);
366
+ font-size: 0.87em;
367
+ overflow-wrap: anywhere;
368
+ }
369
+ .gc-buttons {
370
+ display: flex;
371
+ gap: 8px;
372
+ }
373
+ .gc-waiting {
374
+ font-size: 0.87em;
375
+ color: var(--_muted);
376
+ }
377
+ .gc-approval.gc-done {
378
+ opacity: 0.75;
379
+ flex-direction: row;
380
+ align-items: center;
381
+ padding: 8px 12px;
382
+ font-size: 0.87em;
383
+ }
384
+ .gc-error {
385
+ background: var(--_error-soft);
386
+ color: var(--_error);
387
+ border-radius: var(--_radius);
388
+ padding: 8px 12px;
389
+ font-size: 0.87em;
390
+ white-space: pre-wrap;
391
+ }
392
+ .gc-turn-footer,
393
+ .gc-working {
394
+ font-size: 0.8em;
395
+ color: var(--_faint);
396
+ padding-left: 38px;
397
+ }
398
+ .gc-turn-footer.gc-bad {
399
+ color: var(--_error);
400
+ }
401
+ .gc-working {
402
+ display: flex;
403
+ align-items: center;
404
+ gap: 8px;
405
+ color: var(--_muted);
406
+ }
407
+ .gc-notice {
408
+ align-self: center;
409
+ font-size: 0.87em;
410
+ color: var(--_muted);
411
+ background: var(--_panel);
412
+ border: 1px dashed var(--_border);
413
+ border-radius: var(--_radius);
414
+ padding: 8px 14px;
415
+ white-space: pre-wrap;
416
+ font-family: var(--_mono);
417
+ }
418
+ .gc-notice.gc-err {
419
+ color: var(--_error);
420
+ }
421
+
422
+ /* Buttons and composer */
423
+ .gc-btn {
424
+ border: 1px solid var(--_border);
425
+ background: var(--_panel);
426
+ border-radius: 8px;
427
+ padding: 6px 14px;
428
+ cursor: pointer;
429
+ font-weight: 500;
430
+ }
431
+ .gc-btn.gc-primary {
432
+ background: var(--_accent);
433
+ border-color: var(--_accent);
434
+ color: var(--_accent-text);
435
+ }
436
+ .gc-btn.gc-danger {
437
+ color: var(--_error);
438
+ }
439
+ .gc-btn:disabled {
440
+ opacity: 0.5;
441
+ cursor: default;
442
+ }
443
+ .gc-composer {
444
+ border-top: 1px solid var(--_border);
445
+ background: var(--_panel);
446
+ padding: 12px 16px 14px;
447
+ }
448
+ .gc-composer > * {
449
+ max-width: var(--_max-width);
450
+ margin-left: auto;
451
+ margin-right: auto;
452
+ }
453
+ .gc-queued {
454
+ display: flex;
455
+ gap: 6px;
456
+ flex-wrap: wrap;
457
+ margin-bottom: 8px;
458
+ }
459
+ .gc-queued span {
460
+ font-size: 0.8em;
461
+ background: var(--_bg);
462
+ border: 1px dashed var(--_border);
463
+ border-radius: 8px;
464
+ padding: 3px 8px;
465
+ color: var(--_muted);
466
+ }
467
+ .gc-box {
468
+ display: flex;
469
+ gap: 8px;
470
+ align-items: flex-end;
471
+ background: var(--_bg);
472
+ border: 1px solid var(--_border);
473
+ border-radius: 14px;
474
+ padding: 8px 8px 8px 14px;
475
+ }
476
+ .gc-box:focus-within {
477
+ border-color: var(--_accent);
478
+ }
479
+ .gc-box textarea {
480
+ flex: 1;
481
+ min-width: 0;
482
+ border: 0;
483
+ background: transparent;
484
+ resize: none;
485
+ outline: none;
486
+ max-height: 200px;
487
+ padding: 6px 0;
488
+ }
489
+ .gc-hint {
490
+ font-size: 0.8em;
491
+ color: var(--_faint);
492
+ margin-top: 6px;
493
+ display: flex;
494
+ gap: 12px;
495
+ }
496
+ @media (max-width: 640px) {
497
+ .gc-thread {
498
+ padding: 16px 12px 8px;
499
+ }
500
+ .gc-composer {
501
+ padding: 10px 12px 12px;
502
+ }
503
+ .gc-prompt {
504
+ max-width: 92%;
505
+ }
506
+ }
@@ -0,0 +1,65 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ import type { SessionState, SessionTurn } from '../agents/session.js';
3
+ import type { ApprovalDecision } from '../agents/types.js';
4
+ /** A line from the host itself (not the agent), shown between turns. */
5
+ export interface ChatNotice {
6
+ /** Stable key. */
7
+ id: string | number;
8
+ /** Shown after this many turns: 0 before the first turn, `state.turns.length` at the end. */
9
+ afterTurn: number;
10
+ text: ReactNode;
11
+ tone?: 'info' | 'error';
12
+ }
13
+ export interface AgentChatProps {
14
+ /**
15
+ * The session to show, e.g. `session.get()` sent over SSE. Null or undefined (no session
16
+ * yet) shows an empty, idle chat the user can type into.
17
+ */
18
+ state: SessionState | null | undefined;
19
+ /** The user sent `text` (Enter or the Send button). Whitespace-only input is not sent. */
20
+ onSend(text: string): void;
21
+ /** The user pressed Stop or Esc while the agent works. Without it there is no Stop button. */
22
+ onStop?(): void;
23
+ /**
24
+ * Answer an approval the agent asked for (`state.approvals`). Without it pending approvals
25
+ * show as waiting, with no buttons.
26
+ */
27
+ onApprove?(id: string, decision: ApprovalDecision): void;
28
+ /**
29
+ * How a prompt bubble shows the text that was sent, e.g. to hide a context prefix the host
30
+ * added. Return null to hide the bubble. `turn` is undefined for queued prompts and for
31
+ * input sent while the agent works.
32
+ */
33
+ renderPrompt?(text: string, turn?: SessionTurn): ReactNode;
34
+ /** Tool name as shown, e.g. without an MCP server prefix. Default: friendlier names for common tools. */
35
+ formatToolName?(name: string): string;
36
+ /** Host content after a turn (approval cards, links...). */
37
+ renderAfterTurn?(turn: SessionTurn, index: number): ReactNode;
38
+ /** Host content at the end of the transcript, after the last turn. */
39
+ renderFooter?(): ReactNode;
40
+ /** Host lines between turns. */
41
+ notices?: readonly ChatNotice[];
42
+ /** Replaces the default header (agent, model, session, usage). Pass null for no header. */
43
+ header?: ReactNode;
44
+ /** Extra content at the right end of the default header. */
45
+ headerExtras?: ReactNode;
46
+ /** Shown while there are no turns. Default: "What should <agent> work on?". */
47
+ emptyState?: ReactNode;
48
+ /** Composer placeholder. Default depends on the state (idle, steer, queue). */
49
+ placeholder?: string;
50
+ /** Line under the composer. Default: the keys. Pass null for none. */
51
+ hint?: ReactNode;
52
+ /** Keep the user from sending (the box stays editable), e.g. while the host is disconnected. */
53
+ disabled?: boolean;
54
+ autoFocus?: boolean;
55
+ /** 'auto' follows prefers-color-scheme. Default 'auto'. */
56
+ theme?: 'auto' | 'light' | 'dark';
57
+ className?: string;
58
+ style?: CSSProperties;
59
+ }
60
+ /**
61
+ * A presentational chat with a coding agent: it renders the `SessionState` it is given and
62
+ * reports what the user does through callbacks. It runs nothing, fetches nothing and holds no
63
+ * token; the host owns the `AgentSession`. Import `genaicode/react/styles.css` once.
64
+ */
65
+ export declare function AgentChat(props: AgentChatProps): import("react").JSX.Element;