kraki 0.1.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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/base.d.ts +107 -0
  3. package/dist/adapters/base.js +32 -0
  4. package/dist/adapters/base.js.map +1 -0
  5. package/dist/adapters/copilot.d.ts +51 -0
  6. package/dist/adapters/copilot.js +331 -0
  7. package/dist/adapters/copilot.js.map +1 -0
  8. package/dist/adapters/index.d.ts +5 -0
  9. package/dist/adapters/index.js +4 -0
  10. package/dist/adapters/index.js.map +1 -0
  11. package/dist/banner-data.json +1 -0
  12. package/dist/banner.d.ts +7 -0
  13. package/dist/banner.js +187 -0
  14. package/dist/banner.js.map +1 -0
  15. package/dist/checks.d.ts +26 -0
  16. package/dist/checks.js +74 -0
  17. package/dist/checks.js.map +1 -0
  18. package/dist/cli.d.ts +15 -0
  19. package/dist/cli.js +266 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/config.d.ts +32 -0
  22. package/dist/config.js +102 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/daemon-worker.d.ts +21 -0
  25. package/dist/daemon-worker.js +127 -0
  26. package/dist/daemon-worker.js.map +1 -0
  27. package/dist/daemon.d.ts +15 -0
  28. package/dist/daemon.js +117 -0
  29. package/dist/daemon.js.map +1 -0
  30. package/dist/index.d.ts +8 -0
  31. package/dist/index.js +11 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/key-manager.d.ts +28 -0
  34. package/dist/key-manager.js +61 -0
  35. package/dist/key-manager.js.map +1 -0
  36. package/dist/logger.d.ts +8 -0
  37. package/dist/logger.js +30 -0
  38. package/dist/logger.js.map +1 -0
  39. package/dist/pair.d.ts +32 -0
  40. package/dist/pair.js +131 -0
  41. package/dist/pair.js.map +1 -0
  42. package/dist/parse-permission.d.ts +25 -0
  43. package/dist/parse-permission.js +67 -0
  44. package/dist/parse-permission.js.map +1 -0
  45. package/dist/relay-client.d.ts +82 -0
  46. package/dist/relay-client.js +490 -0
  47. package/dist/relay-client.js.map +1 -0
  48. package/dist/session-manager.d.ts +85 -0
  49. package/dist/session-manager.js +218 -0
  50. package/dist/session-manager.js.map +1 -0
  51. package/dist/setup.d.ts +13 -0
  52. package/dist/setup.js +232 -0
  53. package/dist/setup.js.map +1 -0
  54. package/package.json +46 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kraki Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Abstract base class for coding agent adapters.
