codekin 0.5.5 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +7 -4
  2. package/dist/assets/index-BNU7FIQx.css +1 -0
  3. package/dist/assets/index-k7mgzd5O.js +182 -0
  4. package/dist/index.html +2 -2
  5. package/package.json +1 -1
  6. package/server/dist/approval-manager.js +1 -1
  7. package/server/dist/claude-process.d.ts +8 -5
  8. package/server/dist/claude-process.js +21 -63
  9. package/server/dist/claude-process.js.map +1 -1
  10. package/server/dist/coding-process.d.ts +83 -0
  11. package/server/dist/coding-process.js +32 -0
  12. package/server/dist/coding-process.js.map +1 -0
  13. package/server/dist/commit-event-handler.js +1 -0
  14. package/server/dist/commit-event-handler.js.map +1 -1
  15. package/server/dist/docs-routes.js +34 -6
  16. package/server/dist/docs-routes.js.map +1 -1
  17. package/server/dist/native-permissions.js +3 -2
  18. package/server/dist/native-permissions.js.map +1 -1
  19. package/server/dist/opencode-process.d.ts +120 -0
  20. package/server/dist/opencode-process.js +814 -0
  21. package/server/dist/opencode-process.js.map +1 -0
  22. package/server/dist/orchestrator-children.d.ts +9 -0
  23. package/server/dist/orchestrator-children.js +28 -1
  24. package/server/dist/orchestrator-children.js.map +1 -1
  25. package/server/dist/orchestrator-manager.js +17 -0
  26. package/server/dist/orchestrator-manager.js.map +1 -1
  27. package/server/dist/orchestrator-reports.js +9 -4
  28. package/server/dist/orchestrator-reports.js.map +1 -1
  29. package/server/dist/orchestrator-routes.js +8 -1
  30. package/server/dist/orchestrator-routes.js.map +1 -1
  31. package/server/dist/prompt-router.d.ts +2 -2
  32. package/server/dist/prompt-router.js +16 -0
  33. package/server/dist/prompt-router.js.map +1 -1
  34. package/server/dist/session-lifecycle.d.ts +4 -4
  35. package/server/dist/session-lifecycle.js +93 -29
  36. package/server/dist/session-lifecycle.js.map +1 -1
  37. package/server/dist/session-manager.d.ts +9 -0
  38. package/server/dist/session-manager.js +113 -50
  39. package/server/dist/session-manager.js.map +1 -1
  40. package/server/dist/session-persistence.d.ts +1 -0
  41. package/server/dist/session-persistence.js +6 -1
  42. package/server/dist/session-persistence.js.map +1 -1
  43. package/server/dist/session-restart-scheduler.d.ts +9 -2
  44. package/server/dist/session-restart-scheduler.js +14 -2
  45. package/server/dist/session-restart-scheduler.js.map +1 -1
  46. package/server/dist/session-routes.js +17 -3
  47. package/server/dist/session-routes.js.map +1 -1
  48. package/server/dist/stepflow-handler.d.ts +2 -2
  49. package/server/dist/stepflow-handler.js +4 -4
  50. package/server/dist/stepflow-handler.js.map +1 -1
  51. package/server/dist/tool-labels.d.ts +8 -0
  52. package/server/dist/tool-labels.js +51 -0
  53. package/server/dist/tool-labels.js.map +1 -0
  54. package/server/dist/tsconfig.tsbuildinfo +1 -1
  55. package/server/dist/types.d.ts +35 -10
  56. package/server/dist/types.js +4 -1
  57. package/server/dist/types.js.map +1 -1
  58. package/server/dist/webhook-dedup.d.ts +11 -0
  59. package/server/dist/webhook-dedup.js +23 -0
  60. package/server/dist/webhook-dedup.js.map +1 -1
  61. package/server/dist/webhook-handler.d.ts +20 -4
  62. package/server/dist/webhook-handler.js +256 -20
  63. package/server/dist/webhook-handler.js.map +1 -1
  64. package/server/dist/webhook-pr-cache.d.ts +57 -0
  65. package/server/dist/webhook-pr-cache.js +95 -0
  66. package/server/dist/webhook-pr-cache.js.map +1 -0
  67. package/server/dist/webhook-pr-github.d.ts +68 -0
  68. package/server/dist/webhook-pr-github.js +202 -0
  69. package/server/dist/webhook-pr-github.js.map +1 -0
  70. package/server/dist/webhook-pr-prompt.d.ts +27 -0
  71. package/server/dist/webhook-pr-prompt.js +251 -0
  72. package/server/dist/webhook-pr-prompt.js.map +1 -0
  73. package/server/dist/webhook-types.d.ts +70 -1
  74. package/server/dist/webhook-workspace.js +20 -1
  75. package/server/dist/webhook-workspace.js.map +1 -1
  76. package/server/dist/workflow-config.d.ts +2 -0
  77. package/server/dist/workflow-config.js.map +1 -1
  78. package/server/dist/workflow-loader.js +3 -0
  79. package/server/dist/workflow-loader.js.map +1 -1
  80. package/server/dist/workflow-routes.js +6 -2
  81. package/server/dist/workflow-routes.js.map +1 -1
  82. package/server/dist/ws-message-handler.js +22 -3
  83. package/server/dist/ws-message-handler.js.map +1 -1
  84. package/server/dist/ws-server.js +46 -13
  85. package/server/dist/ws-server.js.map +1 -1
  86. package/server/workflows/pr-review.md +27 -0
  87. package/dist/assets/index-BFkKlY3O.js +0 -182
  88. package/dist/assets/index-CjEQkT2b.css +0 -1
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Manages an OpenCode server session via HTTP REST + SSE.
3
+ *
4
+ * OpenCode (github.com/anomalyco/opencode) uses a client/server architecture:
5
+ * - `opencode serve` runs a long-lived HTTP server
6
+ * - Sessions are created/managed via REST API
7
+ * - Real-time events stream via SSE (Server-Sent Events)
8
+ *
9
+ * This class wraps that model behind the same CodingProcess interface that
10
+ * ClaudeProcess implements, so SessionManager works identically for both.
11
+ *
12
+ * Key differences from ClaudeProcess:
13
+ * - No child process per session — one shared OpenCode server
14
+ * - Messages sent via HTTP POST, not stdin
15
+ * - Events received via SSE, not stdout NDJSON
16
+ * - Permissions handled via POST /permission/:id/reply, not control_response on stdin
17
+ */
18
+ import { EventEmitter } from 'events';
19
+ import type { ClaudeProcessEvents } from './claude-process.js';
20
+ import { type CodingProcess, type CodingProvider, type ProviderCapabilities } from './coding-process.js';
21
+ import type { PermissionMode } from './types.js';
22
+ /** OpenCode model info returned from /config/providers. */
23
+ export interface OpenCodeModelInfo {
24
+ id: string;
25
+ name: string;
26
+ providerID: string;
27
+ providerName: string;
28
+ }
29
+ /**
30
+ * Fetch the list of configured models from the running OpenCode server.
31
+ * Returns an empty array if the server is not running.
32
+ */
33
+ export declare function fetchOpenCodeModels(workingDir: string): Promise<{
34
+ models: OpenCodeModelInfo[];
35
+ defaults: Record<string, string>;
36
+ }>;
37
+ /** Stop the shared OpenCode server. */
38
+ export declare function stopOpenCodeServer(): void;
39
+ export interface OpenCodeProcessOptions {
40
+ /** Absolute path to the project directory. */
41
+ workingDir: string;
42
+ /** Codekin session ID (used for internal tracking). */
43
+ sessionId?: string;
44
+ /** OpenCode's own session ID (used for resume — returned by getSessionId()). */
45
+ opencodeSessionId?: string;
46
+ /** Model in provider/model format (e.g. 'anthropic/claude-sonnet-4'). */
47
+ model?: string;
48
+ /** Additional environment variables (CODEKIN_SESSION_ID, etc.). */
49
+ extraEnv?: Record<string, string>;
50
+ /** Permission mode — mapped to OpenCode's permission config. */
51
+ permissionMode?: PermissionMode;
52
+ }
53
+ export declare class OpenCodeProcess extends EventEmitter<ClaudeProcessEvents> implements CodingProcess {
54
+ readonly provider: CodingProvider;
55
+ readonly capabilities: ProviderCapabilities;
56
+ private sessionId;
57
+ private opencodeSessionId;
58
+ private workingDir;
59
+ private model?;
60
+ private alive;
61
+ private abortController;
62
+ private startupTimer;
63
+ private permissionMode?;
64
+ private tasks;
65
+ private turnComplete;
66
+ private taskSeq;
67
+ /** Whether we've received streaming delta events this turn (to avoid double-emitting text). */
68
+ private receivedDeltas;
69
+ /** Whether we've already emitted text via message.part.updated (to avoid re-emitting from message.updated). */
70
+ private emittedPartText;
71
+ /** Last user input text — used to detect and strip user echo from assistant deltas. */
72
+ private lastUserInput;
73
+ /** Buffer for initial text deltas — held until we can check for user echo prefix. */
74
+ private deltaBuffer;
75
+ /** Whether the delta buffer has been flushed (user echo check complete). */
76
+ private deltaBufferFlushed;
77
+ /** Accumulated reasoning delta text for emitting thinking summaries during streaming. */
78
+ private reasoningBuffer;
79
+ /** Whether we've already emitted a thinking summary from reasoning deltas. */
80
+ private emittedReasoningSummary;
81
+ constructor(workingDir: string, opts?: Partial<OpenCodeProcessOptions>);
82
+ /** Connect to the OpenCode server, create a session, and subscribe to SSE events. */
83
+ start(): void;
84
+ private initialize;
85
+ /** Subscribe to the OpenCode SSE event stream and map events to CodingProcess events. */
86
+ private subscribeToEvents;
87
+ /**
88
+ * Check whether an SSE event belongs to this process's OpenCode session.
89
+ * Returns true if the event should be processed, false if it should be skipped.
90
+ * Rejects events when opencodeSessionId is not yet set (init window) to prevent
91
+ * cross-session leakage on the shared SSE stream.
92
+ */
93
+ private isOwnSession;
94
+ /** Flush any buffered text deltas that haven't been emitted yet (e.g. turn ended before buffer threshold). */
95
+ private flushDeltaBuffer;
96
+ /** Map an OpenCode SSE event to CodingProcess events. */
97
+ private handleSSEEvent;
98
+ /** Reply to an OpenCode permission request via HTTP. */
99
+ private replyToPermission;
100
+ /**
101
+ * Detect TodoWrite/TaskCreate/TaskUpdate tool calls and emit todo_update events.
102
+ * Mirrors the task-tracking logic in ClaudeProcess.handleTaskTool().
103
+ */
104
+ private handleTaskTool;
105
+ /** Send a user message to the OpenCode session. */
106
+ sendMessage(content: string): void;
107
+ /** No-op for OpenCode — raw protocol data is Claude-specific. */
108
+ sendRaw(_: string): void;
109
+ /**
110
+ * Respond to a permission/control request.
111
+ * Maps Codekin's allow/deny to OpenCode's once/always/reject.
112
+ */
113
+ sendControlResponse(requestId: string, behavior: 'allow' | 'deny'): void;
114
+ /** Stop the OpenCode session and disconnect the SSE stream. */
115
+ stop(): void;
116
+ isAlive(): boolean;
117
+ isReady(): boolean;
118
+ getSessionId(): string;
119
+ waitForExit(timeoutMs?: number): Promise<void>;
120
+ }