@felan-ai/daemon 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/NOTICE +69 -0
- package/README.md +61 -2
- package/dist/client.d.ts +5 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +4 -0
- package/dist/client.js.map +1 -0
- package/dist/daemon/admission.d.ts +39 -0
- package/dist/daemon/admission.d.ts.map +1 -0
- package/dist/daemon/admission.js +175 -0
- package/dist/daemon/admission.js.map +1 -0
- package/dist/daemon/agent-logs.d.ts +11 -0
- package/dist/daemon/agent-logs.d.ts.map +1 -0
- package/dist/daemon/agent-logs.js +31 -0
- package/dist/daemon/agent-logs.js.map +1 -0
- package/dist/daemon/bootstrap.d.ts +7 -0
- package/dist/daemon/bootstrap.d.ts.map +1 -0
- package/dist/daemon/bootstrap.js +4 -0
- package/dist/daemon/bootstrap.js.map +1 -0
- package/dist/daemon/broker.d.ts +94 -0
- package/dist/daemon/broker.d.ts.map +1 -0
- package/dist/daemon/broker.js +374 -0
- package/dist/daemon/broker.js.map +1 -0
- package/dist/daemon/commands.d.ts +47 -0
- package/dist/daemon/commands.d.ts.map +1 -0
- package/dist/daemon/commands.js +639 -0
- package/dist/daemon/commands.js.map +1 -0
- package/dist/daemon/control-recovery.d.ts +9 -0
- package/dist/daemon/control-recovery.d.ts.map +1 -0
- package/dist/daemon/control-recovery.js +68 -0
- package/dist/daemon/control-recovery.js.map +1 -0
- package/dist/daemon/control-state.d.ts +1915 -0
- package/dist/daemon/control-state.d.ts.map +1 -0
- package/dist/daemon/control-state.js +154 -0
- package/dist/daemon/control-state.js.map +1 -0
- package/dist/daemon/control-store.d.ts +113 -0
- package/dist/daemon/control-store.d.ts.map +1 -0
- package/dist/daemon/control-store.js +901 -0
- package/dist/daemon/control-store.js.map +1 -0
- package/dist/daemon/execution-policy.d.ts +15 -0
- package/dist/daemon/execution-policy.d.ts.map +1 -0
- package/dist/daemon/execution-policy.js +42 -0
- package/dist/daemon/execution-policy.js.map +1 -0
- package/dist/daemon/execution-services.d.ts +5 -0
- package/dist/daemon/execution-services.d.ts.map +1 -0
- package/dist/daemon/execution-services.js +73 -0
- package/dist/daemon/execution-services.js.map +1 -0
- package/dist/daemon/executions.d.ts +134 -0
- package/dist/daemon/executions.d.ts.map +1 -0
- package/dist/daemon/executions.js +486 -0
- package/dist/daemon/executions.js.map +1 -0
- package/dist/daemon/extension-ui.d.ts +24 -0
- package/dist/daemon/extension-ui.d.ts.map +1 -0
- package/dist/daemon/extension-ui.js +161 -0
- package/dist/daemon/extension-ui.js.map +1 -0
- package/dist/daemon/fanout.d.ts +40 -0
- package/dist/daemon/fanout.d.ts.map +1 -0
- package/dist/daemon/fanout.js +304 -0
- package/dist/daemon/fanout.js.map +1 -0
- package/dist/daemon/headless-json.d.ts +3 -0
- package/dist/daemon/headless-json.d.ts.map +1 -0
- package/dist/daemon/headless-json.js +20 -0
- package/dist/daemon/headless-json.js.map +1 -0
- package/dist/daemon/host-config.d.ts +61 -0
- package/dist/daemon/host-config.d.ts.map +1 -0
- package/dist/daemon/host-config.js +167 -0
- package/dist/daemon/host-config.js.map +1 -0
- package/dist/daemon/host-services.d.ts +61 -0
- package/dist/daemon/host-services.d.ts.map +1 -0
- package/dist/daemon/host-services.js +2 -0
- package/dist/daemon/host-services.js.map +1 -0
- package/dist/daemon/ipc.d.ts +14 -0
- package/dist/daemon/ipc.d.ts.map +1 -0
- package/dist/daemon/ipc.js +233 -0
- package/dist/daemon/ipc.js.map +1 -0
- package/dist/daemon/legacy-sessions.d.ts +48 -0
- package/dist/daemon/legacy-sessions.d.ts.map +1 -0
- package/dist/daemon/legacy-sessions.js +328 -0
- package/dist/daemon/legacy-sessions.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +44 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +164 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/main.d.ts +3 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +83 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/message-display.d.ts +4 -0
- package/dist/daemon/message-display.d.ts.map +1 -0
- package/dist/daemon/message-display.js +20 -0
- package/dist/daemon/message-display.js.map +1 -0
- package/dist/daemon/native-ownership.d.ts +13 -0
- package/dist/daemon/native-ownership.d.ts.map +1 -0
- package/dist/daemon/native-ownership.js +173 -0
- package/dist/daemon/native-ownership.js.map +1 -0
- package/dist/daemon/operational-log.d.ts +23 -0
- package/dist/daemon/operational-log.d.ts.map +1 -0
- package/dist/daemon/operational-log.js +79 -0
- package/dist/daemon/operational-log.js.map +1 -0
- package/dist/daemon/ownership.d.ts +35 -0
- package/dist/daemon/ownership.d.ts.map +1 -0
- package/dist/daemon/ownership.js +395 -0
- package/dist/daemon/ownership.js.map +1 -0
- package/dist/daemon/persistence.d.ts +110 -0
- package/dist/daemon/persistence.d.ts.map +1 -0
- package/dist/daemon/persistence.js +540 -0
- package/dist/daemon/persistence.js.map +1 -0
- package/dist/daemon/process-adapter.d.ts +23 -0
- package/dist/daemon/process-adapter.d.ts.map +1 -0
- package/dist/daemon/process-adapter.js +2 -0
- package/dist/daemon/process-adapter.js.map +1 -0
- package/dist/daemon/processes.d.ts +102 -0
- package/dist/daemon/processes.d.ts.map +1 -0
- package/dist/daemon/processes.js +691 -0
- package/dist/daemon/processes.js.map +1 -0
- package/dist/daemon/profile-storage.d.ts +16 -0
- package/dist/daemon/profile-storage.d.ts.map +1 -0
- package/dist/daemon/profile-storage.js +148 -0
- package/dist/daemon/profile-storage.js.map +1 -0
- package/dist/daemon/projection.d.ts +110 -0
- package/dist/daemon/projection.d.ts.map +1 -0
- package/dist/daemon/projection.js +661 -0
- package/dist/daemon/projection.js.map +1 -0
- package/dist/daemon/provider-loader.d.ts +28 -0
- package/dist/daemon/provider-loader.d.ts.map +1 -0
- package/dist/daemon/provider-loader.js +376 -0
- package/dist/daemon/provider-loader.js.map +1 -0
- package/dist/daemon/provider.d.ts +92 -0
- package/dist/daemon/provider.d.ts.map +1 -0
- package/dist/daemon/provider.js +31 -0
- package/dist/daemon/provider.js.map +1 -0
- package/dist/daemon/registry.d.ts +209 -0
- package/dist/daemon/registry.d.ts.map +1 -0
- package/dist/daemon/registry.js +1591 -0
- package/dist/daemon/registry.js.map +1 -0
- package/dist/daemon/runtime-dependencies.d.ts +5 -0
- package/dist/daemon/runtime-dependencies.d.ts.map +1 -0
- package/dist/daemon/runtime-dependencies.js +31 -0
- package/dist/daemon/runtime-dependencies.js.map +1 -0
- package/dist/daemon/server.d.ts +110 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +556 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/service.d.ts +38 -0
- package/dist/daemon/service.d.ts.map +1 -0
- package/dist/daemon/service.js +275 -0
- package/dist/daemon/service.js.map +1 -0
- package/dist/daemon/session-cursor.d.ts +3 -0
- package/dist/daemon/session-cursor.d.ts.map +1 -0
- package/dist/daemon/session-cursor.js +4 -0
- package/dist/daemon/session-cursor.js.map +1 -0
- package/dist/daemon/session-execution.d.ts +88 -0
- package/dist/daemon/session-execution.d.ts.map +1 -0
- package/dist/daemon/session-execution.js +2 -0
- package/dist/daemon/session-execution.js.map +1 -0
- package/dist/daemon/session-executions.d.ts +5 -0
- package/dist/daemon/session-executions.d.ts.map +1 -0
- package/dist/daemon/session-executions.js +146 -0
- package/dist/daemon/session-executions.js.map +1 -0
- package/dist/daemon/session-files.d.ts +28 -0
- package/dist/daemon/session-files.d.ts.map +1 -0
- package/dist/daemon/session-files.js +189 -0
- package/dist/daemon/session-files.js.map +1 -0
- package/dist/daemon/session-lifecycle-contracts.d.ts +104 -0
- package/dist/daemon/session-lifecycle-contracts.d.ts.map +1 -0
- package/dist/daemon/session-lifecycle-contracts.js +2 -0
- package/dist/daemon/session-lifecycle-contracts.js.map +1 -0
- package/dist/daemon/session-lifecycle.d.ts +26 -0
- package/dist/daemon/session-lifecycle.d.ts.map +1 -0
- package/dist/daemon/session-lifecycle.js +246 -0
- package/dist/daemon/session-lifecycle.js.map +1 -0
- package/dist/daemon/session-runtime.d.ts +64 -0
- package/dist/daemon/session-runtime.d.ts.map +1 -0
- package/dist/daemon/session-runtime.js +3 -0
- package/dist/daemon/session-runtime.js.map +1 -0
- package/dist/daemon/session-services.d.ts +6 -0
- package/dist/daemon/session-services.d.ts.map +1 -0
- package/dist/daemon/session-services.js +144 -0
- package/dist/daemon/session-services.js.map +1 -0
- package/dist/daemon/shutdown-error.d.ts +12 -0
- package/dist/daemon/shutdown-error.d.ts.map +1 -0
- package/dist/daemon/shutdown-error.js +51 -0
- package/dist/daemon/shutdown-error.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +28 -0
- package/dist/daemon/supervisor.d.ts.map +1 -0
- package/dist/daemon/supervisor.js +159 -0
- package/dist/daemon/supervisor.js.map +1 -0
- package/dist/daemon/target.d.ts +55 -0
- package/dist/daemon/target.d.ts.map +1 -0
- package/dist/daemon/target.js +191 -0
- package/dist/daemon/target.js.map +1 -0
- package/dist/daemon/tree.d.ts +7 -0
- package/dist/daemon/tree.d.ts.map +1 -0
- package/dist/daemon/tree.js +126 -0
- package/dist/daemon/tree.js.map +1 -0
- package/dist/daemon/ui-vocabulary.d.ts +29 -0
- package/dist/daemon/ui-vocabulary.d.ts.map +1 -0
- package/dist/daemon/ui-vocabulary.js +323 -0
- package/dist/daemon/ui-vocabulary.js.map +1 -0
- package/dist/daemon/worker.d.ts +5 -0
- package/dist/daemon/worker.d.ts.map +1 -0
- package/dist/daemon/worker.js +49 -0
- package/dist/daemon/worker.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/lock.d.ts +27 -0
- package/dist/lock.d.ts.map +1 -0
- package/dist/lock.js +432 -0
- package/dist/lock.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +56 -0
- package/dist/logger.js.map +1 -0
- package/dist/remote/backoff.d.ts +17 -0
- package/dist/remote/backoff.d.ts.map +1 -0
- package/dist/remote/backoff.js +18 -0
- package/dist/remote/backoff.js.map +1 -0
- package/dist/remote/batch.d.ts +3 -0
- package/dist/remote/batch.d.ts.map +1 -0
- package/dist/remote/batch.js +27 -0
- package/dist/remote/batch.js.map +1 -0
- package/dist/remote/command-journal.d.ts +30 -0
- package/dist/remote/command-journal.d.ts.map +1 -0
- package/dist/remote/command-journal.js +72 -0
- package/dist/remote/command-journal.js.map +1 -0
- package/dist/remote/commands.d.ts +48 -0
- package/dist/remote/commands.d.ts.map +1 -0
- package/dist/remote/commands.js +145 -0
- package/dist/remote/commands.js.map +1 -0
- package/dist/remote/connector.d.ts +135 -0
- package/dist/remote/connector.d.ts.map +1 -0
- package/dist/remote/connector.js +1069 -0
- package/dist/remote/connector.js.map +1 -0
- package/dist/remote/content.d.ts +17 -0
- package/dist/remote/content.d.ts.map +1 -0
- package/dist/remote/content.js +116 -0
- package/dist/remote/content.js.map +1 -0
- package/dist/remote/outbox.d.ts +52 -0
- package/dist/remote/outbox.d.ts.map +1 -0
- package/dist/remote/outbox.js +321 -0
- package/dist/remote/outbox.js.map +1 -0
- package/dist/remote/platform.d.ts +53 -0
- package/dist/remote/platform.d.ts.map +1 -0
- package/dist/remote/platform.js +231 -0
- package/dist/remote/platform.js.map +1 -0
- package/dist/remote/realtime.d.ts +45 -0
- package/dist/remote/realtime.d.ts.map +1 -0
- package/dist/remote/realtime.js +265 -0
- package/dist/remote/realtime.js.map +1 -0
- package/dist/remote/sharing.d.ts +16 -0
- package/dist/remote/sharing.d.ts.map +1 -0
- package/dist/remote/sharing.js +24 -0
- package/dist/remote/sharing.js.map +1 -0
- package/dist/remote/state.d.ts +52 -0
- package/dist/remote/state.d.ts.map +1 -0
- package/dist/remote/state.js +156 -0
- package/dist/remote/state.js.map +1 -0
- package/dist/remote/text.d.ts +11 -0
- package/dist/remote/text.d.ts.map +1 -0
- package/dist/remote/text.js +188 -0
- package/dist/remote/text.js.map +1 -0
- package/dist/remote/token.d.ts +39 -0
- package/dist/remote/token.d.ts.map +1 -0
- package/dist/remote/token.js +238 -0
- package/dist/remote/token.js.map +1 -0
- package/dist/runtime-factory.d.ts +12 -0
- package/dist/runtime-factory.d.ts.map +1 -0
- package/dist/runtime-factory.js +12 -0
- package/dist/runtime-factory.js.map +1 -0
- package/dist/session-history.d.ts +29 -0
- package/dist/session-history.d.ts.map +1 -0
- package/dist/session-history.js +374 -0
- package/dist/session-history.js.map +1 -0
- package/dist/setup/dependencies.d.ts +15 -0
- package/dist/setup/dependencies.d.ts.map +1 -0
- package/dist/setup/dependencies.js +2 -0
- package/dist/setup/dependencies.js.map +1 -0
- package/dist/setup/open.d.ts +8 -0
- package/dist/setup/open.d.ts.map +1 -0
- package/dist/setup/open.js +16 -0
- package/dist/setup/open.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +4 -0
- package/dist/version.js.map +1 -0
- package/package.json +65 -3
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { redact } from '../logger.js';
|
|
2
|
+
const alphabet = /[A-Za-z0-9_-]/u;
|
|
3
|
+
const patterns = [
|
|
4
|
+
{ prefix: 'fln_pat_', minimum: 1 },
|
|
5
|
+
{ prefix: 'AIza', minimum: 20 },
|
|
6
|
+
...['sk-', 'pk-', 'rk-', 'ghp_', 'gho_', 'ghu_', 'ghs_', 'ghr_', 'github_pat_', 'xoxb-', 'xoxa-', 'xoxp-', 'xoxr-', 'AKIA'].map(prefix => ({ prefix, minimum: 8 })),
|
|
7
|
+
];
|
|
8
|
+
export class RemoteTextSanitizer {
|
|
9
|
+
streams = new Map();
|
|
10
|
+
push(event) {
|
|
11
|
+
const key = JSON.stringify([event.session, event.stream.id, event.stream.message, event.stream.kind]);
|
|
12
|
+
let state = this.streams.get(key);
|
|
13
|
+
if (!state) {
|
|
14
|
+
if (event.stream.offset !== 0 || this.streams.size >= 64)
|
|
15
|
+
return;
|
|
16
|
+
state = { event: structuredClone(event), pending: '', nextOffset: 0, previous: '',
|
|
17
|
+
assignment: { key: '', sensitive: false, separated: false, query: false } };
|
|
18
|
+
this.streams.set(key, state);
|
|
19
|
+
}
|
|
20
|
+
if (state.dropped)
|
|
21
|
+
return;
|
|
22
|
+
if (event.stream.offset !== state.nextOffset) {
|
|
23
|
+
state.pending = '';
|
|
24
|
+
state.dropped = true;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
state.nextOffset += Array.from(event.text).length;
|
|
28
|
+
return this.drain(state, state.pending + this.maskAssignments(state.assignment, event.text));
|
|
29
|
+
}
|
|
30
|
+
maskAssignments(state, input) {
|
|
31
|
+
let output = '';
|
|
32
|
+
for (const point of input) {
|
|
33
|
+
if (state.value === 'waiting') {
|
|
34
|
+
if (/\s/u.test(point)) {
|
|
35
|
+
output += point;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
state.value = point === '"' || point === "'" ? point : state.header ? 'header' : 'unquoted';
|
|
39
|
+
if (state.value === '"' || state.value === "'") {
|
|
40
|
+
output += point;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (state.value) {
|
|
45
|
+
const terminator = state.value === 'header' ? /[\r\n,;}&]/u.test(point)
|
|
46
|
+
: state.value === 'unquoted' ? /[\s,;}&]/u.test(point) : point === state.value;
|
|
47
|
+
if (!terminator) {
|
|
48
|
+
output += '*';
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const quoted = state.value === '"' || state.value === "'";
|
|
52
|
+
delete state.value;
|
|
53
|
+
state.key = '';
|
|
54
|
+
state.sensitive = false;
|
|
55
|
+
state.separated = false;
|
|
56
|
+
state.query = false;
|
|
57
|
+
if (quoted) {
|
|
58
|
+
output += point;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (/[\w-]/u.test(point)) {
|
|
63
|
+
if (state.separated) {
|
|
64
|
+
state.key = '';
|
|
65
|
+
state.sensitive = false;
|
|
66
|
+
state.query = false;
|
|
67
|
+
}
|
|
68
|
+
state.separated = false;
|
|
69
|
+
state.key = (state.key + point).slice(-32);
|
|
70
|
+
state.sensitive ||= /api[_-]?key|token|secret|password|authorization|credential/iu.test(state.key);
|
|
71
|
+
}
|
|
72
|
+
else if (/\s/u.test(point) || point === '"' || point === "'") {
|
|
73
|
+
state.separated = true;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
if ((point === ':' || point === '=') && (state.sensitive || state.query && /^(?:code|state|key)$/iu.test(state.key))) {
|
|
77
|
+
state.value = 'waiting';
|
|
78
|
+
state.header = /authorization/iu.test(state.key);
|
|
79
|
+
}
|
|
80
|
+
state.key = '';
|
|
81
|
+
state.sensitive = false;
|
|
82
|
+
state.separated = false;
|
|
83
|
+
state.query = point === '?' || point === '&';
|
|
84
|
+
}
|
|
85
|
+
output += point;
|
|
86
|
+
}
|
|
87
|
+
return output;
|
|
88
|
+
}
|
|
89
|
+
drain(state, input, final = false) {
|
|
90
|
+
state.pending = '';
|
|
91
|
+
const previous = state.previous;
|
|
92
|
+
let output = '';
|
|
93
|
+
let index = 0;
|
|
94
|
+
for (; index < input.length;) {
|
|
95
|
+
const point = String.fromCodePoint(input.codePointAt(index));
|
|
96
|
+
if (state.bearer && /\s/u.test(point)) {
|
|
97
|
+
output += point;
|
|
98
|
+
index += point.length;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (state.bearer) {
|
|
102
|
+
state.bearer = false;
|
|
103
|
+
state.mask = /[^\s,;]/u;
|
|
104
|
+
}
|
|
105
|
+
if (state.mask?.test(point)) {
|
|
106
|
+
output += '*';
|
|
107
|
+
index += point.length;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
state.mask = undefined;
|
|
111
|
+
const rest = input.slice(index);
|
|
112
|
+
if (/\w/u.test(index ? input[index - 1] : previous)) {
|
|
113
|
+
output += point;
|
|
114
|
+
index += point.length;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (/^bearer\s/iu.test(rest)) {
|
|
118
|
+
const prefix = rest.slice(0, 7);
|
|
119
|
+
output += prefix;
|
|
120
|
+
index += prefix.length;
|
|
121
|
+
state.bearer = true;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const pattern = patterns.find(pattern => rest.startsWith(pattern.prefix));
|
|
125
|
+
if (pattern) {
|
|
126
|
+
let end = pattern.prefix.length;
|
|
127
|
+
while (end < rest.length && end < pattern.prefix.length + pattern.minimum && alphabet.test(rest[end]))
|
|
128
|
+
end++;
|
|
129
|
+
if (end === pattern.prefix.length + pattern.minimum) {
|
|
130
|
+
output += '*'.repeat(end);
|
|
131
|
+
index += end;
|
|
132
|
+
state.mask = alphabet;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (end === rest.length && !final) {
|
|
136
|
+
state.pending = rest;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
output += rest.slice(0, end);
|
|
140
|
+
index += end;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
const jwt = /^eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/u.exec(rest);
|
|
144
|
+
if (jwt) {
|
|
145
|
+
output += '*'.repeat(jwt[0].length);
|
|
146
|
+
index += jwt[0].length;
|
|
147
|
+
state.mask = alphabet;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const possibleJwt = /^eyJ[A-Za-z0-9_-]*$/u.test(rest)
|
|
151
|
+
|| /^eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]*$/u.test(rest)
|
|
152
|
+
|| /^eyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.$/u.test(rest);
|
|
153
|
+
if (!final && (possibleJwt || 'eyJ'.startsWith(rest) || patterns.some(pattern => pattern.prefix.startsWith(rest)) || 'bearer'.startsWith(rest.toLowerCase()))) {
|
|
154
|
+
// Withhold possible credentials until their minimum length and shape can be decided.
|
|
155
|
+
state.pending = rest;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
output += point;
|
|
159
|
+
index += point.length;
|
|
160
|
+
}
|
|
161
|
+
if (index)
|
|
162
|
+
state.previous = input[index - 1];
|
|
163
|
+
if (!output)
|
|
164
|
+
return;
|
|
165
|
+
// A carried word character must not gain a false boundary at the chunk start.
|
|
166
|
+
const contextual = (/\w/u.test(previous) ? '_' : '') + previous + output;
|
|
167
|
+
const result = { ...state.event, stream: { ...state.event.stream }, text: redact(contextual) === contextual ? output : '*'.repeat(Array.from(output).length) };
|
|
168
|
+
state.event.stream.offset += Array.from(output).length;
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
discard(session) { for (const [key, state] of this.streams)
|
|
172
|
+
if (state.event.session === session)
|
|
173
|
+
this.streams.delete(key); }
|
|
174
|
+
clear() { this.streams.clear(); }
|
|
175
|
+
finish(session, message) {
|
|
176
|
+
const result = [];
|
|
177
|
+
for (const [key, state] of this.streams) {
|
|
178
|
+
if (state.event.session !== session || state.event.stream.message !== message)
|
|
179
|
+
continue;
|
|
180
|
+
const event = this.drain(state, state.pending, true);
|
|
181
|
+
if (event)
|
|
182
|
+
result.push(event);
|
|
183
|
+
this.streams.delete(key);
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/remote/text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAClC,MAAM,QAAQ,GAAG;IACf,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE;IAClC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;IAC/B,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;CACpK,CAAC;AAoBF,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,IAAI,CAAC,KAAsB;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtG,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE;gBAAE,OAAO;YACjE,KAAK,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;gBAC/E,UAAU,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;YAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;YAAC,OAAO;QAAC,CAAC;QACnG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,CAAC;IACO,eAAe,CAAC,KAAiB,EAAE,KAAa;QACtD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACrD,KAAK,CAAC,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;gBAC5F,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC;oBAAC,SAAS;gBAAC,CAAC;YAChF,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;oBACrE,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC;gBACjF,IAAI,CAAC,UAAU,EAAE,CAAC;oBAAC,MAAM,IAAI,GAAG,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,GAAG,CAAC;gBAC1D,OAAO,KAAK,CAAC,KAAK,CAAC;gBACnB,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBACtF,IAAI,MAAM,EAAE,CAAC;oBAAC,MAAM,IAAI,KAAK,CAAC;oBAAC,SAAS;gBAAC,CAAC;YAC5C,CAAC;YACD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;oBAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;oBAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;oBAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBAAC,CAAC;gBACtF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBACxB,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3C,KAAK,CAAC,SAAS,KAAK,8DAA8D,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrG,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC/D,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrH,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;oBAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5E,CAAC;gBACD,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBAAC,KAAK,CAAC,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;YACjH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACO,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,KAAK,GAAG,KAAK;QACvD,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC,CAAC;YAC9D,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC;gBAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC5F,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;gBAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;YAAC,CAAC;YACpE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,MAAM,IAAI,GAAG,CAAC;gBAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAChF,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC;gBAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;gBAAC,SAAS;YACnD,CAAC;YACD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,MAAM,IAAI,MAAM,CAAC;gBAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC;gBAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;gBAAC,SAAS;YAC3G,CAAC;YACD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1E,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC;oBAAE,GAAG,EAAE,CAAC;gBAC9G,IAAI,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAAC,KAAK,IAAI,GAAG,CAAC;oBAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;oBAAC,SAAS;gBAC3E,CAAC;gBACD,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;oBAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;oBAAC,MAAM;gBAAC,CAAC;gBACnE,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAAC,KAAK,IAAI,GAAG,CAAC;gBAAC,SAAS;YACvD,CAAC;YACD,MAAM,GAAG,GAAG,wDAAwD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChF,IAAI,GAAG,EAAE,CAAC;gBAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC1G,MAAM,WAAW,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;mBAChD,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC;mBACpD,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC9J,qFAAqF;gBACrF,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBAAC,MAAM;YAC9B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC;YAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QACzC,CAAC;QACD,IAAI,KAAK;YAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,8EAA8E;QAC9E,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;QACzE,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/J,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,OAAe,IAAU,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1I,KAAK,KAAW,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,OAAe,EAAE,OAAe;QACrC,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO;gBAAE,SAAS;YACxF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type HostTokenError, type HostTokenResponse } from '@felan-ai/session-protocol';
|
|
2
|
+
import { type RemoteClock, type RetryOptions } from './backoff.js';
|
|
3
|
+
export type HostTokenFailureKind = 'invalid_pat' | 'not_a_member' | 'host_revoked' | 'unsupported_schema' | 'unavailable' | 'retry';
|
|
4
|
+
export declare class HostTokenExchangeError extends Error {
|
|
5
|
+
readonly kind: HostTokenFailureKind;
|
|
6
|
+
readonly supported?: HostTokenError['supported'];
|
|
7
|
+
readonly retryAfterMs?: number | undefined;
|
|
8
|
+
readonly rateLimited: boolean;
|
|
9
|
+
readonly retryable: boolean;
|
|
10
|
+
constructor(kind: HostTokenFailureKind, message: string, supported?: HostTokenError['supported'], retryAfterMs?: number | undefined, rateLimited?: boolean);
|
|
11
|
+
}
|
|
12
|
+
export type HostTokenInfo = Omit<HostTokenResponse, 'token'>;
|
|
13
|
+
export interface HostTokenProvider {
|
|
14
|
+
token(): Promise<string>;
|
|
15
|
+
cachedToken(): string | null;
|
|
16
|
+
current(): HostTokenInfo | undefined;
|
|
17
|
+
onChange(listener: (token: string, info: HostTokenInfo) => void): () => void;
|
|
18
|
+
}
|
|
19
|
+
export interface HostTokenSourceOptions extends RetryOptions {
|
|
20
|
+
apiUrl: string;
|
|
21
|
+
pat: string;
|
|
22
|
+
installId: string;
|
|
23
|
+
daemonVersion: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
fetch?: typeof fetch;
|
|
26
|
+
clock?: RemoteClock;
|
|
27
|
+
requestTimeoutMs?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class HostTokenSource implements HostTokenProvider {
|
|
30
|
+
#private;
|
|
31
|
+
constructor(options: HostTokenSourceOptions);
|
|
32
|
+
current(): HostTokenInfo | undefined;
|
|
33
|
+
cachedToken(): string | null;
|
|
34
|
+
onChange(listener: (token: string, info: HostTokenInfo) => void): () => void;
|
|
35
|
+
token(): Promise<string>;
|
|
36
|
+
invalidate(): void;
|
|
37
|
+
stop(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/remote/token.ts"],"names":[],"mappings":"AACA,OAAO,EAEiB,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAClE,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAqC,KAAK,WAAW,EAAE,KAAK,YAAY,EAAoB,MAAM,cAAc,CAAC;AAExH,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,GAAG,oBAAoB,GAAG,aAAa,GAAG,OAAO,CAAC;AACpI,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,IAAI,EAAE,oBAAoB;IAEnC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC;IAChD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM;IAC9B,QAAQ,CAAC,WAAW;IANtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEjB,IAAI,EAAE,oBAAoB,EACnC,OAAO,EAAE,MAAM,EACN,SAAS,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,EACvC,YAAY,CAAC,EAAE,MAAM,YAAA,EACrB,WAAW,UAAQ;CAM/B;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC7D,MAAM,WAAW,iBAAiB;IAChC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,IAAI,aAAa,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC9E;AACD,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAgCD,qBAAa,eAAgB,YAAW,iBAAiB;;gBAgB3C,OAAO,EAAE,sBAAsB;IAM3C,OAAO,IAAI,aAAa,GAAG,SAAS;IAMpC,WAAW,IAAI,MAAM,GAAG,IAAI;IAK5B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKtE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAiB9B,UAAU,IAAI,IAAI;IAclB,IAAI,IAAI,IAAI;CAuFb"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { hostname } from 'node:os';
|
|
2
|
+
import { PROTOCOL_VERSION, ROW_SCHEMA_VERSION, parseHostTokenRequest, parseHostTokenResponse, parseSchema, HostTokenErrorSchema, } from '@felan-ai/session-protocol';
|
|
3
|
+
import { redact } from '../logger.js';
|
|
4
|
+
import { retryDelay, schedule, systemClock } from './backoff.js';
|
|
5
|
+
export class HostTokenExchangeError extends Error {
|
|
6
|
+
kind;
|
|
7
|
+
supported;
|
|
8
|
+
retryAfterMs;
|
|
9
|
+
rateLimited;
|
|
10
|
+
retryable;
|
|
11
|
+
constructor(kind, message, supported, retryAfterMs, rateLimited = false) {
|
|
12
|
+
super(redact(message));
|
|
13
|
+
this.kind = kind;
|
|
14
|
+
this.supported = supported;
|
|
15
|
+
this.retryAfterMs = retryAfterMs;
|
|
16
|
+
this.rateLimited = rateLimited;
|
|
17
|
+
this.name = 'HostTokenExchangeError';
|
|
18
|
+
this.retryable = !['invalid_pat', 'not_a_member', 'host_revoked', 'unsupported_schema'].includes(kind);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function endpoint(value) {
|
|
22
|
+
try {
|
|
23
|
+
const url = new URL(value);
|
|
24
|
+
if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
25
|
+
throw new Error();
|
|
26
|
+
if (url.protocol !== 'https:' && !['localhost', '127.0.0.1', '[::1]', '::1'].includes(url.hostname))
|
|
27
|
+
throw new Error();
|
|
28
|
+
return url.toString().replace(/\/$/u, '');
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new HostTokenExchangeError('unavailable', 'Remote API URL must use HTTPS (HTTP is allowed only on loopback).');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function hostName(value) {
|
|
35
|
+
let result = '';
|
|
36
|
+
let bytes = 0;
|
|
37
|
+
for (const point of value) {
|
|
38
|
+
const size = Buffer.byteLength(point);
|
|
39
|
+
if (bytes + size > 128)
|
|
40
|
+
break;
|
|
41
|
+
result += point;
|
|
42
|
+
bytes += size;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
function retryAfter(value, now, cap) {
|
|
47
|
+
if (!value)
|
|
48
|
+
return undefined;
|
|
49
|
+
const seconds = /^\d+(?:\.\d+)?$/u.test(value.trim()) ? Number(value) : NaN;
|
|
50
|
+
const delay = Number.isFinite(seconds) ? seconds * 1_000 : Date.parse(value) - now;
|
|
51
|
+
return Number.isFinite(delay) ? Math.min(cap, Math.max(0, delay)) : undefined;
|
|
52
|
+
}
|
|
53
|
+
export class HostTokenSource {
|
|
54
|
+
#options;
|
|
55
|
+
#url;
|
|
56
|
+
#clock;
|
|
57
|
+
#response;
|
|
58
|
+
#inflight;
|
|
59
|
+
#abort;
|
|
60
|
+
#timer;
|
|
61
|
+
#deadline;
|
|
62
|
+
#listeners = new Set();
|
|
63
|
+
#failure;
|
|
64
|
+
#retryAt = 0;
|
|
65
|
+
#attempt = 0;
|
|
66
|
+
#generation = 0;
|
|
67
|
+
#stopped = false;
|
|
68
|
+
constructor(options) {
|
|
69
|
+
this.#options = options;
|
|
70
|
+
this.#url = endpoint(options.apiUrl);
|
|
71
|
+
this.#clock = options.clock ?? systemClock;
|
|
72
|
+
}
|
|
73
|
+
current() {
|
|
74
|
+
if (!this.#response)
|
|
75
|
+
return undefined;
|
|
76
|
+
const { token: _, ...info } = this.#response;
|
|
77
|
+
return structuredClone(info);
|
|
78
|
+
}
|
|
79
|
+
cachedToken() {
|
|
80
|
+
if (this.#stopped || (this.#failure && !this.#failure.retryable))
|
|
81
|
+
return null;
|
|
82
|
+
return this.#response && this.#clock.now() < this.#response.expiresAt ? this.#response.token : null;
|
|
83
|
+
}
|
|
84
|
+
onChange(listener) {
|
|
85
|
+
this.#listeners.add(listener);
|
|
86
|
+
return () => { this.#listeners.delete(listener); };
|
|
87
|
+
}
|
|
88
|
+
async token() {
|
|
89
|
+
if (this.#stopped)
|
|
90
|
+
throw new HostTokenExchangeError('unavailable', 'Host token source is stopped.');
|
|
91
|
+
if (this.#failure && !this.#failure.retryable)
|
|
92
|
+
throw this.#failure;
|
|
93
|
+
if (this.#response && this.#clock.now() < this.#response.refreshAt)
|
|
94
|
+
return this.#response.token;
|
|
95
|
+
if (this.#clock.now() < this.#retryAt && this.#failure) {
|
|
96
|
+
const cached = this.cachedToken();
|
|
97
|
+
if (cached)
|
|
98
|
+
return cached;
|
|
99
|
+
throw this.#failure;
|
|
100
|
+
}
|
|
101
|
+
if (this.#inflight)
|
|
102
|
+
return this.#inflight;
|
|
103
|
+
const generation = this.#generation;
|
|
104
|
+
const pending = this.#exchange(generation);
|
|
105
|
+
this.#inflight = pending;
|
|
106
|
+
try {
|
|
107
|
+
return await pending;
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
if (this.#inflight === pending)
|
|
111
|
+
this.#inflight = undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
invalidate() {
|
|
115
|
+
this.#generation++;
|
|
116
|
+
this.#abort?.abort();
|
|
117
|
+
this.#abort = undefined;
|
|
118
|
+
if (this.#deadline)
|
|
119
|
+
this.#clock.clearTimeout(this.#deadline);
|
|
120
|
+
this.#deadline = undefined;
|
|
121
|
+
this.#inflight = undefined;
|
|
122
|
+
this.#response = undefined;
|
|
123
|
+
this.#failure = undefined;
|
|
124
|
+
this.#retryAt = 0;
|
|
125
|
+
this.#attempt = 0;
|
|
126
|
+
this.#clearTimer();
|
|
127
|
+
}
|
|
128
|
+
stop() {
|
|
129
|
+
this.#stopped = true;
|
|
130
|
+
this.invalidate();
|
|
131
|
+
this.#listeners.clear();
|
|
132
|
+
}
|
|
133
|
+
#clearTimer() {
|
|
134
|
+
if (this.#timer)
|
|
135
|
+
this.#clock.clearTimeout(this.#timer);
|
|
136
|
+
this.#timer = undefined;
|
|
137
|
+
}
|
|
138
|
+
#renewAt(at) {
|
|
139
|
+
this.#clearTimer();
|
|
140
|
+
if (!this.#stopped)
|
|
141
|
+
this.#timer = schedule(this.#clock, () => {
|
|
142
|
+
this.#timer = undefined;
|
|
143
|
+
void this.token().catch(() => { });
|
|
144
|
+
}, Math.max(1, at - this.#clock.now()));
|
|
145
|
+
}
|
|
146
|
+
async #exchange(generation) {
|
|
147
|
+
const controller = new AbortController();
|
|
148
|
+
this.#abort = controller;
|
|
149
|
+
const timeout = schedule(this.#clock, () => controller.abort(), this.#options.requestTimeoutMs ?? 15_000);
|
|
150
|
+
this.#deadline = timeout;
|
|
151
|
+
try {
|
|
152
|
+
let request;
|
|
153
|
+
try {
|
|
154
|
+
request = parseHostTokenRequest({
|
|
155
|
+
installId: this.#options.installId, name: hostName(this.#options.name ?? hostname()),
|
|
156
|
+
daemonVersion: this.#options.daemonVersion, protocol: PROTOCOL_VERSION, rowSchemaVersion: ROW_SCHEMA_VERSION,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
throw new HostTokenExchangeError('unavailable', 'Invalid host token request.');
|
|
161
|
+
}
|
|
162
|
+
const response = await (this.#options.fetch ?? fetch)(`${this.#url}/api/v1/hosts/token`, {
|
|
163
|
+
method: 'POST', headers: { Authorization: `Bearer ${this.#options.pat}`, 'Content-Type': 'application/json' },
|
|
164
|
+
body: JSON.stringify(request), signal: controller.signal, redirect: 'error',
|
|
165
|
+
});
|
|
166
|
+
const body = await response.json().catch(() => undefined);
|
|
167
|
+
if (response.status !== 200)
|
|
168
|
+
throw this.#httpError(response, body);
|
|
169
|
+
let parsed;
|
|
170
|
+
try {
|
|
171
|
+
parsed = parseHostTokenResponse(body);
|
|
172
|
+
endpoint(parsed.supabase.url);
|
|
173
|
+
if (parsed.expiresAt <= this.#clock.now())
|
|
174
|
+
throw new Error();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
throw new HostTokenExchangeError('unavailable', 'Invalid host token response.');
|
|
178
|
+
}
|
|
179
|
+
if (generation !== this.#generation || this.#stopped)
|
|
180
|
+
throw new HostTokenExchangeError('unavailable', 'Host token exchange was cancelled.');
|
|
181
|
+
this.#response = parsed;
|
|
182
|
+
this.#failure = undefined;
|
|
183
|
+
this.#attempt = 0;
|
|
184
|
+
this.#retryAt = 0;
|
|
185
|
+
this.#renewAt(parsed.refreshAt);
|
|
186
|
+
const info = this.current();
|
|
187
|
+
for (const listener of this.#listeners) {
|
|
188
|
+
try {
|
|
189
|
+
listener(parsed.token, info);
|
|
190
|
+
}
|
|
191
|
+
catch { /* observers cannot invalidate a successful exchange */ }
|
|
192
|
+
}
|
|
193
|
+
return parsed.token;
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
const failure = error instanceof HostTokenExchangeError ? error : new HostTokenExchangeError('retry', 'Host token exchange is temporarily unavailable.');
|
|
197
|
+
if (generation !== this.#generation || this.#stopped)
|
|
198
|
+
throw new HostTokenExchangeError('unavailable', 'Host token exchange was cancelled.');
|
|
199
|
+
this.#failure = failure;
|
|
200
|
+
if (failure.retryable) {
|
|
201
|
+
this.#retryAt = this.#clock.now() + Math.max(retryDelay(this.#attempt++, this.#options), failure.retryAfterMs ?? 0);
|
|
202
|
+
this.#renewAt(this.#retryAt);
|
|
203
|
+
const cached = this.cachedToken();
|
|
204
|
+
if (cached)
|
|
205
|
+
return cached;
|
|
206
|
+
}
|
|
207
|
+
else
|
|
208
|
+
this.#clearTimer();
|
|
209
|
+
throw failure;
|
|
210
|
+
}
|
|
211
|
+
finally {
|
|
212
|
+
this.#clock.clearTimeout(timeout);
|
|
213
|
+
if (this.#deadline === timeout)
|
|
214
|
+
this.#deadline = undefined;
|
|
215
|
+
if (this.#abort === controller)
|
|
216
|
+
this.#abort = undefined;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
#httpError(response, body) {
|
|
220
|
+
let parsed;
|
|
221
|
+
try {
|
|
222
|
+
parsed = parseSchema(HostTokenErrorSchema, body);
|
|
223
|
+
}
|
|
224
|
+
catch { /* error bodies are not a trusted diagnostic source */ }
|
|
225
|
+
if (response.status === 401)
|
|
226
|
+
return new HostTokenExchangeError('invalid_pat', 'Personal access token is invalid or revoked.');
|
|
227
|
+
if (response.status === 403 && parsed?.code === 'not_a_member')
|
|
228
|
+
return new HostTokenExchangeError('not_a_member', 'Host owner is no longer a team member.');
|
|
229
|
+
if (response.status === 403 && parsed?.code === 'host_revoked')
|
|
230
|
+
return new HostTokenExchangeError('host_revoked', 'Host has been revoked.');
|
|
231
|
+
if (response.status === 426)
|
|
232
|
+
return new HostTokenExchangeError('unsupported_schema', 'Remote publication requires a supported schema version.', parsed?.supported);
|
|
233
|
+
if (response.status === 429 || response.status >= 500)
|
|
234
|
+
return new HostTokenExchangeError('retry', 'Host token exchange is temporarily unavailable.', undefined, retryAfter(response.headers.get('Retry-After'), this.#clock.now(), this.#options.capMs ?? 60_000), response.status === 429);
|
|
235
|
+
return new HostTokenExchangeError('unavailable', 'Host token exchange was refused.');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/remote/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACL,gBAAgB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,WAAW,EAChG,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAyD,MAAM,cAAc,CAAC;AAGxH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAGpC;IAEA;IACA;IACA;IANF,SAAS,CAAU;IAC5B,YACW,IAA0B,EACnC,OAAe,EACN,SAAuC,EACvC,YAAqB,EACrB,cAAc,KAAK;QAE5B,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QANd,SAAI,GAAJ,IAAI,CAAsB;QAE1B,cAAS,GAAT,SAAS,CAA8B;QACvC,iBAAY,GAAZ,YAAY,CAAS;QACrB,gBAAW,GAAX,WAAW,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzG,CAAC;CACF;AAoBD,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QAC7H,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACvH,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,mEAAmE,CAAC,CAAC;IACvH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,GAAG,GAAG;YAAE,MAAM;QAC9B,MAAM,IAAI,KAAK,CAAC;QAChB,KAAK,IAAI,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB,EAAE,GAAW,EAAE,GAAW;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IACnF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAChF,CAAC;AAED,MAAM,OAAO,eAAe;IAC1B,QAAQ,CAAyB;IACjC,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,SAAS,CAAgC;IACzC,SAAS,CAA8B;IACvC,MAAM,CAA8B;IACpC,MAAM,CAA0B;IAChC,SAAS,CAA0B;IACnC,UAAU,GAAG,IAAI,GAAG,EAAgD,CAAC;IACrE,QAAQ,CAAqC;IAC7C,QAAQ,GAAG,CAAC,CAAC;IACb,QAAQ,GAAG,CAAC,CAAC;IACb,WAAW,GAAG,CAAC,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IAEjB,YAAY,OAA+B;QACzC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QACtC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9E,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACtG,CAAC;IAED,QAAQ,CAAC,QAAsD;QAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;QACpG,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;QACnE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAChG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC;YAAC,OAAO,MAAM,OAAO,CAAC;QAAC,CAAC;gBACrB,CAAC;YAAC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO;gBAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAAC,CAAC;IACzE,CAAC;IAED,UAAU;QACR,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC3D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,MAAM,CAAC,CAAC;QAC1G,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,GAAG,qBAAqB,CAAC;oBAC9B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;oBACpF,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB;iBAC7G,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,6BAA6B,CAAC,CAAC;YAAC,CAAC;YAC3F,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,qBAAqB,EAAE;gBACvF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC7G,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO;aAC5E,CAAC,CAAC;YACH,MAAM,IAAI,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;gBAAE,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnE,IAAI,MAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBACtC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;oBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;YAC/D,CAAC;YAAC,MAAM,CAAC;gBAAC,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,8BAA8B,CAAC,CAAC;YAAC,CAAC;YAC5F,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,oCAAoC,CAAC,CAAC;YAC5I,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAG,CAAC;YAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvC,IAAI,CAAC;oBAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,uDAAuD,CAAC,CAAC;YACzG,CAAC;YACD,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,sBAAsB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,iDAAiD,CAAC,CAAC;YACzJ,IAAI,UAAU,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,sBAAsB,CAAC,aAAa,EAAE,oCAAoC,CAAC,CAAC;YAC5I,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;YACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;gBACpH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClC,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;;gBAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,OAAO,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO;gBAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3D,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;gBAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,UAAU,CAAC,QAAkB,EAAE,IAAa;QAC1C,IAAI,MAAkC,CAAC;QACvC,IAAI,CAAC;YAAC,MAAM,GAAG,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,sDAAsD,CAAC,CAAC;QAC1H,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,sBAAsB,CAAC,aAAa,EAAE,8CAA8C,CAAC,CAAC;QAC9H,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,EAAE,IAAI,KAAK,cAAc;YAAE,OAAO,IAAI,sBAAsB,CAAC,cAAc,EAAE,wCAAwC,CAAC,CAAC;QAC5J,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,EAAE,IAAI,KAAK,cAAc;YAAE,OAAO,IAAI,sBAAsB,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;QAC5I,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,sBAAsB,CAAC,oBAAoB,EAAE,yDAAyD,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnK,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG;YAAE,OAAO,IAAI,sBAAsB,CACtF,OAAO,EAAE,iDAAiD,EAAE,SAAS,EACrE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,EACjG,QAAQ,CAAC,MAAM,KAAK,GAAG,CACxB,CAAC;QACF,OAAO,IAAI,sBAAsB,CAAC,aAAa,EAAE,kCAAkC,CAAC,CAAC;IACvF,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentRuntime } from '@felan-ai/agent-core';
|
|
2
|
+
export interface RuntimeStorageRequest {
|
|
3
|
+
readonly cwd: string;
|
|
4
|
+
readonly agentDir: string;
|
|
5
|
+
readonly rootSessionId: string;
|
|
6
|
+
readonly sessionStorageRoot: string;
|
|
7
|
+
readonly agentStorageRoot: string;
|
|
8
|
+
readonly pathAccess: 'host';
|
|
9
|
+
}
|
|
10
|
+
export type RuntimeFactory = (request: RuntimeStorageRequest) => AgentRuntime;
|
|
11
|
+
export declare function createRuntimeStorageRequest(cwd: string, agentDir: string, rootSessionId: string): RuntimeStorageRequest;
|
|
12
|
+
//# sourceMappingURL=runtime-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-factory.d.ts","sourceRoot":"","sources":["../src/runtime-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,qBAAqB,KAC3B,YAAY,CAAC;AAElB,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,qBAAqB,CAcvB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
export function createRuntimeStorageRequest(cwd, agentDir, rootSessionId) {
|
|
3
|
+
return {
|
|
4
|
+
cwd,
|
|
5
|
+
agentDir,
|
|
6
|
+
rootSessionId,
|
|
7
|
+
pathAccess: 'host',
|
|
8
|
+
sessionStorageRoot: join(agentDir, 'storage', 'sessions', encodeURIComponent(rootSessionId)),
|
|
9
|
+
agentStorageRoot: join(agentDir, 'storage', 'agent'),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=runtime-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-factory.js","sourceRoot":"","sources":["../src/runtime-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAgBjC,MAAM,UAAU,2BAA2B,CACzC,GAAW,EACX,QAAgB,EAChB,aAAqB;IAErB,OAAO;QACL,GAAG;QACH,QAAQ;QACR,aAAa;QACb,UAAU,EAAE,MAAM;QAClB,kBAAkB,EAAE,IAAI,CACtB,QAAQ,EACR,SAAS,EACT,UAAU,EACV,kBAAkB,CAAC,aAAa,CAAC,CAClC;QACD,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type SessionHistoryInfo, type SessionRef, type SessionsHistory, type SessionsRequestOptions } from '@felan-ai/agent-core';
|
|
2
|
+
export interface SessionHistorySource {
|
|
3
|
+
/** Private locator, resolved only by the injected reader. Never returned to consumers. */
|
|
4
|
+
readonly key: string;
|
|
5
|
+
readonly sessionId: string;
|
|
6
|
+
readonly id?: string;
|
|
7
|
+
readonly root?: string;
|
|
8
|
+
readonly parent?: string;
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly title: string;
|
|
11
|
+
readonly updatedAt: number;
|
|
12
|
+
readonly state: 'open' | 'closed';
|
|
13
|
+
readonly bytes?: number;
|
|
14
|
+
readonly fingerprint?: string;
|
|
15
|
+
readonly diagnostic?: SessionHistoryInfo['diagnostic'];
|
|
16
|
+
}
|
|
17
|
+
export interface CreateSessionHistoryBackendOptions {
|
|
18
|
+
readonly current: SessionRef;
|
|
19
|
+
readonly project: string;
|
|
20
|
+
/** Must include only sources visible to this session under current host policy. */
|
|
21
|
+
readonly inventory: (options: SessionsRequestOptions) => Promise<readonly SessionHistorySource[]>;
|
|
22
|
+
/** Must verify source ownership/identity and return one consistent, bounded byte snapshot. */
|
|
23
|
+
readonly read: (source: SessionHistorySource, options: {
|
|
24
|
+
readonly maxBytes: number;
|
|
25
|
+
readonly signal?: AbortSignal;
|
|
26
|
+
}) => Promise<Uint8Array>;
|
|
27
|
+
}
|
|
28
|
+
export declare function createSessionHistoryBackend(options: CreateSessionHistoryBackendOptions): SessionsHistory;
|
|
29
|
+
//# sourceMappingURL=session-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-history.d.ts","sourceRoot":"","sources":["../src/session-history.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,kBAAkB,EAEvB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC5B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAAC;IAClG,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7I;AAyBD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kCAAkC,GAAG,eAAe,CAgIxG"}
|