@pellux/goodvibes-sdk 0.18.36 → 0.18.38
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/dist/_internal/platform/control-plane/gateway.d.ts +8 -1
- package/dist/_internal/platform/control-plane/gateway.d.ts.map +1 -1
- package/dist/_internal/platform/control-plane/gateway.js +41 -11
- package/dist/_internal/platform/core/conversation.d.ts +3 -0
- package/dist/_internal/platform/core/conversation.d.ts.map +1 -1
- package/dist/_internal/platform/core/conversation.js +24 -0
- package/dist/_internal/platform/providers/registry.d.ts +3 -0
- package/dist/_internal/platform/providers/registry.d.ts.map +1 -1
- package/dist/_internal/platform/providers/registry.js +17 -1
- package/dist/_internal/platform/runtime/bootstrap-services.d.ts +14 -0
- package/dist/_internal/platform/runtime/bootstrap-services.d.ts.map +1 -1
- package/dist/_internal/platform/runtime/bootstrap-services.js +2 -2
- package/dist/_internal/platform/security/user-auth.d.ts.map +1 -1
- package/dist/_internal/platform/security/user-auth.js +55 -0
- package/dist/_internal/platform/version.js +1 -1
- package/package.json +1 -1
|
@@ -42,10 +42,16 @@ export declare class ControlPlaneGateway {
|
|
|
42
42
|
private readonly liveClients;
|
|
43
43
|
private readonly websocketClients;
|
|
44
44
|
private readonly recentMessages;
|
|
45
|
-
private readonly
|
|
45
|
+
private readonly _recentEventsRing;
|
|
46
|
+
private _recentEventsHead;
|
|
47
|
+
private _recentEventsCount;
|
|
48
|
+
private readonly _recentEventsCapacity;
|
|
49
|
+
/** Back-compat accessor used by getSnapshot / listRecentEvents */
|
|
50
|
+
private get recentEvents();
|
|
46
51
|
private requestCount;
|
|
47
52
|
private errorCount;
|
|
48
53
|
private lastRequestAt;
|
|
54
|
+
private _syncScheduled;
|
|
49
55
|
constructor(config?: ControlPlaneGatewayConfig);
|
|
50
56
|
attachRuntime(config: {
|
|
51
57
|
readonly runtimeBus?: RuntimeEventBus | null;
|
|
@@ -88,6 +94,7 @@ export declare class ControlPlaneGateway {
|
|
|
88
94
|
private replayRecentTraffic;
|
|
89
95
|
createEventStream(request: Request, options?: ControlPlaneEventStreamOptions): Response;
|
|
90
96
|
renderWebUi(authTokenHint?: string): Response;
|
|
97
|
+
private _scheduleControlPlaneSync;
|
|
91
98
|
private rememberEvent;
|
|
92
99
|
}
|
|
93
100
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/gateway.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/control-plane/gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,11 +51,30 @@ export class ControlPlaneGateway {
|
|
|
51
51
|
liveClients = new Map();
|
|
52
52
|
websocketClients = new Map();
|
|
53
53
|
recentMessages = [];
|
|
54
|
-
|
|
54
|
+
// Circular ring buffer for O(1) insert instead of O(n) unshift.
|
|
55
|
+
_recentEventsRing;
|
|
56
|
+
_recentEventsHead = 0;
|
|
57
|
+
_recentEventsCount = 0;
|
|
58
|
+
_recentEventsCapacity = 500;
|
|
59
|
+
/** Back-compat accessor used by getSnapshot / listRecentEvents */
|
|
60
|
+
get recentEvents() {
|
|
61
|
+
const out = [];
|
|
62
|
+
const count = this._recentEventsCount;
|
|
63
|
+
const cap = this._recentEventsCapacity;
|
|
64
|
+
for (let i = 0; i < count; i++) {
|
|
65
|
+
const idx = (this._recentEventsHead - 1 - i + cap) % cap;
|
|
66
|
+
const entry = this._recentEventsRing[idx];
|
|
67
|
+
if (entry)
|
|
68
|
+
out.push(entry);
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
55
72
|
requestCount = 0;
|
|
56
73
|
errorCount = 0;
|
|
57
74
|
lastRequestAt;
|
|
75
|
+
_syncScheduled = false;
|
|
58
76
|
constructor(config = {}) {
|
|
77
|
+
this._recentEventsRing = new Array(this._recentEventsCapacity);
|
|
59
78
|
this.runtimeBus = config.runtimeBus ?? null;
|
|
60
79
|
this.dispatch = config.runtimeStore ? createDomainDispatch(config.runtimeStore) : null;
|
|
61
80
|
this.serverConfig = {
|
|
@@ -560,6 +579,20 @@ export class ControlPlaneGateway {
|
|
|
560
579
|
renderWebUi(authTokenHint = '') {
|
|
561
580
|
return renderControlPlaneGatewayWebUi(authTokenHint);
|
|
562
581
|
}
|
|
582
|
+
_scheduleControlPlaneSync(lastEventAt) {
|
|
583
|
+
if (this._syncScheduled || !this.dispatch)
|
|
584
|
+
return;
|
|
585
|
+
this._syncScheduled = true;
|
|
586
|
+
setImmediate(() => {
|
|
587
|
+
this._syncScheduled = false;
|
|
588
|
+
this.dispatch?.syncControlPlaneState({
|
|
589
|
+
requestCount: this.requestCount,
|
|
590
|
+
errorCount: this.errorCount,
|
|
591
|
+
lastRequestAt: this.lastRequestAt,
|
|
592
|
+
lastEventAt,
|
|
593
|
+
}, 'control-plane.gateway.event');
|
|
594
|
+
});
|
|
595
|
+
}
|
|
563
596
|
rememberEvent(event, payload) {
|
|
564
597
|
const record = {
|
|
565
598
|
id: `cpe-${randomUUID().slice(0, 8)}`,
|
|
@@ -567,16 +600,13 @@ export class ControlPlaneGateway {
|
|
|
567
600
|
createdAt: Date.now(),
|
|
568
601
|
payload,
|
|
569
602
|
};
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
lastRequestAt: this.lastRequestAt,
|
|
578
|
-
lastEventAt: record.createdAt,
|
|
579
|
-
}, 'control-plane.gateway.event');
|
|
603
|
+
// O(1) circular ring buffer write — no array shifting.
|
|
604
|
+
this._recentEventsRing[this._recentEventsHead] = record;
|
|
605
|
+
this._recentEventsHead = (this._recentEventsHead + 1) % this._recentEventsCapacity;
|
|
606
|
+
if (this._recentEventsCount < this._recentEventsCapacity)
|
|
607
|
+
this._recentEventsCount++;
|
|
608
|
+
// Debounced: coalesce N events/frame into 1 store sync.
|
|
609
|
+
this._scheduleControlPlaneSync(record.createdAt);
|
|
580
610
|
return record;
|
|
581
611
|
}
|
|
582
612
|
}
|
|
@@ -52,6 +52,9 @@ export declare class ConversationManager {
|
|
|
52
52
|
private currentBranch;
|
|
53
53
|
private streamingMessageIndex;
|
|
54
54
|
private undoStack;
|
|
55
|
+
private _messagesRevision;
|
|
56
|
+
private _cachedLLMMessages;
|
|
57
|
+
private _cachedLLMRevision;
|
|
55
58
|
constructor();
|
|
56
59
|
private findToolName;
|
|
57
60
|
setSessionMemoryStore(store: Pick<SessionMemoryStore, 'list'>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/core/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AAC7F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qDAAqD,CAAC;AAYjG,MAAM,MAAM,UAAU,GAAG;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACtE,gBAAgB,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,KAAK,OAAO,GAAG,2BAA2B,CAAC;AAC3C,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAqC;IACzD,OAAO,CAAC,kBAAkB,CAAiD;IAC3E,OAAO,CAAC,qBAAqB,CAE3B;IACF,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,SAAS,CAAmB;;
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/core/conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,9 @@ export class ConversationManager {
|
|
|
14
14
|
currentBranch = 'main';
|
|
15
15
|
streamingMessageIndex = -1;
|
|
16
16
|
undoStack = [];
|
|
17
|
+
_messagesRevision = 0;
|
|
18
|
+
_cachedLLMMessages = null;
|
|
19
|
+
_cachedLLMRevision = -1;
|
|
17
20
|
constructor() { }
|
|
18
21
|
findToolName(callId) {
|
|
19
22
|
for (let i = this.messages.length - 1; i >= 0; i--) {
|
|
@@ -39,6 +42,9 @@ export class ConversationManager {
|
|
|
39
42
|
return this.sessionLineageTracker;
|
|
40
43
|
}
|
|
41
44
|
getMessagesForLLM() {
|
|
45
|
+
if (this._cachedLLMMessages !== null && this._cachedLLMRevision === this._messagesRevision) {
|
|
46
|
+
return this._cachedLLMMessages;
|
|
47
|
+
}
|
|
42
48
|
const result = [];
|
|
43
49
|
for (const message of this.messages) {
|
|
44
50
|
if (message.role === 'system')
|
|
@@ -62,6 +68,8 @@ export class ConversationManager {
|
|
|
62
68
|
...(message.toolName ? { name: message.toolName } : {}),
|
|
63
69
|
});
|
|
64
70
|
}
|
|
71
|
+
this._cachedLLMMessages = result;
|
|
72
|
+
this._cachedLLMRevision = this._messagesRevision;
|
|
65
73
|
return result;
|
|
66
74
|
}
|
|
67
75
|
addUserMessage(content) {
|
|
@@ -71,6 +79,7 @@ export class ConversationManager {
|
|
|
71
79
|
this.messages.push({ role: 'user', content });
|
|
72
80
|
// Clear undo stack when new user input is added (can't redo past new input)
|
|
73
81
|
this.undoStack = [];
|
|
82
|
+
this._messagesRevision++;
|
|
74
83
|
}
|
|
75
84
|
addAssistantMessage(content, opts) {
|
|
76
85
|
this.messages.push({
|
|
@@ -83,6 +92,7 @@ export class ConversationManager {
|
|
|
83
92
|
model: opts?.model,
|
|
84
93
|
provider: opts?.provider,
|
|
85
94
|
});
|
|
95
|
+
this._messagesRevision++;
|
|
86
96
|
}
|
|
87
97
|
/**
|
|
88
98
|
* undo - Remove the last complete turn (the last user message and all subsequent
|
|
@@ -101,6 +111,7 @@ export class ConversationManager {
|
|
|
101
111
|
return false;
|
|
102
112
|
const turn = this.messages.splice(lastUserIdx);
|
|
103
113
|
this.undoStack.push(turn);
|
|
114
|
+
this._messagesRevision++;
|
|
104
115
|
return true;
|
|
105
116
|
}
|
|
106
117
|
/**
|
|
@@ -112,6 +123,7 @@ export class ConversationManager {
|
|
|
112
123
|
return false;
|
|
113
124
|
const turn = this.undoStack.pop();
|
|
114
125
|
this.messages.push(...turn);
|
|
126
|
+
this._messagesRevision++;
|
|
115
127
|
return true;
|
|
116
128
|
}
|
|
117
129
|
addToolResults(results) {
|
|
@@ -127,9 +139,11 @@ export class ConversationManager {
|
|
|
127
139
|
...(toolName ? { toolName } : {}),
|
|
128
140
|
});
|
|
129
141
|
}
|
|
142
|
+
this._messagesRevision++;
|
|
130
143
|
}
|
|
131
144
|
addSystemMessage(content) {
|
|
132
145
|
this.messages.push({ role: 'system', content });
|
|
146
|
+
this._messagesRevision++;
|
|
133
147
|
}
|
|
134
148
|
getLastUserMessage() {
|
|
135
149
|
for (let i = this.messages.length - 1; i >= 0; i--) {
|
|
@@ -146,12 +160,14 @@ export class ConversationManager {
|
|
|
146
160
|
removeMessagesAfter(count) {
|
|
147
161
|
if (count < this.messages.length) {
|
|
148
162
|
this.messages.length = count;
|
|
163
|
+
this._messagesRevision++;
|
|
149
164
|
}
|
|
150
165
|
}
|
|
151
166
|
markLastUserMessageCancelled() {
|
|
152
167
|
for (let i = this.messages.length - 1; i >= 0; i--) {
|
|
153
168
|
if (this.messages[i].role === 'user') {
|
|
154
169
|
this.messages[i].cancelled = true;
|
|
170
|
+
this._messagesRevision++;
|
|
155
171
|
return;
|
|
156
172
|
}
|
|
157
173
|
}
|
|
@@ -159,6 +175,7 @@ export class ConversationManager {
|
|
|
159
175
|
startStreamingBlock() {
|
|
160
176
|
this.messages.push({ role: 'assistant', content: '' });
|
|
161
177
|
this.streamingMessageIndex = this.messages.length - 1;
|
|
178
|
+
this._messagesRevision++;
|
|
162
179
|
}
|
|
163
180
|
updateStreamingBlock(content) {
|
|
164
181
|
if (this.streamingMessageIndex < 0)
|
|
@@ -166,6 +183,7 @@ export class ConversationManager {
|
|
|
166
183
|
const message = this.messages[this.streamingMessageIndex];
|
|
167
184
|
if (message?.role === 'assistant') {
|
|
168
185
|
message.content = content;
|
|
186
|
+
this._messagesRevision++;
|
|
169
187
|
}
|
|
170
188
|
}
|
|
171
189
|
finalizeStreamingBlock() {
|
|
@@ -173,6 +191,7 @@ export class ConversationManager {
|
|
|
173
191
|
this.messages.splice(this.streamingMessageIndex, 1);
|
|
174
192
|
}
|
|
175
193
|
this.streamingMessageIndex = -1;
|
|
194
|
+
this._messagesRevision++;
|
|
176
195
|
}
|
|
177
196
|
getMessageSnapshot() {
|
|
178
197
|
return cloneMessages(this.messages);
|
|
@@ -184,6 +203,7 @@ export class ConversationManager {
|
|
|
184
203
|
const systemMessages = this.messages.filter((message) => message.role === 'system');
|
|
185
204
|
this.messages = [...systemMessages, ...messagesToInternal(newMessages)];
|
|
186
205
|
this.streamingMessageIndex = -1;
|
|
206
|
+
this._messagesRevision++;
|
|
187
207
|
}
|
|
188
208
|
async compact(registry, modelId, trigger = 'manual', provider, context) {
|
|
189
209
|
return compactConversation(this, registry, modelId, trigger, provider, context);
|
|
@@ -212,6 +232,7 @@ export class ConversationManager {
|
|
|
212
232
|
this.currentBranch = 'main';
|
|
213
233
|
this.streamingMessageIndex = -1;
|
|
214
234
|
this.undoStack = [];
|
|
235
|
+
this._messagesRevision++;
|
|
215
236
|
}
|
|
216
237
|
forkBranch(name, force = false) {
|
|
217
238
|
const branchName = name?.trim() || `branch-${Date.now()}`;
|
|
@@ -240,6 +261,7 @@ export class ConversationManager {
|
|
|
240
261
|
this.messages = cloneMessages(stored);
|
|
241
262
|
this.currentBranch = name;
|
|
242
263
|
this.streamingMessageIndex = -1;
|
|
264
|
+
this._messagesRevision++;
|
|
243
265
|
return true;
|
|
244
266
|
}
|
|
245
267
|
mergeBranch(name) {
|
|
@@ -251,6 +273,7 @@ export class ConversationManager {
|
|
|
251
273
|
if (toAppend.length === 0)
|
|
252
274
|
return true;
|
|
253
275
|
this.messages.push(...cloneMessages(toAppend));
|
|
276
|
+
this._messagesRevision++;
|
|
254
277
|
return true;
|
|
255
278
|
}
|
|
256
279
|
getCurrentBranch() {
|
|
@@ -275,6 +298,7 @@ export class ConversationManager {
|
|
|
275
298
|
this.branches = restoreBranchMap(data.branches);
|
|
276
299
|
this.currentBranch = data.currentBranch ?? 'main';
|
|
277
300
|
this.streamingMessageIndex = -1;
|
|
301
|
+
this._messagesRevision++;
|
|
278
302
|
}
|
|
279
303
|
}
|
|
280
304
|
export { parseDiffForApply, applyDiffContent } from './conversation-diff.js';
|
|
@@ -35,6 +35,8 @@ export declare class ProviderRegistry {
|
|
|
35
35
|
private catalogModels;
|
|
36
36
|
private pricingCatalog;
|
|
37
37
|
private syntheticCanonicalModels;
|
|
38
|
+
private _cachedModelRegistry;
|
|
39
|
+
private _modelRegistryRevision;
|
|
38
40
|
constructor(options: ProviderRegistryOptions);
|
|
39
41
|
private registerBuiltins;
|
|
40
42
|
private getPersistenceRoot;
|
|
@@ -44,6 +46,7 @@ export declare class ProviderRegistry {
|
|
|
44
46
|
private getSyntheticBuiltins;
|
|
45
47
|
private updateCatalogState;
|
|
46
48
|
private getSuppressedCatalogModelIds;
|
|
49
|
+
private _invalidateModelRegistry;
|
|
47
50
|
private getModelRegistry;
|
|
48
51
|
/** Register a provider. Overwrites any existing entry with the same name. */
|
|
49
52
|
register(provider: LLMProvider): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAA+B,MAAM,gBAAgB,CAAC;AAGxG,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAcL,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAE5B,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAgBrD,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,2BAA2B,EAC3B,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAwC;IACnF,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0E;IACxG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8F;IAClI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoE;IACnG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAsC;IACnF,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,wBAAwB,CAAwB;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAA+B,MAAM,gBAAgB,CAAC;AAGxG,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AAIzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAcL,KAAK,YAAY,EAEjB,KAAK,sBAAsB,EAE5B,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAgBrD,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,2BAA2B,EAC3B,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAwC;IACnF,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA0E;IACxG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8F;IAClI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoE;IACnG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAsC;IACnF,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,wBAAwB,CAAwB;IACxD,OAAO,CAAC,oBAAoB,CAAkC;IAC9D,OAAO,CAAC,sBAAsB,CAAK;gBAEvB,OAAO,EAAE,uBAAuB;IAqB5C,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,oBAAoB;IAQ5B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,wBAAwB;IAKhC,OAAO,CAAC,gBAAgB;IAaxB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAKrC;;;;OAIG;IACH,uBAAuB,CAAC,YAAY,EAAE,2BAA2B,GAAG,MAAM,IAAI;IA6B9E,aAAa,IAAI,SAAS,WAAW,EAAE;IAIvC;;;;OAIG;IACH,2BAA2B,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,IAAI;IA8C9D,wDAAwD;IACxD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAQ9B,qFAAqF;IACrF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAYlC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAM5E;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW;IAY5D,wCAAwC;IACxC,UAAU,IAAI,eAAe,EAAE;IAI/B,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQtE,wBAAwB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM;IAI3D,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAAC,WAAW,CAAC;IAIxE,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIpG,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAIhF,eAAe,IAAI,IAAI;IAIvB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC;IAIrC,mBAAmB,IAAI,SAAS,YAAY,EAAE;IAI9C,0BAA0B,IAAI,SAAS,sBAAsB,EAAE;IAI/D,4BAA4B,IAAI,SAAS,sBAAsB,EAAE;IAIjE,2BAA2B,IAAI,SAAS,cAAc,EAAE;IAIxD,2BAA2B,IAAI,GAAG,CAAC,MAAM,CAAC;IAI1C,gCAAgC,CAAC,OAAO,EAAE,MAAM;IAQhD,wBAAwB,IAAI,MAAM,EAAE;IAwCpC,8CAA8C;IAC9C,mBAAmB,IAAI,eAAe,EAAE;IAIxC,yCAAyC;IACzC,eAAe,IAAI,eAAe;IAiClC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAwB1D,mGAAmG;IACnG,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQtC;;;;OAIG;IACG,mBAAmB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAmDnH;;;;OAIG;IACH,aAAa,CAAC,UAAU,GAAE,eAAe,GAAG,IAAW,GAAG,IAAI;IA2B9D,wDAAwD;IACxD,YAAY,IAAI,IAAI;IAOpB;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB;;;OAGG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAWpE;;;;;;OAMG;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB;IAK1D;;;;;;;OAOG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,gBAAgB;IAKxE;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAmB5B,6FAA6F;IAC7F,mBAAmB,IAAI,IAAI;IAe3B,WAAW,IAAI,IAAI;IAcb,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBtC"}
|
|
@@ -43,6 +43,8 @@ export class ProviderRegistry {
|
|
|
43
43
|
catalogModels = [];
|
|
44
44
|
pricingCatalog = null;
|
|
45
45
|
syntheticCanonicalModels = [];
|
|
46
|
+
_cachedModelRegistry = null;
|
|
47
|
+
_modelRegistryRevision = 0;
|
|
46
48
|
constructor(options) {
|
|
47
49
|
this.configManager = options.configManager;
|
|
48
50
|
this.subscriptionManager = options.subscriptionManager;
|
|
@@ -98,12 +100,19 @@ export class ProviderRegistry {
|
|
|
98
100
|
this.catalogModels = [...models];
|
|
99
101
|
this.pricingCatalog = { fetchedAt: Date.now(), models: this.catalogModels };
|
|
100
102
|
this.syntheticCanonicalModels = buildSyntheticCanonicalModels(this.catalogModels);
|
|
103
|
+
this._invalidateModelRegistry();
|
|
101
104
|
}
|
|
102
105
|
getSuppressedCatalogModelIds() {
|
|
103
106
|
return new Set([...this.runtimeCatalogSuppressions.values()].flat());
|
|
104
107
|
}
|
|
108
|
+
_invalidateModelRegistry() {
|
|
109
|
+
this._cachedModelRegistry = null;
|
|
110
|
+
this._modelRegistryRevision++;
|
|
111
|
+
}
|
|
105
112
|
getModelRegistry() {
|
|
106
|
-
|
|
113
|
+
if (this._cachedModelRegistry !== null)
|
|
114
|
+
return this._cachedModelRegistry;
|
|
115
|
+
this._cachedModelRegistry = buildModelRegistry({
|
|
107
116
|
customModels: this.customModels,
|
|
108
117
|
runtimeModels: this.runtimeModels,
|
|
109
118
|
syntheticModels: this.getSyntheticBuiltins(),
|
|
@@ -111,10 +120,12 @@ export class ProviderRegistry {
|
|
|
111
120
|
discoveredModels: this.discoveredModels,
|
|
112
121
|
suppressedCatalogIds: this.getSuppressedCatalogModelIds(),
|
|
113
122
|
});
|
|
123
|
+
return this._cachedModelRegistry;
|
|
114
124
|
}
|
|
115
125
|
/** Register a provider. Overwrites any existing entry with the same name. */
|
|
116
126
|
register(provider) {
|
|
117
127
|
this.providers.set(provider.name, provider);
|
|
128
|
+
this._invalidateModelRegistry();
|
|
118
129
|
}
|
|
119
130
|
/**
|
|
120
131
|
* Register a runtime/plugin-owned provider and optional model definitions.
|
|
@@ -138,6 +149,7 @@ export class ProviderRegistry {
|
|
|
138
149
|
];
|
|
139
150
|
this.runtimeCatalogSuppressions.set(provider.name, [...new Set(suppressCatalogModels)]);
|
|
140
151
|
this.capabilityRegistry.invalidate();
|
|
152
|
+
this._invalidateModelRegistry();
|
|
141
153
|
return () => {
|
|
142
154
|
if (!this.runtimeProviderNames.has(provider.name))
|
|
143
155
|
return;
|
|
@@ -146,6 +158,7 @@ export class ProviderRegistry {
|
|
|
146
158
|
this.runtimeModels = this.runtimeModels.filter((model) => model.provider !== provider.name);
|
|
147
159
|
this.runtimeCatalogSuppressions.delete(provider.name);
|
|
148
160
|
this.capabilityRegistry.invalidate();
|
|
161
|
+
this._invalidateModelRegistry();
|
|
149
162
|
};
|
|
150
163
|
}
|
|
151
164
|
listProviders() {
|
|
@@ -163,6 +176,7 @@ export class ProviderRegistry {
|
|
|
163
176
|
}
|
|
164
177
|
this.discoveredProviderNames.clear();
|
|
165
178
|
this.discoveredModels = [];
|
|
179
|
+
this._invalidateModelRegistry();
|
|
166
180
|
for (const server of servers) {
|
|
167
181
|
// Skip if a non-discovered provider already holds this name
|
|
168
182
|
if (this.providers.has(server.name))
|
|
@@ -388,6 +402,7 @@ export class ProviderRegistry {
|
|
|
388
402
|
contextWindow: cap,
|
|
389
403
|
contextWindowProvenance: 'configured_cap',
|
|
390
404
|
};
|
|
405
|
+
this._invalidateModelRegistry();
|
|
391
406
|
return;
|
|
392
407
|
}
|
|
393
408
|
logger.warn('[registry] setModelContextCap: model not found', { registryKey });
|
|
@@ -450,6 +465,7 @@ export class ProviderRegistry {
|
|
|
450
465
|
}
|
|
451
466
|
// Swap custom models
|
|
452
467
|
this.customModels = result.models;
|
|
468
|
+
this._invalidateModelRegistry();
|
|
453
469
|
return { warnings: result.warnings, added, removed, updated };
|
|
454
470
|
}
|
|
455
471
|
/**
|
|
@@ -22,6 +22,20 @@ interface ServiceFactories {
|
|
|
22
22
|
startupTimeoutMs?: number;
|
|
23
23
|
probeDaemonPortInUse?: (host: string, port: number) => Promise<boolean>;
|
|
24
24
|
probeHttpListenerPortInUse?: (host: string, port: number) => Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Shared bearer token the daemon should accept on inbound HTTP requests.
|
|
27
|
+
* When set, `daemon.enable()` registers this token and requests carrying
|
|
28
|
+
* `Authorization: Bearer <token>` authenticate without a login session.
|
|
29
|
+
* Surfaces that generate companion-app pairing tokens should pass the token
|
|
30
|
+
* here so the embedded daemon accepts scanned QR credentials.
|
|
31
|
+
*/
|
|
32
|
+
sharedDaemonToken?: string;
|
|
33
|
+
/**
|
|
34
|
+
* Shared bearer token for the HTTP listener (webhook-style surfaces).
|
|
35
|
+
* Independent from `sharedDaemonToken`; different surfaces may issue
|
|
36
|
+
* different tokens, or both may share the same bearer.
|
|
37
|
+
*/
|
|
38
|
+
sharedHttpListenerToken?: string;
|
|
25
39
|
}
|
|
26
40
|
export interface HostServicesHandle {
|
|
27
41
|
readonly daemonServer: DaemonService | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-services.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/runtime/bootstrap-services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOrD,UAAU,aAAa;IACrB,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,OAAO,6BAA6B,EAAE,uBAAuB,EAAE,CAAC;CACvH;AAED,UAAU,mBAAmB;IAC3B,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,kBAAkB,CAAC,EAAE,CACnB,UAAU,EAAE,eAAe,EAC3B,QAAQ,EAAE,eAAe,CAAC,sBAAsB,CAAC,EACjD,eAAe,EAAE,eAAe,KAC7B,aAAa,CAAC;IACnB,kBAAkB,CAAC,EAAE,CACnB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,eAAe,CAAC,sBAAsB,CAAC,EACjD,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,KAC5C,mBAAmB,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap-services.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/runtime/bootstrap-services.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAOrD,UAAU,aAAa;IACrB,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,OAAO,6BAA6B,EAAE,uBAAuB,EAAE,CAAC;CACvH;AAED,UAAU,mBAAmB;IAC3B,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,kBAAkB,CAAC,EAAE,CACnB,UAAU,EAAE,eAAe,EAC3B,QAAQ,EAAE,eAAe,CAAC,sBAAsB,CAAC,EACjD,eAAe,EAAE,eAAe,KAC7B,aAAa,CAAC;IACnB,kBAAkB,CAAC,EAAE,CACnB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,eAAe,CAAC,sBAAsB,CAAC,EACjD,aAAa,EAAE,eAAe,CAAC,eAAe,CAAC,KAC5C,mBAAmB,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxE,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9E;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,YAAY,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClD,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,OAAO,6BAA6B,EAAE,uBAAuB,EAAE,CAAC;IACtH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CACD,GAAG,EACC,eAAe,GACf,qBAAqB,GACrB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACtB,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;CAC9B;AAmDD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,eAAe,EAC3B,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,gBAAgB,YAAK,EAChC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAoF7B;AAED,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AACxD,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AACxD,eAAO,MAAM,qBAAqB,0BAAoB,CAAC"}
|
|
@@ -70,7 +70,7 @@ export async function startHostServices(config, runtimeBus, hookDispatcher, fact
|
|
|
70
70
|
}
|
|
71
71
|
else {
|
|
72
72
|
daemonServer = createDaemonServer(runtimeBus, sharedUserAuth, runtimeServices);
|
|
73
|
-
daemonServer.enable({ daemon: true });
|
|
73
|
+
daemonServer.enable({ daemon: true }, factories.sharedDaemonToken);
|
|
74
74
|
try {
|
|
75
75
|
const service = daemonServer;
|
|
76
76
|
const result = await startWithTimeout('Daemon server', () => service.start(), startupTimeoutMs, () => service.stop());
|
|
@@ -99,7 +99,7 @@ export async function startHostServices(config, runtimeBus, hookDispatcher, fact
|
|
|
99
99
|
}
|
|
100
100
|
else {
|
|
101
101
|
httpListener = createHttpListener(hookDispatcher, sharedUserAuth, runtimeServices.configManager);
|
|
102
|
-
httpListener.enable({ httpListener: true });
|
|
102
|
+
httpListener.enable({ httpListener: true }, factories.sharedHttpListenerToken);
|
|
103
103
|
try {
|
|
104
104
|
const service = httpListener;
|
|
105
105
|
const result = await startWithTimeout('HTTP listener', () => service.start(), startupTimeoutMs, () => service.stop());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/security/user-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/security/user-auth.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAUD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;IAC7C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AAwJD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAE3B,MAAM,EAAE,cAAc;IAqBlC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI7C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAMjE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAShD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAY5C,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUlD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIrC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAW/C,SAAS,IAAI,cAAc,EAAE;IAS7B,YAAY,IAAI,iBAAiB,EAAE;IAOnC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAc,GAAG,cAAc;IAejG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAarC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAgB5D,OAAO,IAAI,iBAAiB;IAc5B,4BAA4B,IAAI,OAAO;IAMvC,0BAA0B,IAAI,MAAM;IAIpC,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,OAAO;CAIhB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomBytes, scryptSync, timingSafeEqual } from 'crypto';
|
|
2
2
|
import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
|
+
import { logger } from '../utils/logger.js';
|
|
4
5
|
const DEFAULT_SESSION_TTL_MS = 3_600_000;
|
|
5
6
|
const SCRYPT_KEY_LENGTH = 64;
|
|
6
7
|
function toBase64(value) {
|
|
@@ -85,6 +86,54 @@ function loadOrBootstrapUsers(filePath, credentialPath) {
|
|
|
85
86
|
writeBootstrapCredentialFile(credentialPath, username, initialPassword);
|
|
86
87
|
return users;
|
|
87
88
|
}
|
|
89
|
+
function readBootstrapCredentialFile(filePath) {
|
|
90
|
+
try {
|
|
91
|
+
if (!existsSync(filePath))
|
|
92
|
+
return null;
|
|
93
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
94
|
+
let username;
|
|
95
|
+
let password;
|
|
96
|
+
for (const rawLine of raw.split('\n')) {
|
|
97
|
+
const line = rawLine.trim();
|
|
98
|
+
if (line.startsWith('username='))
|
|
99
|
+
username = line.slice('username='.length);
|
|
100
|
+
else if (line.startsWith('password='))
|
|
101
|
+
password = line.slice('password='.length);
|
|
102
|
+
}
|
|
103
|
+
if (!username || !password)
|
|
104
|
+
return null;
|
|
105
|
+
return { username, password };
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detects when the bootstrap credential file has drifted from the persisted
|
|
113
|
+
* user store — typically after someone manually edits `auth-bootstrap.txt`
|
|
114
|
+
* without rotating the password through the UserAuthManager. The daemon's
|
|
115
|
+
* /login route will reject the edited password because the hash in
|
|
116
|
+
* `auth-users.json` no longer matches. Left silent, this wastes hours of
|
|
117
|
+
* debugging; loudly warning is cheap.
|
|
118
|
+
*/
|
|
119
|
+
function detectBootstrapCredentialDrift(users, credentialPath, userStorePath) {
|
|
120
|
+
const credential = readBootstrapCredentialFile(credentialPath);
|
|
121
|
+
if (!credential)
|
|
122
|
+
return;
|
|
123
|
+
const storedUser = users.find((user) => user.username === credential.username);
|
|
124
|
+
if (!storedUser) {
|
|
125
|
+
logger.warn('Bootstrap credential file references a user not present in the auth store; /login with this username will fail', { credentialPath, userStorePath, username: credential.username });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!verifyPassword(credential.password, storedUser.passwordHash)) {
|
|
129
|
+
logger.warn('Bootstrap credential file password does not match the stored hash; /login with this password will fail. Rotate the password via UserAuthManager.rotatePassword() or regenerate the credential by deleting both files so they are re-created in sync.', {
|
|
130
|
+
credentialPath,
|
|
131
|
+
userStorePath,
|
|
132
|
+
username: credential.username,
|
|
133
|
+
hint: 'Manual edits to auth-bootstrap.txt do not update auth-users.json. The bootstrap file is an output, not an input.',
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
88
137
|
export class UserAuthManager {
|
|
89
138
|
users = new Map();
|
|
90
139
|
sessions = new Map();
|
|
@@ -105,6 +154,12 @@ export class UserAuthManager {
|
|
|
105
154
|
for (const user of seedUsers) {
|
|
106
155
|
this.users.set(user.username, user);
|
|
107
156
|
}
|
|
157
|
+
// Only run drift detection when we own the file-backed store — test
|
|
158
|
+
// configs that pass explicit `users` opt out of filesystem bootstrap and
|
|
159
|
+
// should not trigger spurious warnings.
|
|
160
|
+
if (this.persistUsers) {
|
|
161
|
+
detectBootstrapCredentialDrift(seedUsers, this.bootstrapCredentialPath, this.userStorePath);
|
|
162
|
+
}
|
|
108
163
|
}
|
|
109
164
|
static hashPassword(password) {
|
|
110
165
|
return hashPassword(password);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
let version = '0.18.
|
|
3
|
+
let version = '0.18.38';
|
|
4
4
|
try {
|
|
5
5
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
|
|
6
6
|
version = pkg.version ?? version;
|