@adonis-agora/agent 0.89.2 → 0.91.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/CHANGELOG.md +21 -0
- package/README.md +7 -0
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +19 -3
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/providers/dashboard_provider.d.ts.map +1 -1
- package/dist/providers/dashboard_provider.js +2 -1
- package/dist/providers/dashboard_provider.js.map +1 -1
- package/dist/src/a2ui/adapter.d.ts.map +1 -1
- package/dist/src/a2ui/adapter.js +2 -1
- package/dist/src/a2ui/adapter.js.map +1 -1
- package/dist/src/ag-ui/adapter.d.ts.map +1 -1
- package/dist/src/ag-ui/adapter.js +5 -1
- package/dist/src/ag-ui/adapter.js.map +1 -1
- package/dist/src/agent-service.d.ts +2 -0
- package/dist/src/agent-service.d.ts.map +1 -1
- package/dist/src/agent-service.js +8 -3
- package/dist/src/agent-service.js.map +1 -1
- package/dist/src/authorize-decision.d.ts +34 -0
- package/dist/src/authorize-decision.d.ts.map +1 -0
- package/dist/src/authorize-decision.js +17 -0
- package/dist/src/authorize-decision.js.map +1 -0
- package/dist/src/coalesced-writes.d.ts +51 -0
- package/dist/src/coalesced-writes.d.ts.map +1 -0
- package/dist/src/coalesced-writes.js +182 -0
- package/dist/src/coalesced-writes.js.map +1 -0
- package/dist/src/dashboard/define_config.d.ts +16 -5
- package/dist/src/dashboard/define_config.d.ts.map +1 -1
- package/dist/src/dashboard/define_config.js.map +1 -1
- package/dist/src/dashboard/gate.d.ts +2 -1
- package/dist/src/dashboard/gate.d.ts.map +1 -1
- package/dist/src/dashboard/gate.js +9 -3
- package/dist/src/dashboard/gate.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +1 -0
- package/dist/src/dashboard/index.d.ts.map +1 -1
- package/dist/src/dashboard/index.js.map +1 -1
- package/dist/src/define_config.d.ts +4 -2
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/governance-gate.d.ts +15 -6
- package/dist/src/governance-gate.d.ts.map +1 -1
- package/dist/src/governance-gate.js +12 -4
- package/dist/src/governance-gate.js.map +1 -1
- package/dist/src/guardrails/detectors/custom.d.ts.map +1 -1
- package/dist/src/guardrails/detectors/custom.js +20 -3
- package/dist/src/guardrails/detectors/custom.js.map +1 -1
- package/dist/src/in-process-sink.d.ts +10 -0
- package/dist/src/in-process-sink.d.ts.map +1 -1
- package/dist/src/in-process-sink.js +66 -7
- package/dist/src/in-process-sink.js.map +1 -1
- package/dist/src/index.d.ts +3 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/interruptible.d.ts +22 -0
- package/dist/src/interruptible.d.ts.map +1 -0
- package/dist/src/interruptible.js +102 -0
- package/dist/src/interruptible.js.map +1 -0
- package/dist/src/lucid-token-stream-sink.d.ts +12 -15
- package/dist/src/lucid-token-stream-sink.d.ts.map +1 -1
- package/dist/src/lucid-token-stream-sink.js +63 -121
- package/dist/src/lucid-token-stream-sink.js.map +1 -1
- package/dist/src/processors.d.ts +3 -1
- package/dist/src/processors.d.ts.map +1 -1
- package/dist/src/processors.js +10 -2
- package/dist/src/processors.js.map +1 -1
- package/dist/src/react/core/use-agent-chat.d.ts.map +1 -1
- package/dist/src/react/core/use-agent-chat.js +5 -0
- package/dist/src/react/core/use-agent-chat.js.map +1 -1
- package/dist/src/redis-stream-client.d.ts +7 -0
- package/dist/src/redis-stream-client.d.ts.map +1 -1
- package/dist/src/redis-token-stream-sink.d.ts +16 -2
- package/dist/src/redis-token-stream-sink.d.ts.map +1 -1
- package/dist/src/redis-token-stream-sink.js +114 -21
- package/dist/src/redis-token-stream-sink.js.map +1 -1
- package/dist/src/spi/agent-store.d.ts +6 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -1
- package/dist/src/spi/agent-store.js.map +1 -1
- package/dist/src/spi/governance-queries.d.ts +6 -0
- package/dist/src/spi/governance-queries.d.ts.map +1 -1
- package/dist/src/spi/token-stream-sink.d.ts +5 -1
- package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
- package/dist/src/spi/token-stream-sink.js.map +1 -1
- package/dist/src/stores/factory.d.ts.map +1 -1
- package/dist/src/stores/factory.js +11 -0
- package/dist/src/stores/factory.js.map +1 -1
- package/dist/src/stores/lucid-governance-queries.d.ts +29 -14
- package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -1
- package/dist/src/stores/lucid-governance-queries.js +184 -158
- package/dist/src/stores/lucid-governance-queries.js.map +1 -1
- package/dist/src/stores/lucid-schema.d.ts +8 -1
- package/dist/src/stores/lucid-schema.d.ts.map +1 -1
- package/dist/src/stores/lucid-schema.js +24 -3
- package/dist/src/stores/lucid-schema.js.map +1 -1
- package/dist/src/stores/lucid.d.ts +1 -0
- package/dist/src/stores/lucid.d.ts.map +1 -1
- package/dist/src/stores/lucid.js +21 -24
- package/dist/src/stores/lucid.js.map +1 -1
- package/dist/src/telescope/agent-governance-providers.d.ts +4 -6
- package/dist/src/telescope/agent-governance-providers.d.ts.map +1 -1
- package/dist/src/telescope/agent-governance-providers.js +10 -10
- package/dist/src/telescope/agent-governance-providers.js.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.d.ts +3 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -1
- package/dist/src/testing/in-memory-governance-queries.js +8 -4
- package/dist/src/testing/in-memory-governance-queries.js.map +1 -1
- package/dist/src/testing/in-memory-store.d.ts +1 -0
- package/dist/src/testing/in-memory-store.d.ts.map +1 -1
- package/dist/src/testing/in-memory-store.js +3 -0
- package/dist/src/testing/in-memory-store.js.map +1 -1
- package/package.json +13 -13
- package/skills/agent-governance/SKILL.md +19 -0
- package/skills/agent-setup/SKILL.md +2 -2
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What consecutive frames of a run merge under, or `undefined` for a frame that is always written on
|
|
3
|
+
* its own. Only the streamed deltas qualify — answer text, reasoning text, and the argument text of
|
|
4
|
+
* ONE tool call — and only in their plain shape, so a merge can never drop a field: every reader
|
|
5
|
+
* appends those deltas, which makes one frame holding their concatenation read the same as the run.
|
|
6
|
+
*/
|
|
7
|
+
export function coalesceKey(frame) {
|
|
8
|
+
if (frame.t === 'text')
|
|
9
|
+
return 'text';
|
|
10
|
+
if (frame.t !== 'event')
|
|
11
|
+
return undefined;
|
|
12
|
+
const event = frame.event;
|
|
13
|
+
if (event.kind === 'reasoning' && Object.keys(event).length === 2)
|
|
14
|
+
return 'reasoning';
|
|
15
|
+
if (event.kind === 'tool-input-delta' && Object.keys(event).length === 3) {
|
|
16
|
+
return `tool-input-delta\u0000${event.id}`;
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/** `next` appended to `held`; both have the same {@link coalesceKey}. */
|
|
21
|
+
function merge(held, next) {
|
|
22
|
+
if (held.t === 'text' && next.t === 'text')
|
|
23
|
+
return { t: 'text', v: held.v + next.v };
|
|
24
|
+
if (held.t === 'event' && next.t === 'event') {
|
|
25
|
+
const a = held.event;
|
|
26
|
+
const b = next.event;
|
|
27
|
+
if (a.kind === 'reasoning' && b.kind === 'reasoning') {
|
|
28
|
+
return { t: 'event', event: { kind: 'reasoning', text: a.text + b.text } };
|
|
29
|
+
}
|
|
30
|
+
if (a.kind === 'tool-input-delta' && b.kind === 'tool-input-delta') {
|
|
31
|
+
return {
|
|
32
|
+
t: 'event',
|
|
33
|
+
event: { kind: 'tool-input-delta', id: a.id, delta: a.delta + b.delta },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return next;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The write half a shared sink puts in front of its transport: consecutive deltas of one kind
|
|
41
|
+
* (see {@link coalesceKey}) written within `flushMs` become ONE frame, and every frame of a run is
|
|
42
|
+
* appended in call order, one append at a time.
|
|
43
|
+
*
|
|
44
|
+
* A model streams token by token, and a round trip per token is what a transport shared across
|
|
45
|
+
* replicas can least afford. A gathered frame is written when its window passes (counted from its
|
|
46
|
+
* FIRST delta, so a steady stream still lands every `flushMs`), when a frame that does not merge
|
|
47
|
+
* with it arrives, and on `flush()`/`end()` — so order is always kept. `flushMs: 0` appends every
|
|
48
|
+
* frame as it comes.
|
|
49
|
+
*
|
|
50
|
+
* Writers opened for the same run in one process share what they are gathering, so a delegated
|
|
51
|
+
* run's text (forwarded through a `childSinkWriter`) and its parent's next frame keep the order they
|
|
52
|
+
* were written in.
|
|
53
|
+
*/
|
|
54
|
+
export class CoalescedWrites {
|
|
55
|
+
flushMs;
|
|
56
|
+
append;
|
|
57
|
+
runs = new Map();
|
|
58
|
+
constructor(flushMs,
|
|
59
|
+
/** Append one frame to the run's stream, or (`null`) its end marker. */
|
|
60
|
+
append) {
|
|
61
|
+
this.flushMs = flushMs;
|
|
62
|
+
this.append = append;
|
|
63
|
+
}
|
|
64
|
+
state(runId) {
|
|
65
|
+
let state = this.runs.get(runId);
|
|
66
|
+
if (state === undefined) {
|
|
67
|
+
state = {
|
|
68
|
+
held: null,
|
|
69
|
+
heldKey: undefined,
|
|
70
|
+
timer: undefined,
|
|
71
|
+
tail: Promise.resolve(),
|
|
72
|
+
pending: 0,
|
|
73
|
+
failure: undefined,
|
|
74
|
+
};
|
|
75
|
+
this.runs.set(runId, state);
|
|
76
|
+
}
|
|
77
|
+
return state;
|
|
78
|
+
}
|
|
79
|
+
/** Forget a run's write state once nothing is gathered, queued or left to report. */
|
|
80
|
+
release(runId, state) {
|
|
81
|
+
if (state.pending === 0 &&
|
|
82
|
+
state.held === null &&
|
|
83
|
+
state.failure === undefined &&
|
|
84
|
+
this.runs.get(runId) === state) {
|
|
85
|
+
this.runs.delete(runId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Queue `frame` behind every write already queued for the run, so frames land in call order. */
|
|
89
|
+
enqueue(runId, state, frame) {
|
|
90
|
+
state.pending += 1;
|
|
91
|
+
const next = state.tail.then(() => this.append(runId, frame));
|
|
92
|
+
state.tail = next
|
|
93
|
+
.then(() => undefined, () => undefined)
|
|
94
|
+
.then(() => {
|
|
95
|
+
state.pending -= 1;
|
|
96
|
+
this.release(runId, state);
|
|
97
|
+
});
|
|
98
|
+
return next;
|
|
99
|
+
}
|
|
100
|
+
/** Queue the gathered frame (if any). */
|
|
101
|
+
flushHeld(runId, state) {
|
|
102
|
+
if (state.timer !== undefined) {
|
|
103
|
+
clearTimeout(state.timer);
|
|
104
|
+
state.timer = undefined;
|
|
105
|
+
}
|
|
106
|
+
const held = state.held;
|
|
107
|
+
if (held === null)
|
|
108
|
+
return Promise.resolve();
|
|
109
|
+
state.held = null;
|
|
110
|
+
state.heldKey = undefined;
|
|
111
|
+
return this.enqueue(runId, state, held);
|
|
112
|
+
}
|
|
113
|
+
/** A write nobody awaits (a window that passed, a gathered frame a different one displaced). */
|
|
114
|
+
flushUnawaited(runId, state) {
|
|
115
|
+
this.flushHeld(runId, state).catch((error) => {
|
|
116
|
+
state.failure = { error };
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Raise, once, a gathered write that failed with nobody awaiting it. */
|
|
120
|
+
raiseFailure(state) {
|
|
121
|
+
const failure = state.failure;
|
|
122
|
+
if (failure !== undefined) {
|
|
123
|
+
state.failure = undefined;
|
|
124
|
+
throw failure.error;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async write(runId, frame) {
|
|
128
|
+
const state = this.state(runId);
|
|
129
|
+
this.raiseFailure(state);
|
|
130
|
+
const key = this.flushMs > 0 ? coalesceKey(frame) : undefined;
|
|
131
|
+
if (key !== undefined) {
|
|
132
|
+
if (state.held !== null && state.heldKey === key) {
|
|
133
|
+
state.held = merge(state.held, frame);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (state.held !== null)
|
|
137
|
+
this.flushUnawaited(runId, state);
|
|
138
|
+
state.held = frame;
|
|
139
|
+
state.heldKey = key;
|
|
140
|
+
state.timer = setTimeout(() => {
|
|
141
|
+
state.timer = undefined;
|
|
142
|
+
this.flushUnawaited(runId, state);
|
|
143
|
+
}, this.flushMs);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const flushed = this.flushHeld(runId, state);
|
|
147
|
+
const appended = this.enqueue(runId, state, frame);
|
|
148
|
+
await Promise.all([flushed, appended]);
|
|
149
|
+
}
|
|
150
|
+
/** Write out the gathered frame and wait for every queued write, without ending the stream. */
|
|
151
|
+
async flush(runId) {
|
|
152
|
+
const state = this.state(runId);
|
|
153
|
+
const flushed = this.flushHeld(runId, state);
|
|
154
|
+
await Promise.all([flushed, state.tail]);
|
|
155
|
+
this.raiseFailure(state);
|
|
156
|
+
this.release(runId, state);
|
|
157
|
+
}
|
|
158
|
+
/** Write out the gathered frame, then the end marker. */
|
|
159
|
+
async end(runId) {
|
|
160
|
+
const state = this.state(runId);
|
|
161
|
+
const flushed = this.flushHeld(runId, state);
|
|
162
|
+
const ended = this.enqueue(runId, state, null);
|
|
163
|
+
await Promise.all([flushed, ended]);
|
|
164
|
+
this.raiseFailure(state);
|
|
165
|
+
this.release(runId, state);
|
|
166
|
+
}
|
|
167
|
+
/** Drop what is gathered for the run and wait out the writes already queued. */
|
|
168
|
+
async discard(runId) {
|
|
169
|
+
const state = this.runs.get(runId);
|
|
170
|
+
if (state === undefined)
|
|
171
|
+
return;
|
|
172
|
+
if (state.timer !== undefined)
|
|
173
|
+
clearTimeout(state.timer);
|
|
174
|
+
state.timer = undefined;
|
|
175
|
+
state.held = null;
|
|
176
|
+
state.heldKey = undefined;
|
|
177
|
+
state.failure = undefined;
|
|
178
|
+
await state.tail;
|
|
179
|
+
this.runs.delete(runId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=coalesced-writes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coalesced-writes.js","sourceRoot":"","sources":["../../src/coalesced-writes.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC5C,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,KAAK,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACtF,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzE,OAAO,yBAAyB,KAAK,CAAC,EAAE,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,yEAAyE;AACzE,SAAS,KAAK,CAAC,IAAiB,EAAE,IAAiB;IACjD,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;IACrF,IAAI,IAAI,CAAC,CAAC,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrD,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACnE,OAAO;gBACL,CAAC,EAAE,OAAO;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE;aACxE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAcD;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,eAAe;IAIP,OAAO;IAEP,MAAM;IALR,IAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IAErD,YACmB,OAAe;IAChC,wEAAwE;IACvD,MAAmE;uBAFnE,OAAO;sBAEP,MAAM;IACtB,CAAC;IAEI,KAAK,CAAC,KAAa;QACzB,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG;gBACN,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,SAAS;gBAClB,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;gBACvB,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,SAAS;aACnB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,qFAAqF;IAC7E,OAAO,CAAC,KAAa,EAAE,KAAgB;QAC7C,IACE,KAAK,CAAC,OAAO,KAAK,CAAC;YACnB,KAAK,CAAC,IAAI,KAAK,IAAI;YACnB,KAAK,CAAC,OAAO,KAAK,SAAS;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,EAC9B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,iGAAiG;IACzF,OAAO,CAAC,KAAa,EAAE,KAAgB,EAAE,KAAyB;QACxE,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,GAAG,IAAI;aACd,IAAI,CACH,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB;aACA,IAAI,CAAC,GAAG,EAAE;YACT,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IACjC,SAAS,CAAC,KAAa,EAAE,KAAgB;QAC/C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,gGAAgG;IACxF,cAAc,CAAC,KAAa,EAAE,KAAgB;QACpD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACpD,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yEAAyE;IACjE,YAAY,CAAC,KAAgB;QACnC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;YAC1B,MAAM,OAAO,CAAC,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,KAAkB;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;gBAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;YACpB,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,+FAA+F;IAC/F,KAAK,CAAC,KAAK,CAAC,KAAa;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,GAAG,CAAC,KAAa;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzD,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QACxB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1B,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;QAC1B,MAAM,KAAK,CAAC,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
import type { AuthorizeResult } from '../authorize-decision.js';
|
|
2
3
|
import type { AgentGovernanceAuthorize } from '../governance-gate.js';
|
|
3
4
|
import type { Actor } from '../types.js';
|
|
4
5
|
import type { AccessDeniedOption as GenericAccessDeniedOption, AccessDeniedRenderer as GenericAccessDeniedRenderer } from './access_denied_page.js';
|
|
@@ -14,11 +15,19 @@ export type AccessDeniedRenderer = GenericAccessDeniedRenderer<HttpContext>;
|
|
|
14
15
|
export type AccessDeniedOption = GenericAccessDeniedOption<HttpContext>;
|
|
15
16
|
/**
|
|
16
17
|
* An extra authorization gate for the dashboard, run AFTER the agent config's `actorResolver` has
|
|
17
|
-
* resolved the caller.
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* resolved the caller. Returns an {@link AuthorizeResult}:
|
|
19
|
+
*
|
|
20
|
+
* - `true` / `{ allowed: true }` → the console is served.
|
|
21
|
+
* - `{ allowed: false, reason: 'unauthenticated' }` → `401` (the access-denied page's "sign in" variant).
|
|
22
|
+
* - `{ allowed: false, reason: 'forbidden' }`, `{ allowed: false }`, or `false` → `403`.
|
|
23
|
+
* - throwing → `403`.
|
|
24
|
+
*
|
|
25
|
+
* If the hook answers the request itself (e.g. `ctx.response.redirect('/login')`), that answer is
|
|
26
|
+
* kept. The governance read-model the SPA serves spans EVERY actor's spend/usage, so most apps
|
|
27
|
+
* restrict the console beyond mere authentication, e.g.
|
|
28
|
+
* `(actor) => actor.roles?.includes('ADMIN') ?? false`.
|
|
20
29
|
*/
|
|
21
|
-
export type AgentDashboardAuthorize = (actor: Actor, ctx: HttpContext) =>
|
|
30
|
+
export type AgentDashboardAuthorize = (actor: Actor, ctx: HttpContext) => AuthorizeResult | Promise<AuthorizeResult>;
|
|
22
31
|
/**
|
|
23
32
|
* Runs when the agent config's `actorResolver` itself rejects the caller — no resolver configured, or
|
|
24
33
|
* `resolve(ctx)` threw (e.g. `AuthActorResolver` over an anonymous `ctx.auth`) — so there is no
|
|
@@ -53,7 +62,9 @@ export interface AgentDashboardConfig {
|
|
|
53
62
|
/** Override the mount path. Default `<agentPath>/dashboard`. */
|
|
54
63
|
path?: string;
|
|
55
64
|
/**
|
|
56
|
-
* Extra authorization run after the actor resolves. Return `false`
|
|
65
|
+
* Extra authorization run after the actor resolves. Return `false` / `{ allowed: false }` to deny
|
|
66
|
+
* (`403`), or `{ allowed: false, reason: 'unauthenticated' }` for `401` — see
|
|
67
|
+
* {@link AgentDashboardAuthorize}. Omit to allow
|
|
57
68
|
* any resolved actor (the default) — note this is only an EXTRA gate on the SPA shell; whether the
|
|
58
69
|
* console mounts at all, and whether its data is readable, is decided by the agent config's
|
|
59
70
|
* `governanceAuthorize`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EACV,kBAAkB,IAAI,yBAAyB,EAC/C,oBAAoB,IAAI,2BAA2B,EACpD,MAAM,yBAAyB,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AAE5E,8FAA8F;AAC9F,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAExE
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EACV,kBAAkB,IAAI,yBAAyB,EAC/C,oBAAoB,IAAI,2BAA2B,EACpD,MAAM,yBAAyB,CAAC;AAEjC;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;AAE5E,8FAA8F;AAC9F,MAAM,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAExE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,WAAW,KACb,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iCAAiC,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3F;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iCAAiC,CAAC;IACtD;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,iBAAiB,CAAC,EAAE,iCAAiC,CAAC;IACtD,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED,6DAA6D;AAC7D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,GAAG,SAAS,GACvC,4BAA4B,CAQ9B;AAED,uGAAuG;AACvG,MAAM,MAAM,sBAAsB,GAC9B;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACpC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAoBvE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,mBAAmB,EAAE,wBAAwB,GAAG,SAAS,EACzD,iBAAiB,CAAC,EAAE,OAAO,GAC1B,sBAAsB,CAgBxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../../src/dashboard/define_config.ts"],"names":[],"mappings":"AA8GA,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB,CACpC,MAAwC;IAExC,MAAM,QAAQ,GAAiC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;IACpF,IAAI,MAAM,EAAE,IAAI,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IAC5D,IAAI,MAAM,EAAE,SAAS,KAAK,SAAS;QAAE,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC3E,IAAI,MAAM,EAAE,iBAAiB,KAAK,SAAS;QACzC,QAAQ,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;IACxD,IAAI,MAAM,EAAE,YAAY,KAAK,SAAS;QAAE,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACpF,OAAO,QAAQ,CAAC;AAClB,CAAC;AASD;;;;GAIG;AACH,MAAM,0BAA0B,GAC9B,0sBAA0sB,CAAC;AAE7sB;;;;;;GAMG;AACH,MAAM,6BAA6B,GACjC,ipBAAipB,CAAC;AAEppB;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,mBAAyD,EACzD,iBAA2B;IAE3B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC1D,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;IAC7F,CAAC;IACD,mGAAmG;IACnG,iGAAiG;IACjG,0FAA0F;IAC1F,IAAI,iBAAiB,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,6BAA6B;SACvC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -13,7 +13,8 @@ export type DashboardGateVerdict = {
|
|
|
13
13
|
* Decide whether a request may reach the dashboard, WITHOUT touching the response — so it is unit
|
|
14
14
|
* testable free of the AdonisJS router/app: resolve the actor through the agent config's resolver
|
|
15
15
|
* (missing/failed → `401`), then run the optional `authorize` gate over the resolved actor
|
|
16
|
-
* (
|
|
16
|
+
* (`true`/`{ allowed: true }` → proceed; `{ allowed: false, reason: 'unauthenticated' }` → `401`;
|
|
17
|
+
* `false`, `{ allowed: false }` or `reason: 'forbidden'` → `403`; threw → `403`).
|
|
17
18
|
*
|
|
18
19
|
* This gates the SPA **shell**, and only the shell. It is NOT what decides whether the console's data
|
|
19
20
|
* is readable, and it is no longer the last line of defence it once had to be:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/dashboard/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/dashboard/gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,iCAAiC,EAClC,MAAM,oBAAoB,CAAC;AAE5B,gGAAgG;AAChG,MAAM,MAAM,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAChB,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,SAAS,CAAC,EAAE,uBAAuB,EACnC,KAAK,UAAQ,EACb,iBAAiB,CAAC,EAAE,iCAAiC,GACpD,OAAO,CAAC,oBAAoB,CAAC,CAkC/B;AAED,8FAA8F;AAC9F,MAAM,WAAW,sBAAsB;IACrC,8FAA8F;IAC9F,QAAQ,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,OAAO,CAAC,oBAAoB,EAAE;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC,EACrD,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { resolveAuthorizeResult } from '../authorize-decision.js';
|
|
1
2
|
import { resolveAccessDeniedPage } from './access_denied_page.js';
|
|
2
3
|
/**
|
|
3
4
|
* Decide whether a request may reach the dashboard, WITHOUT touching the response — so it is unit
|
|
4
5
|
* testable free of the AdonisJS router/app: resolve the actor through the agent config's resolver
|
|
5
6
|
* (missing/failed → `401`), then run the optional `authorize` gate over the resolved actor
|
|
6
|
-
* (
|
|
7
|
+
* (`true`/`{ allowed: true }` → proceed; `{ allowed: false, reason: 'unauthenticated' }` → `401`;
|
|
8
|
+
* `false`, `{ allowed: false }` or `reason: 'forbidden'` → `403`; threw → `403`).
|
|
7
9
|
*
|
|
8
10
|
* This gates the SPA **shell**, and only the shell. It is NOT what decides whether the console's data
|
|
9
11
|
* is readable, and it is no longer the last line of defence it once had to be:
|
|
@@ -55,8 +57,12 @@ export async function evaluateDashboardGate(ctx, actorResolver, authorize, debug
|
|
|
55
57
|
}
|
|
56
58
|
if (authorize !== undefined) {
|
|
57
59
|
try {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
// A denying decision object is truthy — normalise, never truth-test the raw result.
|
|
61
|
+
const decision = resolveAuthorizeResult(await authorize(actor, ctx));
|
|
62
|
+
if (!decision.allowed) {
|
|
63
|
+
return decision.status === 401
|
|
64
|
+
? { ok: false, status: 401, error: 'unauthorized' }
|
|
65
|
+
: { ok: false, status: 403, error: 'forbidden' };
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
68
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/dashboard/gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/dashboard/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* so a package.json edge back from here to there would be circular. See
|
|
15
15
|
* `providers/dashboard_provider.ts`'s module doc for the full story.
|
|
16
16
|
*/
|
|
17
|
+
export type { AuthorizeDecision, AuthorizeResult } from '../authorize-decision.js';
|
|
17
18
|
export type { AccessDeniedInfo, AccessDeniedPageOptions, AccessDeniedReason, } from './access_denied_page.js';
|
|
18
19
|
export { CONSOLE as ACCESS_DENIED_CONSOLE, escapeHtml, renderAccessDeniedPage, resolveAccessDeniedPage, } from './access_denied_page.js';
|
|
19
20
|
export { type AccessDeniedOption, type AccessDeniedRenderer, type AgentDashboardAuthorize, type AgentDashboardConfig, type AgentDashboardUnauthenticatedHook, type DashboardMountDecision, decideDashboardMount, type ResolvedAgentDashboardConfig, resolveDashboardConfig, } from './define_config.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dashboard/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACnF,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,OAAO,IAAI,qBAAqB,EAChC,UAAU,EACV,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,oBAAoB,EACpB,KAAK,4BAA4B,EACjC,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dashboard/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/dashboard/index.ts"],"names":[],"mappings":"AAuBA,wFAAwF;AACxF,OAAO,EACL,OAAO,IAAI,qBAAqB,EAChC,UAAU,EACV,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAOL,oBAAoB,EAEpB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
|
@@ -202,8 +202,10 @@ export interface AgentConfig {
|
|
|
202
202
|
/**
|
|
203
203
|
* Authorization gate for the cross-actor `/agent/governance/*` read routes. It runs after the actor
|
|
204
204
|
* is resolved (the caller is authenticated) and decides whether THIS actor may read the platform-wide
|
|
205
|
-
* governance read-model — every actor's spend, usage, threads, and pending HITL approvals.
|
|
206
|
-
* `
|
|
205
|
+
* governance read-model — every actor's spend, usage, threads, and pending HITL approvals. Returns
|
|
206
|
+
* an `AuthorizeResult`: `true`/`{ allowed: true }` allows; `false`/`{ allowed: false }` (or
|
|
207
|
+
* `reason: 'forbidden'`) denies with `403`; `{ allowed: false, reason: 'unauthenticated' }` denies
|
|
208
|
+
* with `401`; throwing denies with `403`. A `location` header or body the hook wrote itself is kept.
|
|
207
209
|
*
|
|
208
210
|
* **The routes mount only when this gate exists.** Omit it and `/agent/governance/*` is NOT mounted
|
|
209
211
|
* at all (every route answers `404`), because an ungated cross-actor read-model exposes every
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,KAAK,EACV,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzD,sGAAsG;AACtG,MAAM,MAAM,YAAY,GAAG,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AACxE,iIAAiI;AACjI,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAE5F,uGAAuG;AACvG,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,oBAAoB,CAAC,EAAE;QACrB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;;;WAKG;QACH,SAAS,CAAC,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3D,iGAAiG;QACjG,UAAU,CAAC,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnE,CAAC;IACF;;;;;;;;;;;;;;;;;OAiBG;IACH,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,wBAAwB,CAAC;IAC/C;;;OAGG;IACH,KAAK,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACrC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,kBAAkB,CAAC;IAC1C,4FAA4F;IAC5F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,eAAe,GAAG,WAAW,CAAC;IACrC;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,aAAa,CAAC;IAC/F;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,iBAAiB,GAAG,cAAc,GAAG,KAAK,CAAC;IAC1D;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,YAAY,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;IAC3C;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,EAAE,sBAAsB,GAAG,wBAAwB,GAAG,KAAK,CAAC;IAC9E
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAuDA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,UAAU,GACX,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAuDA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAwY7B,mEAAmE;AACnE,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC;AA0BD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,UAAU,GACX,CAAC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { HttpContext } from '@adonisjs/core/http';
|
|
2
|
+
import { type AuthorizeResult } from './authorize-decision.js';
|
|
2
3
|
import type { Actor } from './types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Authorization gate for the cross-actor `/agent/governance/*` read routes. It runs AFTER the actor
|
|
5
6
|
* is resolved (so the caller is already authenticated), and decides whether THIS actor may read the
|
|
6
|
-
* platform-wide governance read-model (every actor's spend/usage/threads/approvals).
|
|
7
|
-
*
|
|
7
|
+
* platform-wide governance read-model (every actor's spend/usage/threads/approvals). Returns an
|
|
8
|
+
* {@link AuthorizeResult}: `true`/`{ allowed: true }` allows; `false`/`{ allowed: false }` denies
|
|
9
|
+
* with `403`; `{ allowed: false, reason: 'unauthenticated' }` denies with `401` and
|
|
10
|
+
* `{ allowed: false, reason: 'forbidden' }` with `403`. Throwing denies with `403`.
|
|
8
11
|
*
|
|
9
12
|
* The gate is what makes those routes exist: omit it and the provider does NOT mount
|
|
10
13
|
* `/agent/governance/*` at all (every route answers `404`). Set it to mount them gated, or set
|
|
@@ -15,11 +18,14 @@ import type { Actor } from './types.js';
|
|
|
15
18
|
* Mirrors `@adonis-agora/agent-dashboard`'s `authorize` hook so the JSON routes and the console SPA
|
|
16
19
|
* that reads them can be gated with the SAME predicate (typically "actor is ADMIN").
|
|
17
20
|
*/
|
|
18
|
-
export type AgentGovernanceAuthorize = (actor: Actor, ctx: HttpContext) =>
|
|
21
|
+
export type AgentGovernanceAuthorize = (actor: Actor, ctx: HttpContext) => AuthorizeResult | Promise<AuthorizeResult>;
|
|
19
22
|
/** The decision {@link evaluateGovernanceGate} returns: proceed, or reply `status` with `error`. */
|
|
20
23
|
export interface GovernanceGateVerdict {
|
|
21
24
|
ok: boolean;
|
|
22
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* The HTTP status to reply when `!ok`: `403`, or `401` when `authorize` returned
|
|
27
|
+
* `{ allowed: false, reason: 'unauthenticated' }`.
|
|
28
|
+
*/
|
|
23
29
|
status: number;
|
|
24
30
|
error?: string;
|
|
25
31
|
}
|
|
@@ -28,8 +34,11 @@ export interface GovernanceGateVerdict {
|
|
|
28
34
|
* core of the provider's governance gate, extracted so it can be unit tested without booting an app.
|
|
29
35
|
*
|
|
30
36
|
* - No `authorize` configured → `{ ok: true }` (see the caveat below — the provider never gets here).
|
|
31
|
-
* - `authorize` returns
|
|
32
|
-
* - `authorize` returns
|
|
37
|
+
* - `authorize` returns `true` / `{ allowed: true }` → `{ ok: true }`.
|
|
38
|
+
* - `authorize` returns `false` / `{ allowed: false }` (no reason) / `{ allowed: false, reason:
|
|
39
|
+
* 'forbidden' }` → `{ ok: false, status: 403 }`. A denying decision object is truthy, so it is
|
|
40
|
+
* normalised via {@link resolveAuthorizeResult}, never truth-tested.
|
|
41
|
+
* - `authorize` returns `{ allowed: false, reason: 'unauthenticated' }` → `{ ok: false, status: 401 }`.
|
|
33
42
|
* - `authorize` throws → `{ ok: false, status: 403 }` (fail-closed). `debug` decides whether the
|
|
34
43
|
* thrown `.message` reaches the client (`true`, e.g. local dev — the message is meant for whoever
|
|
35
44
|
* is wiring `governanceAuthorize`, useful to see while testing it) or a generic `'forbidden'`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"governance-gate.d.ts","sourceRoot":"","sources":["../../src/governance-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"governance-gate.d.ts","sourceRoot":"","sources":["../../src/governance-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,WAAW,KACb,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAEhD,oGAAoG;AACpG,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,WAAW,EAChB,SAAS,CAAC,EAAE,wBAAwB,EACpC,KAAK,UAAQ,GACZ,OAAO,CAAC,qBAAqB,CAAC,CAehC"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import { resolveAuthorizeResult } from './authorize-decision.js';
|
|
1
2
|
/**
|
|
2
3
|
* Decide whether an already-resolved actor holds cross-actor governance privilege — the router-free
|
|
3
4
|
* core of the provider's governance gate, extracted so it can be unit tested without booting an app.
|
|
4
5
|
*
|
|
5
6
|
* - No `authorize` configured → `{ ok: true }` (see the caveat below — the provider never gets here).
|
|
6
|
-
* - `authorize` returns
|
|
7
|
-
* - `authorize` returns
|
|
7
|
+
* - `authorize` returns `true` / `{ allowed: true }` → `{ ok: true }`.
|
|
8
|
+
* - `authorize` returns `false` / `{ allowed: false }` (no reason) / `{ allowed: false, reason:
|
|
9
|
+
* 'forbidden' }` → `{ ok: false, status: 403 }`. A denying decision object is truthy, so it is
|
|
10
|
+
* normalised via {@link resolveAuthorizeResult}, never truth-tested.
|
|
11
|
+
* - `authorize` returns `{ allowed: false, reason: 'unauthenticated' }` → `{ ok: false, status: 401 }`.
|
|
8
12
|
* - `authorize` throws → `{ ok: false, status: 403 }` (fail-closed). `debug` decides whether the
|
|
9
13
|
* thrown `.message` reaches the client (`true`, e.g. local dev — the message is meant for whoever
|
|
10
14
|
* is wiring `governanceAuthorize`, useful to see while testing it) or a generic `'forbidden'`
|
|
@@ -27,8 +31,12 @@ export async function evaluateGovernanceGate(actor, ctx, authorize, debug = fals
|
|
|
27
31
|
if (authorize === undefined)
|
|
28
32
|
return { ok: true, status: 200 };
|
|
29
33
|
try {
|
|
30
|
-
const
|
|
31
|
-
|
|
34
|
+
const decision = resolveAuthorizeResult(await authorize(actor, ctx));
|
|
35
|
+
if (decision.allowed)
|
|
36
|
+
return { ok: true, status: 200 };
|
|
37
|
+
return decision.status === 401
|
|
38
|
+
? { ok: false, status: 401, error: 'unauthorized' }
|
|
39
|
+
: { ok: false, status: 403, error: 'forbidden' };
|
|
32
40
|
}
|
|
33
41
|
catch (error) {
|
|
34
42
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"governance-gate.js","sourceRoot":"","sources":["../../src/governance-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"governance-gate.js","sourceRoot":"","sources":["../../src/governance-gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAoCvF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAY,EACZ,GAAgB,EAChB,SAAoC,EACpC,KAAK,GAAG,KAAK;IAEb,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,QAAQ,CAAC,OAAO;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACvD,OAAO,QAAQ,CAAC,MAAM,KAAK,GAAG;YAC5B,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE;YACnD,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,KAAK,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;SACrE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../../src/guardrails/detectors/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAS3C,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,KAAK,SAAW,GACf,OAAO,EAAE,CA4BX;AAID,iGAAiG;AACjG,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtC;
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../../src/guardrails/detectors/custom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAS3C,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,KAAK,SAAW,GACf,OAAO,EAAE,CA4BX;AAID,iGAAiG;AACjG,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQtC;AAyBD,wEAAwE;AACxE,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,SAAa,GACjB,OAAO,EAAE,CAkBX"}
|
|
@@ -57,12 +57,29 @@ export function fold(s) {
|
|
|
57
57
|
return out;
|
|
58
58
|
}
|
|
59
59
|
const escapeRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
60
|
+
const keywordPatterns = new Map();
|
|
61
|
+
/** The matcher for a word list, built once per distinct list (bounded like {@link compileGuardPattern}). */
|
|
62
|
+
function keywordPattern(words) {
|
|
63
|
+
const key = words.join('\u0000');
|
|
64
|
+
let re = keywordPatterns.get(key);
|
|
65
|
+
if (re === undefined) {
|
|
66
|
+
const clean = words.map((w) => fold(w.trim())).filter(Boolean);
|
|
67
|
+
re =
|
|
68
|
+
clean.length === 0
|
|
69
|
+
? null
|
|
70
|
+
: new RegExp(`(?<![\\p{L}\\p{N}_])(?:${clean.map(escapeRe).join('|')})(?![\\p{L}\\p{N}_])`, 'gu');
|
|
71
|
+
if (keywordPatterns.size > 1_000)
|
|
72
|
+
keywordPatterns.clear();
|
|
73
|
+
keywordPatterns.set(key, re);
|
|
74
|
+
}
|
|
75
|
+
return re;
|
|
76
|
+
}
|
|
60
77
|
/** Whole-word, case- and accent-insensitive keyword/phrase matching. */
|
|
61
78
|
export function detectKeywords(text, words, label = 'keywords') {
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
79
|
+
const re = keywordPattern(words);
|
|
80
|
+
if (re === null)
|
|
64
81
|
return [];
|
|
65
|
-
|
|
82
|
+
re.lastIndex = 0;
|
|
66
83
|
const folded = fold(text);
|
|
67
84
|
const out = [];
|
|
68
85
|
for (let m = re.exec(folded); m; m = re.exec(folded)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../../src/guardrails/detectors/custom.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../../src/guardrails/detectors/custom.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,23 @@ import type { SinkWriter, StreamFrame, TokenStreamSink } from './spi/token-strea
|
|
|
4
4
|
* subscriber replays everything so far, then follows live until the run ends. Good for a single
|
|
5
5
|
* replica; a multi-replica deployment needs a shared (Redis) sink so any pod can serve any run's
|
|
6
6
|
* stream. Identical (frame-for-frame) to the `InMemoryTokenStreamSink` shipped from `./testing`.
|
|
7
|
+
*
|
|
8
|
+
* A run's buffer is dropped an hour after its last write, ended or not, so a long-lived process does
|
|
9
|
+
* not keep every stream it ever served. The timers are `unref`'d: they never hold the process open.
|
|
7
10
|
*/
|
|
8
11
|
export declare class InProcessTokenStreamSink implements TokenStreamSink {
|
|
9
12
|
private readonly runs;
|
|
10
13
|
private buffer;
|
|
14
|
+
/**
|
|
15
|
+
* One timer per run, re-armed for whatever is left of the window when it fires early, so a write
|
|
16
|
+
* only stamps `touchedAt` instead of resetting a timer per token.
|
|
17
|
+
*/
|
|
18
|
+
private scheduleExpiry;
|
|
19
|
+
private drop;
|
|
11
20
|
private wake;
|
|
12
21
|
open(runId: string): SinkWriter;
|
|
13
22
|
subscribe(runId: string): AsyncIterable<StreamFrame>;
|
|
23
|
+
private follow;
|
|
14
24
|
has(runId: string): boolean;
|
|
15
25
|
close(runId: string): void;
|
|
16
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-process-sink.d.ts","sourceRoot":"","sources":["../../src/in-process-sink.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"in-process-sink.d.ts","sourceRoot":"","sources":["../../src/in-process-sink.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAoB3F;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IAC9D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgC;IAErD,OAAO,CAAC,MAAM;IAiBd;;;OAGG;IACH,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,IAAI;IAOZ,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAiB9B;IAED,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,WAAW,CAAC,CAEnD;YAEc,MAAM;IAwBrB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1B;IAED,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGzB;CACF"}
|