3
+ *
4
+ * Each concrete adapter (Copilot, Claude Code, Codex, etc.) wraps
5
+ * an agent's SDK and normalises its events into Kraki protocol types.
6
+ *
7
+ * The tentacle runtime sets the `on*` callbacks before calling `start()`.
8
+ * The adapter fires them as the agent produces events.
9
+ */
10
+ import type { ToolArgs } from '@kraki/protocol';
11
+ import type { SessionContext } from '../session-manager.js';
12
+ export interface SessionCreatedEvent {
13
+ sessionId: string;
14
+ agent: string;
15
+ model?: string;
16
+ }
17
+ export interface MessageEvent {
18
+ content: string;
19
+ }
20
+ export interface MessageDeltaEvent {
21
+ content: string;
22
+ }
23
+ export interface PermissionRequestEvent {
24
+ id: string;
25
+ toolArgs: ToolArgs;
26
+ description: string;
27
+ }
28
+ export interface QuestionRequestEvent {
29
+ id: string;
30
+ question: string;
31
+ choices?: string[];
32
+ allowFreeform: boolean;
33
+ }
34
+ export interface ToolStartEvent {
35
+ toolName: string;
36
+ args: Record<string, unknown>;
37
+ toolCallId?: string;
38
+ }
39
+ export interface ToolCompleteEvent {
40
+ toolName: string;
41
+ result: string;
42
+ toolCallId?: string;
43
+ }
44
+ export interface SessionEndedEvent {
45
+ reason: string;
46
+ }
47
+ export interface ErrorEvent {
48
+ message: string;
49
+ }
50
+ export interface CreateSessionConfig {
51
+ /** Agent-specific model identifier (e.g. "claude-opus-4.6-1m") */
52
+ model?: string;
53
+ /** Working directory for the session */
54
+ cwd?: string;
55
+ /** Caller-supplied session ID (adapter may ignore) */
56
+ sessionId?: string;
57
+ }
58
+ export interface SessionInfo {
59
+ id: string;
60
+ state: 'active' | 'idle' | 'ended';
61
+ model?: string;
62
+ cwd?: string;
63
+ summary?: string;
64
+ }
65
+ export type PermissionDecision = 'approve' | 'deny' | 'always_allow';
66
+ export declare abstract class AgentAdapter {
67
+ onSessionCreated: ((event: SessionCreatedEvent) => void) | null;
68
+ onMessage: ((sessionId: string, event: MessageEvent) => void) | null;
69
+ onMessageDelta: ((sessionId: string, event: MessageDeltaEvent) => void) | null;
70
+ onPermissionRequest: ((sessionId: string, event: PermissionRequestEvent) => void) | null;
71
+ /** Called when a permission is auto-resolved (e.g. by "Always Allow" for same tool kind) */
72
+ onPermissionAutoResolved: ((sessionId: string, permissionId: string) => void) | null;
73
+ onQuestionRequest: ((sessionId: string, event: QuestionRequestEvent) => void) | null;
74
+ onToolStart: ((sessionId: string, event: ToolStartEvent) => void) | null;
75
+ onToolComplete: ((sessionId: string, event: ToolCompleteEvent) => void) | null;
76
+ onIdle: ((sessionId: string) => void) | null;
77
+ onError: ((sessionId: string, event: ErrorEvent) => void) | null;
78
+ onSessionEnded: ((sessionId: string, event: SessionEndedEvent) => void) | null;
79
+ /** Start the adapter (e.g. spawn CLI server). */
80
+ abstract start(): Promise<void>;
81
+ /** Stop the adapter and release all resources. */
82
+ abstract stop(): Promise<void>;
83
+ /** Create a new agent session. */
84
+ abstract createSession(config: CreateSessionConfig): Promise<{
85
+ sessionId: string;
86
+ }>;
87
+ /** Resume a previously created session with recovery context. */
88
+ abstract resumeSession(sessionId: string, context?: SessionContext): Promise<{
89
+ sessionId: string;
90
+ }>;
91
+ /** Send a user message to a session. */
92
+ abstract sendMessage(sessionId: string, text: string, attachments?: string[]): Promise<void>;
93
+ /** Respond to a pending permission request. */
94
+ abstract respondToPermission(sessionId: string, permissionId: string, decision: PermissionDecision): Promise<void>;
95
+ /** Respond to a pending agent question. */
96
+ abstract respondToQuestion(sessionId: string, questionId: string, answer: string, wasFreeform: boolean): Promise<void>;
97
+ /** Kill / disconnect a session. */
98
+ abstract killSession(sessionId: string): Promise<void>;
99
+ /** Abort the current turn (session stays alive). Override in concrete adapters. */
100
+ abortSession(_sessionId: string): Promise<void>;
101
+ /** List known sessions. */
102
+ abstract listSessions(): Promise<SessionInfo[]>;
103
+ /** List available models. Override in concrete adapters. */
104
+ listModels(): Promise<string[]>;
105
+ /** Set permission mode for a session. Override in concrete adapters. */
106
+ setSessionMode(_sessionId: string, _mode: 'ask' | 'auto'): void;
107
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Abstract base class for coding agent adapters.
3
+ *
4
+ * Each concrete adapter (Copilot, Claude Code, Codex, etc.) wraps
5
+ * an agent's SDK and normalises its events into Kraki protocol types.
6
+ *
7
+ * The tentacle runtime sets the `on*` callbacks before calling `start()`.
8
+ * The adapter fires them as the agent produces events.
9
+ */
10
+ // ── The adapter interface ───────────────────────────────
11
+ export class AgentAdapter {
12
+ // --- Callbacks (set by the tentacle runtime) ---
13
+ onSessionCreated = null;
14
+ onMessage = null;
15
+ onMessageDelta = null;
16
+ onPermissionRequest = null;
17
+ /** Called when a permission is auto-resolved (e.g. by "Always Allow" for same tool kind) */
18
+ onPermissionAutoResolved = null;
19
+ onQuestionRequest = null;
20
+ onToolStart = null;
21
+ onToolComplete = null;
22
+ onIdle = null;
23
+ onError = null;
24
+ onSessionEnded = null;
25
+ /** Abort the current turn (session stays alive). Override in concrete adapters. */
26
+ async abortSession(_sessionId) { }
27
+ /** List available models. Override in concrete adapters. */
28
+ async listModels() { return []; }
29
+ /** Set permission mode for a session. Override in concrete adapters. */
30
+ setSessionMode(_sessionId, _mode) { }
31
+ }
32
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/adapters/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+EH,2DAA2D;AAE3D,MAAM,OAAgB,YAAY;IAChC,kDAAkD;IAElD,gBAAgB,GAAkD,IAAI,CAAC;IACvE,SAAS,GAA8D,IAAI,CAAC;IAC5E,cAAc,GAAmE,IAAI,CAAC;IACtF,mBAAmB,GAAwE,IAAI,CAAC;IAChG,4FAA4F;IAC5F,wBAAwB,GAA+D,IAAI,CAAC;IAC5F,iBAAiB,GAAsE,IAAI,CAAC;IAC5F,WAAW,GAAgE,IAAI,CAAC;IAChF,cAAc,GAAmE,IAAI,CAAC;IACtF,MAAM,GAAyC,IAAI,CAAC;IACpD,OAAO,GAA4D,IAAI,CAAC;IACxE,cAAc,GAAmE,IAAI,CAAC;IAuCtF,mFAAmF;IACnF,KAAK,CAAC,YAAY,CAAC,UAAkB,IAA0C,CAAC;IAKhF,4DAA4D;IAC5D,KAAK,CAAC,UAAU,KAAwB,OAAO,EAAE,CAAC,CAAC,CAAC;IAEpD,wEAAwE;IACxE,cAAc,CAAC,UAAkB,EAAE,KAAqB,IAAiC,CAAC;CAC3F"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Copilot SDK adapter for Kraki.
3
+ *
4
+ * Wraps `@github/copilot-sdk` and normalises Copilot CLI events
5
+ * into the abstract `AgentAdapter` callback interface.
6
+ *
7
+ * Key responsibilities:
8
+ * - Manage the CopilotClient lifecycle (start/stop the CLI server)
9
+ * - Create/resume/kill sessions via the SDK
10
+ * - Wire SDK streaming events → `on*` callbacks
11
+ * - Implement the permission-request / question blocking pattern:
12
+ * the SDK handler returns a Promise that resolves when the
13
+ * remote user approves/denies/answers via the tentacle runtime.
14
+ */
15
+ import { AgentAdapter, type CreateSessionConfig, type SessionInfo, type PermissionDecision } from './base.js';
16
+ export declare class CopilotAdapter extends AgentAdapter {
17
+ private client;
18
+ private sessions;
19
+ private cliPath;
20
+ /** Per-session auto-approve sets (populated by "Always Allow" clicks) */
21
+ private sessionAllowSets;
22
+ /** Session permission mode: 'ask' (default) or 'auto' */
23
+ private sessionModes;
24
+ constructor(options?: {
25
+ cliPath?: string;
26
+ });
27
+ start(): Promise<void>;
28
+ stop(): Promise<void>;
29
+ createSession(config: CreateSessionConfig): Promise<{
30
+ sessionId: string;
31
+ }>;
32
+ resumeSession(sessionId: string): Promise<{
33
+ sessionId: string;
34
+ }>;
35
+ sendMessage(sessionId: string, text: string, attachments?: string[]): Promise<void>;
36
+ respondToPermission(sessionId: string, permissionId: string, decision: PermissionDecision): Promise<void>;
37
+ respondToQuestion(sessionId: string, questionId: string, answer: string, wasFreeform: boolean): Promise<void>;
38
+ killSession(sessionId: string): Promise<void>;
39
+ abortSession(sessionId: string): Promise<void>;
40
+ listSessions(): Promise<SessionInfo[]>;
41
+ listModels(): Promise<string[]>;
42
+ /** Set permission mode for a session ('ask' or 'auto') */
43
+ setSessionMode(sessionId: string, mode: 'ask' | 'auto'): void;
44
+ /** Clean up session-scoped permission state */
45
+ private cleanupSessionPermissions;
46
+ private wireEvents;
47
+ private makePermissionHandler;
48
+ private makeQuestionHandler;
49
+ private ensureClient;
50
+ private getSession;
51
+ }
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Copilot SDK adapter for Kraki.
3
+ *
4
+ * Wraps `@github/copilot-sdk` and normalises Copilot CLI events
5
+ * into the abstract `AgentAdapter` callback interface.
6
+ *
7
+ * Key responsibilities:
8
+ * - Manage the CopilotClient lifecycle (start/stop the CLI server)
9
+ * - Create/resume/kill sessions via the SDK
10
+ * - Wire SDK streaming events → `on*` callbacks
11
+ * - Implement the permission-request / question blocking pattern:
12
+ * the SDK handler returns a Promise that resolves when the
13
+ * remote user approves/denies/answers via the tentacle runtime.
14
+ */
15
+ import { CopilotClient } from '@github/copilot-sdk';
16
+ import { execSync } from 'node:child_process';
17
+ import { AgentAdapter, } from './base.js';
18
+ import { parsePermission } from '../parse-permission.js';
19
+ import { createLogger } from '../logger.js';
20
+ const logger = createLogger('copilot-adapter');
21
+ // ── Helpers ─────────────────────────────────────────────
22
+ function makeId(prefix) {
23
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
24
+ }
25
+ // ── Adapter ─────────────────────────────────────────────
26
+ export class CopilotAdapter extends AgentAdapter {
27
+ client = null;
28
+ sessions = new Map();
29
+ cliPath;
30
+ /** Per-session auto-approve sets (populated by "Always Allow" clicks) */
31
+ sessionAllowSets = new Map();
32
+ /** Session permission mode: 'ask' (default) or 'auto' */
33
+ sessionModes = new Map();
34
+ constructor(options = {}) {
35
+ super();
36
+ this.cliPath = options.cliPath;
37
+ }
38
+ // ── Lifecycle ───────────────────────────────────────
39
+ async start() {
40
+ // Resolve GitHub token from `gh` CLI to bypass macOS Keychain prompts.
41
+ let githubToken = process.env.GITHUB_TOKEN ?? process.env.GH_TOKEN;
42
+ if (!githubToken) {
43
+ try {
44
+ githubToken = execSync('gh auth token 2>/dev/null', { encoding: 'utf8' }).trim() || undefined;
45
+ if (githubToken)
46
+ logger.info('Using GitHub token from `gh auth token`');
47
+ }
48
+ catch {
49
+ // gh CLI unavailable — SDK will use its own auth chain
50
+ }
51
+ }
52
+ const opts = {
53
+ useLoggedInUser: false,
54
+ ...(githubToken && { githubToken }),
55
+ ...(this.cliPath && { cliPath: this.cliPath }),
56
+ };
57
+ this.client = new CopilotClient(opts);
58
+ await this.client.start();
59
+ logger.info('started');
60
+ }
61
+ async stop() {
62
+ if (this.client) {
63
+ await this.client.stop();
64
+ this.client = null;
65
+ }
66
+ this.sessions.clear();
67
+ logger.info('stopped');
68
+ }
69
+ // ── Session management ──────────────────────────────
70
+ async createSession(config) {
71
+ this.ensureClient();
72
+ const pendingPermissions = new Map();
73
+ const pendingQuestions = new Map();
74
+ const sessionConfig = {
75
+ ...(config.sessionId && { sessionId: config.sessionId }),
76
+ ...(config.model && { model: config.model }),
77
+ ...(config.cwd && { workingDirectory: config.cwd }),
78
+ streaming: true,
79
+ onPermissionRequest: this.makePermissionHandler(pendingPermissions),
80
+ onUserInputRequest: this.makeQuestionHandler(pendingQuestions),
81
+ };
82
+ const session = await this.client.createSession(sessionConfig);
83
+ const sid = session.sessionId;
84
+ this.sessions.set(sid, { session, pendingPermissions, pendingQuestions });
85
+ this.wireEvents(sid, session);
86
+ logger.info(`session created: ${sid} (model: ${config.model ?? 'default'})`);
87
+ this.onSessionCreated?.({
88
+ sessionId: sid,
89
+ agent: 'copilot',
90
+ model: config.model,
91
+ });
92
+ return { sessionId: sid };
93
+ }
94
+ async resumeSession(sessionId) {
95
+ this.ensureClient();
96
+ const pendingPermissions = new Map();
97
+ const pendingQuestions = new Map();
98
+ const resumeConfig = {
99
+ onPermissionRequest: this.makePermissionHandler(pendingPermissions),
100
+ onUserInputRequest: this.makeQuestionHandler(pendingQuestions),
101
+ };
102
+ const session = await this.client.resumeSession(sessionId, resumeConfig);
103
+ this.sessions.set(sessionId, { session, pendingPermissions, pendingQuestions });
104
+ this.wireEvents(sessionId, session);
105
+ logger.info(`session resumed: ${sessionId}`);
106
+ return { sessionId };
107
+ }
108
+ async sendMessage(sessionId, text, attachments) {
109
+ const entry = this.getSession(sessionId);
110
+ const opts = { prompt: text };
111
+ if (attachments?.length) {
112
+ opts.attachments = attachments.map((path) => ({ type: 'file', path }));
113
+ }
114
+ await entry.session.send(opts);
115
+ }
116
+ async respondToPermission(sessionId, permissionId, decision) {
117
+ const entry = this.sessions.get(sessionId);
118
+ if (!entry) {
119
+ logger.warn(`respondToPermission: session not found: ${sessionId}`);
120
+ return;
121
+ }
122
+ const pending = entry.pendingPermissions.get(permissionId);
123
+ if (!pending) {
124
+ logger.warn(`respondToPermission: no pending permission: ${permissionId} (already resolved or timed out)`);
125
+ return;
126
+ }
127
+ // For always_allow: add tool kind to session-scope allow set
128
+ if (decision === 'always_allow' && pending.toolKind) {
129
+ if (!this.sessionAllowSets.has(sessionId)) {
130
+ this.sessionAllowSets.set(sessionId, new Set());
131
+ }
132
+ this.sessionAllowSets.get(sessionId).add(pending.toolKind);
133
+ logger.info(`Always allow "${pending.toolKind}" for session ${sessionId}`);
134
+ // Auto-approve any OTHER pending permissions of the same tool kind in this session
135
+ for (const [otherId, otherPending] of entry.pendingPermissions) {
136
+ if (otherId !== permissionId && otherPending.toolKind === pending.toolKind) {
137
+ otherPending.resolve({ kind: 'approved' });
138
+ entry.pendingPermissions.delete(otherId);
139
+ this.onPermissionAutoResolved?.(sessionId, otherId);
140
+ logger.info(`permission ${otherId}: auto-approved (same tool kind as always_allow)`);
141
+ }
142
+ }
143
+ }
144
+ const kindMap = {
145
+ approve: { kind: 'approved' },
146
+ deny: { kind: 'denied-interactively-by-user' },
147
+ always_allow: { kind: 'approved' },
148
+ };
149
+ pending.resolve(kindMap[decision] ?? { kind: 'denied-interactively-by-user' });
150
+ entry.pendingPermissions.delete(permissionId);
151
+ logger.info(`permission ${permissionId}: ${decision}`);
152
+ }
153
+ async respondToQuestion(sessionId, questionId, answer, wasFreeform) {
154
+ const entry = this.sessions.get(sessionId);
155
+ if (!entry) {
156
+ logger.warn(`respondToQuestion: session not found: ${sessionId}`);
157
+ return;
158
+ }
159
+ const pending = entry.pendingQuestions.get(questionId);
160
+ if (!pending) {
161
+ logger.warn(`respondToQuestion: no pending question: ${questionId}`);
162
+ return;
163
+ }
164
+ pending.resolve({ answer, wasFreeform });
165
+ entry.pendingQuestions.delete(questionId);
166
+ logger.info(`question ${questionId}: "${answer}" (freeform: ${wasFreeform})`);
167
+ }
168
+ async killSession(sessionId) {
169
+ const entry = this.sessions.get(sessionId);
170
+ if (entry) {
171
+ for (const [, p] of entry.pendingPermissions)
172
+ p.resolve({ kind: 'denied-interactively-by-user' });
173
+ for (const [, q] of entry.pendingQuestions)
174
+ q.resolve({ answer: '', wasFreeform: true });
175
+ await entry.session.abort().catch(() => { });
176
+ await entry.session.disconnect();
177
+ this.sessions.delete(sessionId);
178
+ }
179
+ this.cleanupSessionPermissions(sessionId);
180
+ this.onSessionEnded?.(sessionId, { reason: 'killed' });
181
+ logger.info(`session killed: ${sessionId}`);
182
+ }
183
+ async abortSession(sessionId) {
184
+ const entry = this.sessions.get(sessionId);
185
+ if (entry) {
186
+ for (const [, p] of entry.pendingPermissions)
187
+ p.resolve({ kind: 'denied-interactively-by-user' });
188
+ for (const [, q] of entry.pendingQuestions)
189
+ q.resolve({ answer: '', wasFreeform: true });
190
+ entry.pendingPermissions.clear();
191
+ entry.pendingQuestions.clear();
192
+ await entry.session.abort();
193
+ logger.info(`session aborted: ${sessionId}`);
194
+ }
195
+ }
196
+ async listSessions() {
197
+ if (!this.client)
198
+ return [];
199
+ const list = await this.client.listSessions();
200
+ return list.map((s) => ({
201
+ id: s.sessionId,
202
+ state: this.sessions.has(s.sessionId) ? 'active' : 'ended',
203
+ model: undefined,
204
+ cwd: s.context?.cwd,
205
+ summary: s.summary ?? '',
206
+ }));
207
+ }
208
+ async listModels() {
209
+ if (!this.client)
210
+ return [];
211
+ try {
212
+ const models = await this.client.listModels();
213
+ return models.map((m) => m.id);
214
+ }
215
+ catch {
216
+ return [];
217
+ }
218
+ }
219
+ /** Set permission mode for a session ('ask' or 'auto') */
220
+ setSessionMode(sessionId, mode) {
221
+ this.sessionModes.set(sessionId, mode);
222
+ logger.info(`Session ${sessionId} permission mode: ${mode}`);
223
+ }
224
+ /** Clean up session-scoped permission state */
225
+ cleanupSessionPermissions(sessionId) {
226
+ this.sessionAllowSets.delete(sessionId);
227
+ this.sessionModes.delete(sessionId);
228
+ }
229
+ // ── SDK → callback wiring ─────────────────────────
230
+ wireEvents(sessionId, session) {
231
+ session.on('assistant.message_delta', (event) => {
232
+ this.onMessageDelta?.(sessionId, { content: event.data.deltaContent });
233
+ });
234
+ session.on('assistant.message', (event) => {
235
+ // Skip empty messages (SDK sends these before tool calls)
236
+ if (event.data.content) {
237
+ this.onMessage?.(sessionId, { content: event.data.content });
238
+ }
239
+ });
240
+ session.on('tool.execution_start', (event) => {
241
+ const data = event.data;
242
+ this.onToolStart?.(sessionId, {
243
+ toolName: data.toolName,
244
+ args: (data.args ?? data.arguments ?? {}),
245
+ toolCallId: data.toolCallId,
246
+ });
247
+ });
248
+ session.on('tool.execution_complete', (event) => {
249
+ const data = event.data;
250
+ const rawResult = data.result;
251
+ // SDK sends result as { content: string } or as a plain string
252
+ const result = typeof rawResult === 'object' && rawResult !== null
253
+ ? rawResult.content ?? ''
254
+ : (rawResult ?? data.output ?? '');
255
+ this.onToolComplete?.(sessionId, {
256
+ toolName: data.toolName,
257
+ result,
258
+ toolCallId: data.toolCallId,
259
+ });
260
+ });
261
+ session.on('session.idle', () => {
262
+ this.onIdle?.(sessionId);
263
+ });
264
+ session.on('assistant.turn_end', (event) => {
265
+ const data = event.data;
266
+ const reason = data?.reason;
267
+ if (reason === 'error') {
268
+ this.onError?.(sessionId, {
269
+ message: data?.error ?? 'Unknown agent error',
270
+ });
271
+ }
272
+ });
273
+ }
274
+ // ── Permission handler factory ────────────────────
275
+ makePermissionHandler(pending) {
276
+ return (req, invocation) => {
277
+ const sessionId = invocation.sessionId;
278
+ const toolKind = req.kind; // e.g. 'shell', 'write', 'read', 'url', 'mcp'
279
+ // Layer 1: Auto mode — approve everything in this session
280
+ if (this.sessionModes.get(sessionId) === 'auto') {
281
+ logger.info(`permission auto-approved (auto mode): ${toolKind}`);
282
+ return { kind: 'approved' };
283
+ }
284
+ // Layer 3: Session allow set — auto-approve if previously "Always Allowed"
285
+ if (this.sessionAllowSets.get(sessionId)?.has(toolKind)) {
286
+ logger.info(`permission auto-approved (session allow): ${toolKind}`);
287
+ return { kind: 'approved' };
288
+ }
289
+ // Not auto-approved — send to relay for user decision
290
+ const permId = makeId('perm');
291
+ const parsed = parsePermission(req);
292
+ logger.info(`permission [${permId}]: ${parsed.toolArgs.toolName} — ${parsed.description}`);
293
+ this.onPermissionRequest?.(sessionId, {
294
+ id: permId,
295
+ ...parsed,
296
+ });
297
+ const promise = new Promise((resolve) => {
298
+ pending.set(permId, { resolve, toolKind });
299
+ });
300
+ return promise;
301
+ };
302
+ }
303
+ // ── Question handler factory ──────────────────────
304
+ makeQuestionHandler(pending) {
305
+ return (req, invocation) => {
306
+ const qId = makeId('q');
307
+ logger.debug(`question [${qId}]: ${req.question}`);
308
+ this.onQuestionRequest?.(invocation.sessionId, {
309
+ id: qId,
310
+ question: req.question ?? '',
311
+ choices: req.choices ?? undefined,
312
+ allowFreeform: req.allowFreeform !== false,
313
+ });
314
+ return new Promise((resolve) => {
315
+ pending.set(qId, { resolve });
316
+ });
317
+ };
318
+ }
319
+ // ── Guards ────────────────────────────────────────
320
+ ensureClient() {
321
+ if (!this.client)
322
+ throw new Error('Adapter not started — call start() first');
323
+ }
324
+ getSession(sessionId) {
325
+ const entry = this.sessions.get(sessionId);
326
+ if (!entry)
327
+ throw new Error(`Session not found: ${sessionId}`);
328
+ return entry;
329
+ }
330
+ }
331
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/adapters/copilot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { AgentAdapter } from './base.js';
2
+ export { CopilotAdapter } from './copilot.js';
3
+ export type { CreateSessionConfig, SessionInfo, PermissionDecision, SessionCreatedEvent, MessageEvent, MessageDeltaEvent, PermissionRequestEvent, QuestionRequestEvent, ToolStartEvent, ToolCompleteEvent, SessionEndedEvent, ErrorEvent, } from './base.js';
4
+ export { parsePermission } from '../parse-permission.js';
5
+ export type { ParsedPermission } from '../parse-permission.js';
@@ -0,0 +1,4 @@
1
+ export { AgentAdapter } from './base.js';
2
+ export { CopilotAdapter } from './copilot.js';
3
+ export { parsePermission } from '../parse-permission.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAkB9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1 @@
1
+ {"lines": [" .:--:. ", " .:-========-:. ", " .:-================-: ", " =+===================- ", " =++++----=====---====- ", " =+++= ==== :===- ", " =++++-::-+===:..:====- ", " .:. -++++++++++++========: .:. ", ".#%@%- =*+++++++++++===+= -%@%#.", ":@@@@+ =+**+++++++++++++= +@@@@:", " *@@@%*==+##**+:====+**+:+**##+==*%@@@+ ", " -#%@@@@@@@%+ ====+*** +%@@@@@@@%#- ", " .-=++**+=-.:====****-:-**##++=-. ", " .-========:-+*******+. ", " .::--:. :-===-. "], "colors": [[[17, 4, 67, 66], [18, 7, 112, 110], [19, 7, 132, 130], [20, 7, 132, 130], [21, 7, 112, 110], [22, 4, 67, 65]], [[13, 4, 65, 64], [14, 6, 108, 106], [15, 8, 147, 145], [16, 9, 174, 171], [17, 10, 187, 184], [18, 9, 189, 186], [19, 9, 188, 185], [20, 9, 188, 185], [21, 10, 189, 186], [22, 10, 187, 184], [23, 10, 174, 171], [24, 8, 147, 144], [25, 6, 107, 106], [26, 4, 64, 63]], [[9, 3, 43, 42], [10, 7, 112, 110], [11, 9, 150, 148], [12, 9, 178, 175], [13, 10, 190, 187], [14, 9, 191, 188], [15, 9, 188, 185], [16, 9, 186, 183], [17, 9, 184, 181], [18, 9, 184, 181], [19, 9, 184, 181], [20, 9, 184, 181], [21, 9, 184, 181], [22, 9, 184, 181], [23, 9, 186, 183], [24, 9, 189, 185], [25, 10, 191, 188], [26, 10, 190, 187], [27, 9, 178, 175], [28, 8, 152, 149], [29, 7, 113, 111], [30, 3, 40, 40]], [[9, 4, 200, 190], [10, 5, 237, 230], [11, 8, 205, 199], [12, 9, 186, 183], [13, 9, 182, 179], [14, 9, 187, 184], [15, 9, 190, 187], [16, 9, 190, 187], [17, 9, 187, 184], [18, 9, 184, 181], [19, 9, 184, 181], [20, 9, 184, 181], [21, 9, 184, 181], [22, 9, 186, 183], [23, 9, 190, 187], [24, 9, 190, 187], [25, 9, 188, 185], [26, 9, 185, 182], [27, 9, 185, 182], [28, 9, 188, 185], [29, 10, 196, 192], [30, 9, 148, 146]], [[9, 3, 210, 199], [10, 0, 255, 251], [11, 0, 255, 243], [12, 2, 241, 230], [13, 6, 215, 208], [14, 9, 158, 155], [15, 8, 126, 124], [16, 8, 130, 129], [17, 9, 166, 164], [18, 10, 186, 183], [19, 10, 184, 181], [20, 9, 184, 181], [21, 10, 186, 182], [22, 10, 170, 168], [23, 8, 132, 131], [24, 8, 125, 123], [25, 9, 150, 148], [26, 9, 183, 180], [27, 9, 184, 181], [28, 9, 184, 181], [29, 10, 188, 185], [30, 9, 150, 148]], [[9, 3, 208, 198], [10, 0, 255, 249], [11, 0, 255, 243], [12, 0, 255, 251], [13, 2, 192, 182], [18, 10, 171, 168], [19, 9, 184, 181], [20, 9, 185, 182], [21, 10, 180, 178], [22, 3, 36, 36], [26, 7, 116, 114], [27, 9, 191, 187], [28, 9, 184, 181], [29, 10, 188, 185], [30, 9, 149, 147]], [[9, 3, 214, 203], [10, 0, 255, 251], [11, 0, 255, 243], [12, 0, 255, 245], [13, 1, 240, 229], [14, 2, 150, 141], [15, 1, 98, 92], [16, 1, 93, 88], [17, 2, 138, 131], [18, 5, 223, 214], [19, 8, 202, 196], [20, 9, 185, 182], [21, 10, 181, 179], [22, 7, 111, 110], [23, 4, 69, 67], [24, 4, 69, 68], [25, 6, 100, 99], [26, 9, 168, 165], [27, 9, 186, 183], [28, 9, 184, 181], [29, 9, 190, 187], [30, 9, 153, 151]], [[2, 49, 49, 49], [3, 59, 60, 60], [4, 31, 32, 32], [9, 3, 144, 137], [10, 1, 244, 238], [11, 0, 255, 247], [12, 0, 255, 246], [13, 0, 255, 247], [14, 0, 255, 253], [15, 0, 255, 252], [16, 0, 255, 251], [17, 0, 255, 252], [18, 0, 255, 246], [19, 0, 255, 243], [20, 2, 241, 230], [21, 5, 217, 209], [22, 9, 200, 195], [23, 10, 189, 186], [24, 10, 188, 185], [25, 10, 190, 187], [26, 9, 184, 181], [27, 10, 181, 178], [28, 10, 184, 181], [29, 10, 180, 177], [30, 7, 103, 102], [35, 32, 32, 33], [36, 59, 60, 60], [37, 49, 49, 49]], [[0, 32, 32, 32], [1, 204, 204, 204], [2, 253, 253, 253], [3, 255, 255, 255], [4, 241, 241, 241], [5, 96, 97, 97], [11, 113, 133, 148], [12, 115, 194, 209], [13, 56, 223, 224], [14, 15, 247, 238], [15, 0, 255, 246], [16, 0, 255, 246], [17, 0, 255, 245], [18, 0, 255, 244], [19, 0, 255, 244], [20, 0, 255, 245], [21, 0, 255, 246], [22, 0, 255, 241], [23, 0, 240, 228], [24, 4, 211, 204], [25, 9, 191, 187], [26, 8, 200, 195], [27, 6, 219, 215], [28, 7, 177, 170], [34, 96, 97, 97], [35, 241, 241, 241], [36, 255, 255, 255], [37, 253, 253, 253], [38, 205, 206, 206], [39, 32, 33, 33]], [[0, 61, 62, 62], [1, 255, 255, 255], [2, 255, 255, 255], [3, 255, 255, 255], [4, 255, 255, 255], [5, 166, 167, 167], [11, 217, 80, 119], [12, 255, 102, 151], [13, 254, 107, 153], [14, 229, 126, 167], [15, 143, 151, 172], [16, 2, 216, 208], [17, 2, 238, 229], [18, 1, 249, 238], [19, 1, 253, 241], [20, 7, 251, 240], [21, 20, 244, 236], [22, 61, 221, 222], [23, 118, 185, 198], [24, 34, 220, 214], [25, 1, 254, 245], [26, 0, 255, 243], [27, 0, 255, 250], [28, 0, 216, 205], [34, 165, 166, 166], [35, 255, 255, 255], [36, 255, 255, 255], [37, 255, 255, 255], [38, 255, 255, 255], [39, 60, 60, 61]], [[1, 171, 172, 172], [2, 255, 255, 255], [3, 255, 255, 255], [4, 255, 255, 255], [5, 250, 251, 251], [6, 182, 183, 183], [7, 125, 125, 125], [8, 114, 114, 114], [9, 145, 146, 146], [10, 217, 189, 197], [11, 255, 172, 198], [12, 255, 138, 174], [13, 255, 122, 166], [14, 244, 99, 143], [15, 82, 51, 64], [16, 4, 171, 167], [17, 9, 185, 182], [18, 6, 191, 186], [19, 22, 191, 188], [20, 198, 137, 168], [21, 232, 122, 162], [22, 255, 108, 154], [23, 255, 96, 143], [24, 53, 79, 85], [25, 1, 233, 224], [26, 20, 255, 253], [27, 55, 255, 247], [28, 114, 255, 252], [29, 174, 222, 219], [30, 150, 149, 149], [31, 114, 115, 115], [32, 123, 124, 124], [33, 180, 180, 180], [34, 250, 250, 250], [35, 255, 255, 255], [36, 255, 255, 255], [37, 255, 255, 255], [38, 169, 170, 170]], [[2, 112, 112, 112], [3, 212, 212, 212], [4, 254, 254, 254], [5, 255, 255, 255], [6, 255, 255, 255], [7, 255, 255, 255], [8, 255, 255, 255], [9, 255, 255, 255], [10, 255, 255, 255], [11, 255, 255, 255], [12, 234, 249, 249], [13, 162, 154, 161], [14, 46, 16, 22], [16, 10, 175, 173], [17, 9, 186, 183], [18, 6, 184, 180], [19, 26, 178, 178], [20, 237, 113, 154], [21, 255, 105, 153], [22, 255, 108, 155], [23, 251, 108, 151], [26, 135, 163, 164], [27, 254, 244, 247], [28, 255, 255, 255], [29, 255, 255, 255], [30, 255, 255, 255], [31, 255, 255, 255], [32, 255, 255, 255], [33, 255, 255, 255], [34, 255, 255, 255], [35, 253, 253, 253], [36, 210, 211, 211], [37, 110, 110, 111]], [[4, 54, 54, 54], [5, 102, 103, 103], [6, 137, 138, 138], [7, 155, 156, 156], [8, 158, 161, 161], [9, 148, 218, 217], [10, 120, 222, 220], [11, 77, 205, 202], [12, 31, 195, 191], [13, 1, 129, 126], [14, 0, 72, 70], [15, 6, 104, 102], [16, 10, 182, 179], [17, 9, 185, 182], [18, 6, 187, 183], [19, 26, 184, 184], [20, 240, 119, 160], [21, 255, 109, 156], [22, 255, 109, 154], [23, 253, 108, 154], [24, 153, 66, 92], [25, 102, 40, 57], [26, 170, 67, 97], [27, 255, 124, 165], [28, 255, 150, 182], [29, 255, 178, 203], [30, 249, 189, 207], [31, 164, 161, 162], [32, 155, 155, 156], [33, 137, 137, 137], [34, 102, 102, 102], [35, 53, 54, 54]], [[9, 0, 57, 56], [10, 0, 156, 153], [11, 2, 184, 181], [12, 6, 188, 185], [13, 9, 193, 190], [14, 10, 195, 192], [15, 10, 195, 192], [16, 9, 190, 187], [17, 10, 188, 185], [18, 9, 173, 171], [19, 7, 95, 94], [20, 126, 56, 77], [21, 232, 100, 142], [22, 255, 110, 157], [23, 255, 111, 159], [24, 255, 115, 163], [25, 255, 115, 163], [26, 255, 114, 162], [27, 255, 109, 157], [28, 255, 105, 152], [29, 215, 88, 128], [30, 88, 33, 49]], [[11, 4, 57, 57], [12, 6, 98, 98], [13, 8, 123, 122], [14, 8, 132, 131], [15, 8, 128, 126], [16, 7, 109, 107], [17, 5, 73, 72], [22, 94, 41, 57], [23, 144, 63, 88], [24, 173, 75, 105], [25, 180, 78, 109], [26, 168, 72, 102], [27, 133, 58, 81], [28, 77, 34, 47]]], "w": 40, "h": 15}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Animated ASCII banner for Kraki CLI.
3
+ * Renders a colored octopus logo with radial reveal + title animation.
4
+ */
5
+ export declare function printAnimatedBanner(): Promise<void>;
6
+ /** Static (non-animated) banner for quick display */
7
+ export declare function printStaticBanner(): void;