hammoc 1.1.5 → 1.2.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 +8 -2
- package/bin/hammoc.js +12 -0
- package/package.json +3 -3
- package/packages/client/dist/assets/{index-BG1rX4_v.js → index-Bz_ljWO0.js} +1 -1
- package/packages/client/dist/assets/index-Cc_AX5QV.css +32 -0
- package/packages/client/dist/assets/index-DjVOQMst.js +1451 -0
- package/packages/client/dist/index.html +2 -2
- package/packages/client/dist/sw.js +1 -1
- package/packages/server/dist/app.d.ts.map +1 -1
- package/packages/server/dist/app.js +3 -0
- package/packages/server/dist/app.js.map +1 -1
- package/packages/server/dist/controllers/authController.d.ts +5 -0
- package/packages/server/dist/controllers/authController.d.ts.map +1 -1
- package/packages/server/dist/controllers/authController.js +61 -0
- package/packages/server/dist/controllers/authController.js.map +1 -1
- package/packages/server/dist/controllers/boardController.d.ts +2 -1
- package/packages/server/dist/controllers/boardController.d.ts.map +1 -1
- package/packages/server/dist/controllers/boardController.js +29 -4
- package/packages/server/dist/controllers/boardController.js.map +1 -1
- package/packages/server/dist/controllers/projectController.d.ts +6 -0
- package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
- package/packages/server/dist/controllers/projectController.js +62 -0
- package/packages/server/dist/controllers/projectController.js.map +1 -1
- package/packages/server/dist/controllers/queueController.d.ts +1 -0
- package/packages/server/dist/controllers/queueController.d.ts.map +1 -1
- package/packages/server/dist/controllers/queueController.js +12 -0
- package/packages/server/dist/controllers/queueController.js.map +1 -1
- package/packages/server/dist/controllers/queueTemplateController.d.ts.map +1 -1
- package/packages/server/dist/controllers/queueTemplateController.js +1 -15
- package/packages/server/dist/controllers/queueTemplateController.js.map +1 -1
- package/packages/server/dist/controllers/serverController.d.ts.map +1 -1
- package/packages/server/dist/controllers/serverController.js +83 -69
- package/packages/server/dist/controllers/serverController.js.map +1 -1
- package/packages/server/dist/controllers/sessionController.d.ts +5 -10
- package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
- package/packages/server/dist/controllers/sessionController.js +65 -75
- package/packages/server/dist/controllers/sessionController.js.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.d.ts +4 -0
- package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
- package/packages/server/dist/handlers/streamCallbacks.js +9 -3
- package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
- package/packages/server/dist/handlers/websocket.d.ts +9 -15
- package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
- package/packages/server/dist/handlers/websocket.js +672 -116
- package/packages/server/dist/handlers/websocket.js.map +1 -1
- package/packages/server/dist/locales/en/server.json +8 -2
- package/packages/server/dist/locales/es/server.json +311 -305
- package/packages/server/dist/locales/ja/server.json +311 -305
- package/packages/server/dist/locales/ko/server.json +8 -2
- package/packages/server/dist/locales/pt/server.json +311 -305
- package/packages/server/dist/locales/zh-CN/server.json +311 -305
- package/packages/server/dist/routes/auth.d.ts.map +1 -1
- package/packages/server/dist/routes/auth.js +2 -0
- package/packages/server/dist/routes/auth.js.map +1 -1
- package/packages/server/dist/routes/board.d.ts.map +1 -1
- package/packages/server/dist/routes/board.js +3 -1
- package/packages/server/dist/routes/board.js.map +1 -1
- package/packages/server/dist/routes/images.d.ts +7 -0
- package/packages/server/dist/routes/images.d.ts.map +1 -0
- package/packages/server/dist/routes/images.js +51 -0
- package/packages/server/dist/routes/images.js.map +1 -0
- package/packages/server/dist/routes/projects.d.ts.map +1 -1
- package/packages/server/dist/routes/projects.js +2 -0
- package/packages/server/dist/routes/projects.js.map +1 -1
- package/packages/server/dist/routes/queue.d.ts.map +1 -1
- package/packages/server/dist/routes/queue.js +2 -1
- package/packages/server/dist/routes/queue.js.map +1 -1
- package/packages/server/dist/routes/sessions.d.ts.map +1 -1
- package/packages/server/dist/routes/sessions.js +2 -3
- package/packages/server/dist/routes/sessions.js.map +1 -1
- package/packages/server/dist/services/bmadStatusService.d.ts.map +1 -1
- package/packages/server/dist/services/bmadStatusService.js +15 -25
- package/packages/server/dist/services/bmadStatusService.js.map +1 -1
- package/packages/server/dist/services/chatService.d.ts +2 -0
- package/packages/server/dist/services/chatService.d.ts.map +1 -1
- package/packages/server/dist/services/chatService.js +34 -1
- package/packages/server/dist/services/chatService.js.map +1 -1
- package/packages/server/dist/services/historyParser.d.ts +1 -11
- package/packages/server/dist/services/historyParser.d.ts.map +1 -1
- package/packages/server/dist/services/historyParser.js +144 -182
- package/packages/server/dist/services/historyParser.js.map +1 -1
- package/packages/server/dist/services/imageStorageService.d.ts +28 -0
- package/packages/server/dist/services/imageStorageService.d.ts.map +1 -0
- package/packages/server/dist/services/imageStorageService.js +108 -0
- package/packages/server/dist/services/imageStorageService.js.map +1 -0
- package/packages/server/dist/services/issueService.d.ts +10 -2
- package/packages/server/dist/services/issueService.d.ts.map +1 -1
- package/packages/server/dist/services/issueService.js +90 -23
- package/packages/server/dist/services/issueService.js.map +1 -1
- package/packages/server/dist/services/ptyService.d.ts +6 -0
- package/packages/server/dist/services/ptyService.d.ts.map +1 -1
- package/packages/server/dist/services/ptyService.js +59 -0
- package/packages/server/dist/services/ptyService.js.map +1 -1
- package/packages/server/dist/services/queueService.d.ts.map +1 -1
- package/packages/server/dist/services/queueService.js +23 -2
- package/packages/server/dist/services/queueService.js.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.d.ts +5 -0
- package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
- package/packages/server/dist/services/rateLimitProbeService.js +7 -0
- package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
- package/packages/server/dist/services/sessionBufferManager.d.ts +26 -0
- package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -0
- package/packages/server/dist/services/sessionBufferManager.js +113 -0
- package/packages/server/dist/services/sessionBufferManager.js.map +1 -0
- package/packages/server/dist/services/sessionService.d.ts +26 -1
- package/packages/server/dist/services/sessionService.d.ts.map +1 -1
- package/packages/server/dist/services/sessionService.js +236 -67
- package/packages/server/dist/services/sessionService.js.map +1 -1
- package/packages/server/dist/services/summarizeService.d.ts +25 -0
- package/packages/server/dist/services/summarizeService.d.ts.map +1 -0
- package/packages/server/dist/services/summarizeService.js +122 -0
- package/packages/server/dist/services/summarizeService.js.map +1 -0
- package/packages/server/dist/utils/imageUtils.d.ts +11 -0
- package/packages/server/dist/utils/imageUtils.d.ts.map +1 -0
- package/packages/server/dist/utils/imageUtils.js +37 -0
- package/packages/server/dist/utils/imageUtils.js.map +1 -0
- package/packages/server/dist/utils/messageTree.d.ts +56 -0
- package/packages/server/dist/utils/messageTree.d.ts.map +1 -0
- package/packages/server/dist/utils/messageTree.js +356 -0
- package/packages/server/dist/utils/messageTree.js.map +1 -0
- package/packages/server/package.json +3 -1
- package/packages/shared/dist/constants/index.d.ts +3 -0
- package/packages/shared/dist/constants/index.d.ts.map +1 -0
- package/packages/shared/dist/constants/index.js +3 -0
- package/packages/shared/dist/constants/index.js.map +1 -0
- package/packages/shared/dist/constants/messageTree.d.ts +6 -0
- package/packages/shared/dist/constants/messageTree.d.ts.map +1 -0
- package/packages/shared/dist/constants/messageTree.js +7 -0
- package/packages/shared/dist/constants/messageTree.js.map +1 -0
- package/packages/shared/dist/index.d.ts +2 -1
- package/packages/shared/dist/index.d.ts.map +1 -1
- package/packages/shared/dist/index.js +1 -1
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/types/auth.d.ts +15 -0
- package/packages/shared/dist/types/auth.d.ts.map +1 -1
- package/packages/shared/dist/types/auth.js.map +1 -1
- package/packages/shared/dist/types/bmadStatus.d.ts +1 -2
- package/packages/shared/dist/types/bmadStatus.d.ts.map +1 -1
- package/packages/shared/dist/types/bmadStatus.js.map +1 -1
- package/packages/shared/dist/types/history.d.ts +21 -8
- package/packages/shared/dist/types/history.d.ts.map +1 -1
- package/packages/shared/dist/types/message.d.ts +10 -0
- package/packages/shared/dist/types/message.d.ts.map +1 -1
- package/packages/shared/dist/types/message.js.map +1 -1
- package/packages/shared/dist/types/preferences.d.ts +5 -1
- package/packages/shared/dist/types/preferences.d.ts.map +1 -1
- package/packages/shared/dist/types/preferences.js.map +1 -1
- package/packages/shared/dist/types/queue.d.ts +3 -3
- package/packages/shared/dist/types/queue.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.d.ts +14 -0
- package/packages/shared/dist/types/sdk.d.ts.map +1 -1
- package/packages/shared/dist/types/sdk.js.map +1 -1
- package/packages/shared/dist/types/session.d.ts +1 -0
- package/packages/shared/dist/types/session.d.ts.map +1 -1
- package/packages/shared/dist/types/session.js.map +1 -1
- package/packages/shared/dist/types/websocket.d.ts +61 -3
- package/packages/shared/dist/types/websocket.d.ts.map +1 -1
- package/scripts/spike-25.9-output.log +47 -0
- package/packages/client/dist/assets/index-B1mDkqlY.css +0 -32
- package/packages/client/dist/assets/index-B_NOAvK3.js +0 -1380
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
import { SESSION_ERRORS } from '@hammoc/shared';
|
|
7
7
|
import { sessionService } from '../services/sessionService.js';
|
|
8
8
|
import { projectService } from '../services/projectService.js';
|
|
9
|
-
import {
|
|
10
|
-
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
const log = createLogger('sessionController');
|
|
11
|
+
import { getActiveStreamSessionIds, getJoinedSessionIdsByProject } from '../handlers/websocket.js';
|
|
11
12
|
export const sessionController = {
|
|
12
13
|
/**
|
|
13
14
|
* GET /api/projects/:projectSlug/sessions
|
|
@@ -59,14 +60,42 @@ export const sessionController = {
|
|
|
59
60
|
// Note: Empty array is a valid response (project exists but no sessions)
|
|
60
61
|
// Mark sessions that have an active background stream + merge session names
|
|
61
62
|
const activeIds = new Set(getActiveStreamSessionIds());
|
|
63
|
+
const joinedIds = getJoinedSessionIdsByProject(projectSlug);
|
|
62
64
|
const sessions = result.sessions;
|
|
63
65
|
const total = result.total;
|
|
66
|
+
// Merge socket-connected sessions that have no JSONL file yet.
|
|
67
|
+
// Only include on the first page (offset=0) and exclude from total/hasMore
|
|
68
|
+
// so pagination math stays consistent across pages.
|
|
69
|
+
const waitingSessions = [];
|
|
70
|
+
if (offset === 0) {
|
|
71
|
+
const now = new Date().toISOString();
|
|
72
|
+
for (const id of joinedIds) {
|
|
73
|
+
if (!sessionService.sessionFileExists(projectSlug, id)) {
|
|
74
|
+
waitingSessions.push({
|
|
75
|
+
sessionId: id,
|
|
76
|
+
firstPrompt: '',
|
|
77
|
+
messageCount: 0,
|
|
78
|
+
created: now,
|
|
79
|
+
modified: now,
|
|
80
|
+
isWaiting: true,
|
|
81
|
+
...(activeIds.has(id) && { isStreaming: true }),
|
|
82
|
+
...(sessionNames[id] && { name: sessionNames[id] }),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// isWaiting: socket-connected and not streaming (applies to all sessions)
|
|
88
|
+
// isStreaming: active stream running (takes priority over isWaiting visually)
|
|
64
89
|
const response = {
|
|
65
|
-
sessions:
|
|
66
|
-
...
|
|
67
|
-
...
|
|
68
|
-
|
|
69
|
-
|
|
90
|
+
sessions: [
|
|
91
|
+
...waitingSessions,
|
|
92
|
+
...sessions.map(s => ({
|
|
93
|
+
...s,
|
|
94
|
+
...(activeIds.has(s.sessionId) && { isStreaming: true }),
|
|
95
|
+
...(joinedIds.has(s.sessionId) && !activeIds.has(s.sessionId) && { isWaiting: true }),
|
|
96
|
+
...(sessionNames[s.sessionId] && { name: sessionNames[s.sessionId] }),
|
|
97
|
+
})),
|
|
98
|
+
],
|
|
70
99
|
total,
|
|
71
100
|
hasMore: limit > 0 ? (offset + sessions.length) < total : false,
|
|
72
101
|
};
|
|
@@ -81,74 +110,6 @@ export const sessionController = {
|
|
|
81
110
|
});
|
|
82
111
|
}
|
|
83
112
|
},
|
|
84
|
-
/**
|
|
85
|
-
* GET /api/projects/:projectSlug/sessions/:sessionId/messages
|
|
86
|
-
* Get session history messages with pagination
|
|
87
|
-
* [Source: Story 3.5 - Task 3]
|
|
88
|
-
*
|
|
89
|
-
* Query params:
|
|
90
|
-
* - limit: number (default: 50, max: 100)
|
|
91
|
-
* - offset: number (default: 0)
|
|
92
|
-
*/
|
|
93
|
-
async getMessages(req, res) {
|
|
94
|
-
const { projectSlug, sessionId } = req.params;
|
|
95
|
-
// Security validation: prevent path traversal
|
|
96
|
-
if (!sessionService.isValidPathParam(projectSlug) || !sessionService.isValidPathParam(sessionId)) {
|
|
97
|
-
res.status(SESSION_ERRORS.INVALID_PATH.httpStatus).json({
|
|
98
|
-
error: {
|
|
99
|
-
code: SESSION_ERRORS.INVALID_PATH.code,
|
|
100
|
-
message: req.t('session.error.invalidPath'),
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
// Parse and validate query params
|
|
107
|
-
const limit = Math.min(Math.max(parseInt(req.query.limit) || 50, 1), 100);
|
|
108
|
-
const offset = Math.max(parseInt(req.query.offset) || 0, 0);
|
|
109
|
-
// Snapshot stream state atomically BEFORE the async JSONL read.
|
|
110
|
-
// completedBuffer has a 5s TTL — if we read it after the await, it may
|
|
111
|
-
// have expired while streamStartedAt (captured here) still includes its
|
|
112
|
-
// startedAt, causing the JSONL filter to exclude messages that the merge
|
|
113
|
-
// can no longer provide.
|
|
114
|
-
const streamStartedAt = getStreamStartedAt(sessionId);
|
|
115
|
-
const runningStreamStartedAt = getRunningStreamStartedAt(sessionId);
|
|
116
|
-
const completedBuffer = getCompletedBuffer(sessionId);
|
|
117
|
-
const result = await sessionService.getSessionMessages(projectSlug, sessionId, {
|
|
118
|
-
limit,
|
|
119
|
-
offset,
|
|
120
|
-
streamStartedAt,
|
|
121
|
-
runningStreamStartedAt,
|
|
122
|
-
});
|
|
123
|
-
// Return empty messages for non-existent sessions (e.g., pre-allocated UUID with no messages yet)
|
|
124
|
-
const response = result ?? {
|
|
125
|
-
messages: [],
|
|
126
|
-
pagination: { total: 0, limit, offset, hasMore: false },
|
|
127
|
-
lastAgentCommand: null,
|
|
128
|
-
};
|
|
129
|
-
// Merge completed buffer messages when available (stream finished but
|
|
130
|
-
// JSONL may not yet be flushed). Only for the latest page (offset 0).
|
|
131
|
-
if (completedBuffer && offset === 0) {
|
|
132
|
-
const bufferMessages = transformBufferToHistoryMessages(completedBuffer);
|
|
133
|
-
if (bufferMessages.length > 0) {
|
|
134
|
-
const existingIds = new Set(response.messages.map(m => m.id));
|
|
135
|
-
const unique = bufferMessages.filter(m => !existingIds.has(m.id));
|
|
136
|
-
response.messages = [...response.messages, ...unique];
|
|
137
|
-
response.messages.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
138
|
-
response.pagination.total += unique.length;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
res.json(response);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
res.status(SESSION_ERRORS.SESSION_PARSE_ERROR.httpStatus).json({
|
|
145
|
-
error: {
|
|
146
|
-
code: SESSION_ERRORS.SESSION_PARSE_ERROR.code,
|
|
147
|
-
message: req.t('session.error.parseError'),
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
113
|
/**
|
|
153
114
|
* DELETE /api/projects/:projectSlug/sessions/:sessionId
|
|
154
115
|
* Delete a single session
|
|
@@ -249,5 +210,34 @@ export const sessionController = {
|
|
|
249
210
|
});
|
|
250
211
|
}
|
|
251
212
|
},
|
|
213
|
+
/**
|
|
214
|
+
* POST /api/projects/:projectSlug/sessions/cleanup-phantom
|
|
215
|
+
* Delete phantom sessions (JSONL files with only metadata, no conversation messages)
|
|
216
|
+
*/
|
|
217
|
+
async cleanupPhantom(req, res) {
|
|
218
|
+
const { projectSlug } = req.params;
|
|
219
|
+
if (!sessionService.isValidPathParam(projectSlug)) {
|
|
220
|
+
res.status(SESSION_ERRORS.INVALID_PATH.httpStatus).json({
|
|
221
|
+
error: {
|
|
222
|
+
code: SESSION_ERRORS.INVALID_PATH.code,
|
|
223
|
+
message: req.t('session.error.invalidPath'),
|
|
224
|
+
},
|
|
225
|
+
});
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const deleted = await sessionService.cleanupPhantomSessions(projectSlug);
|
|
230
|
+
log.info(`Phantom session cleanup: project=${projectSlug}, deleted=${deleted}`);
|
|
231
|
+
res.json({ deleted });
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
res.status(500).json({
|
|
235
|
+
error: {
|
|
236
|
+
code: 'CLEANUP_ERROR',
|
|
237
|
+
message: req.t('session.error.cleanupError', { defaultValue: 'Failed to clean up phantom sessions' }),
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
},
|
|
252
242
|
};
|
|
253
243
|
//# sourceMappingURL=sessionController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionController.js","sourceRoot":"","sources":["../../src/controllers/sessionController.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"sessionController.js","sourceRoot":"","sources":["../../src/controllers/sessionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,8 +30,12 @@ export interface CallbackBuilderDeps {
|
|
|
30
30
|
notificationService: NotificationRef;
|
|
31
31
|
/** Initial sessionId before SDK resolves the actual one (used as fallback in emit payloads) */
|
|
32
32
|
initialSessionId?: string;
|
|
33
|
+
/** Story 25.7: branch point UUID for edit — included in session:resumed so clients can truncate */
|
|
34
|
+
resumeSessionAt?: string;
|
|
33
35
|
/** Returns current queue progress when running inside queue executor */
|
|
34
36
|
getQueueProgress?: () => QueueProgress | undefined;
|
|
37
|
+
/** Story 25.11: when true, emit 'session:forked' instead of 'session:created'/'session:resumed' */
|
|
38
|
+
isFork?: boolean;
|
|
35
39
|
}
|
|
36
40
|
export interface CallbackBuilderHooks {
|
|
37
41
|
/** Called after SDK resolves session ID. Browser: disk write. Queue: state update. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamCallbacks.d.ts","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAOZ,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7F,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,mBAAmB,EAAE,eAAe,CAAC;IACrC,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"streamCallbacks.d.ts","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAOZ,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3C,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7F,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACrD;AAID,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACpE,mBAAmB,EAAE,eAAe,CAAC;IACrC,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mGAAmG;IACnG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,aAAa,GAAG,SAAS,CAAC;IACnD,mGAAmG;IACnG,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACnD,6EAA6E;IAC7E,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,eAAe,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,CAAC,EAAE,oBAAoB,GAC3B,WAAW,CAyHb"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { createLogger } from '../utils/logger.js';
|
|
9
9
|
const log = createLogger('streamCallbacks');
|
|
10
10
|
export function buildStreamCallbacks(deps, hooks) {
|
|
11
|
-
const { emit, stream, isResuming, rekeyStream, broadcastStreamChange, notificationService } = deps;
|
|
11
|
+
const { emit, stream, isResuming, resumeSessionAt, rekeyStream, broadcastStreamChange, notificationService, isFork } = deps;
|
|
12
12
|
const activity = hooks?.onCallbackActivity;
|
|
13
13
|
const sessionIdRef = { current: deps.initialSessionId };
|
|
14
14
|
const callbacks = {
|
|
@@ -16,8 +16,14 @@ export function buildStreamCallbacks(deps, hooks) {
|
|
|
16
16
|
log.debug(`Session initialized: ${sid} (model: ${metadata?.model ?? 'unknown'})`);
|
|
17
17
|
sessionIdRef.current = sid;
|
|
18
18
|
rekeyStream(sid);
|
|
19
|
-
if (
|
|
20
|
-
|
|
19
|
+
if (isFork) {
|
|
20
|
+
if (!deps.initialSessionId) {
|
|
21
|
+
log.warn('session:forked emitted without originalSessionId — fork request may be missing sessionId');
|
|
22
|
+
}
|
|
23
|
+
emit('session:forked', { sessionId: sid, originalSessionId: deps.initialSessionId || sid, model: metadata?.model });
|
|
24
|
+
}
|
|
25
|
+
else if (isResuming) {
|
|
26
|
+
emit('session:resumed', { sessionId: sid, model: metadata?.model, ...(resumeSessionAt ? { resumeSessionAt } : {}) });
|
|
21
27
|
}
|
|
22
28
|
else {
|
|
23
29
|
emit('session:created', { sessionId: sid, model: metadata?.model });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamCallbacks.js","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAYH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"streamCallbacks.js","sourceRoot":"","sources":["../../src/handlers/streamCallbacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { Server as HttpServer } from 'http';
|
|
8
8
|
import { Server as SocketIOServer, Socket } from 'socket.io';
|
|
9
|
-
import type { ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData } from '@hammoc/shared';
|
|
9
|
+
import type { ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData, ChatUsage } from '@hammoc/shared';
|
|
10
10
|
import { ChatService } from '../services/chatService.js';
|
|
11
11
|
type SocketType = Socket<ClientToServerEvents, ServerToClientEvents, InterServerEvents, SocketData>;
|
|
12
12
|
interface PendingPermission {
|
|
@@ -29,6 +29,11 @@ interface ActiveStream {
|
|
|
29
29
|
status: 'running' | 'completed' | 'error';
|
|
30
30
|
startedAt: number;
|
|
31
31
|
chatService?: ChatService;
|
|
32
|
+
resumeSessionAt?: string;
|
|
33
|
+
expectedBranchTotal?: number;
|
|
34
|
+
isFork?: boolean;
|
|
35
|
+
/** Deferred usage data — included in stream:complete-messages after JSONL flush */
|
|
36
|
+
deferredUsage?: ChatUsage;
|
|
32
37
|
}
|
|
33
38
|
/** Get session IDs of all currently running active streams */
|
|
34
39
|
export declare function getActiveStreamSessionIds(): string[];
|
|
@@ -36,19 +41,8 @@ export declare function getActiveStreamSessionIds(): string[];
|
|
|
36
41
|
export declare function getActiveSessionCountsByProject(): Map<string, number>;
|
|
37
42
|
/** Check if a specific session has a running active stream */
|
|
38
43
|
export declare function isSessionStreaming(sessionId: string): boolean;
|
|
39
|
-
/** Get
|
|
40
|
-
|
|
41
|
-
* returns the earlier one so fetchMessages excludes ALL stream-period messages.
|
|
42
|
-
* Both the completed turn and active turn are provided via buffer replay. */
|
|
43
|
-
export declare function getStreamStartedAt(sessionId: string): number | null;
|
|
44
|
-
/** Get start timestamp of the currently running stream only (ignores completed buffers). */
|
|
45
|
-
export declare function getRunningStreamStartedAt(sessionId: string): number | null;
|
|
46
|
-
/** Get the completed buffer for a session (null if none or expired). */
|
|
47
|
-
export declare function getCompletedBuffer(sessionId: string): Array<{
|
|
48
|
-
event: string;
|
|
49
|
-
data: unknown;
|
|
50
|
-
ts: number;
|
|
51
|
-
}> | null;
|
|
44
|
+
/** Get session IDs that have active socket connections for a given project */
|
|
45
|
+
export declare function getJoinedSessionIdsByProject(projectSlug: string): Set<string>;
|
|
52
46
|
/**
|
|
53
47
|
* Create a headless ActiveStream (no attached socket) for queue execution.
|
|
54
48
|
* Returns a buffered emit function and a broadcast function for project room delivery.
|
|
@@ -65,7 +59,7 @@ export declare function createHeadlessStream(sessionId: string, abortController:
|
|
|
65
59
|
export declare function rekeyStream(stream: ActiveStream, newSessionId: string): void;
|
|
66
60
|
/**
|
|
67
61
|
* Mark a stream as completed and broadcast stream-change.
|
|
68
|
-
*
|
|
62
|
+
* Story 27.1: Re-parses JSONL → replaces buffer → broadcasts stream:complete-messages.
|
|
69
63
|
*/
|
|
70
64
|
export declare function finalizeStream(sessionId: string): Promise<void>;
|
|
71
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/handlers/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/handlers/websocket.ts"],"names":[],"mappings":"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"}
|