patchwork-os 1.2.0-beta.2.canary.650 → 1.2.0-beta.2.canary.652
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/butler/todoistObservation.d.ts +72 -0
- package/dist/butler/todoistObservation.js +85 -0
- package/dist/butler/todoistObservation.js.map +1 -0
- package/dist/connectors/todoist.d.ts +33 -0
- package/dist/connectors/todoist.js +49 -0
- package/dist/connectors/todoist.js.map +1 -1
- package/dist/identity/authSeam.d.ts +97 -0
- package/dist/identity/authSeam.js +107 -0
- package/dist/identity/authSeam.js.map +1 -0
- package/dist/identity/credentials.d.ts +70 -0
- package/dist/identity/credentials.js +140 -0
- package/dist/identity/credentials.js.map +1 -0
- package/dist/index.js +52 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todoist observation channel — turns live task state into grader input.
|
|
3
|
+
*
|
|
4
|
+
* The Butler ingester was merged with no way to observe anything, so its
|
|
5
|
+
* shadow ledger was empty and nothing could be measured. This is the first
|
|
6
|
+
* real channel.
|
|
7
|
+
*
|
|
8
|
+
* ## Why a connector query and not a scheduled LLM task
|
|
9
|
+
*
|
|
10
|
+
* A Claude-Desktop scheduled task was the easy route and is the wrong one: an
|
|
11
|
+
* LLM *gathering* observations can report `completed: true` for an errand it
|
|
12
|
+
* never checked. That poisons the trust ledger exactly as the LLM judge did —
|
|
13
|
+
* the one this repo replaced after it flipped verdicts between runs on
|
|
14
|
+
* identical inputs. Every value here comes from an HTTP response.
|
|
15
|
+
*
|
|
16
|
+
* ## The mapping, and the one rule that matters
|
|
17
|
+
*
|
|
18
|
+
* 200 + is_completed → completed: true a positive act
|
|
19
|
+
* 200 + !is_completed → stateObserved: true open, and we LOOKED
|
|
20
|
+
* 404 → deleted: true a positive act
|
|
21
|
+
* anything else → nothing at all NOT an observation
|
|
22
|
+
*
|
|
23
|
+
* That last line is the load-bearing one. 401, 429, 5xx and network failures
|
|
24
|
+
* yield an observation with no `stateObserved` and no `createdAt`, so the
|
|
25
|
+
* grader returns `unknown` / `not-observed` and the fold withholds it.
|
|
26
|
+
*
|
|
27
|
+
* Getting this wrong in either direction is a real harm and they are not
|
|
28
|
+
* symmetric:
|
|
29
|
+
*
|
|
30
|
+
* - reading a failure as `deleted` manufactures a NEGATIVE against a worker
|
|
31
|
+
* that did nothing wrong;
|
|
32
|
+
* - reading a failure as "observed but open" lets the staleness horizon turn
|
|
33
|
+
* an outage into a negative 14 days later, which is the same harm with a
|
|
34
|
+
* delay on it.
|
|
35
|
+
*
|
|
36
|
+
* Neither is available here: `unavailable` produces neither field.
|
|
37
|
+
*/
|
|
38
|
+
import type { TodoistConnector } from "../connectors/todoist.js";
|
|
39
|
+
import type { ErrandObservation } from "./outcomeIngester.js";
|
|
40
|
+
/** A task the ingester should look up, and the ref its grade is keyed on. */
|
|
41
|
+
export interface TodoistErrandRef {
|
|
42
|
+
/** Todoist task id. */
|
|
43
|
+
taskId: string;
|
|
44
|
+
/**
|
|
45
|
+
* Outcome-join key, `canonicalActionRef` form. Passed in rather than derived
|
|
46
|
+
* here: the ref must match what the fold would compute for the action, and
|
|
47
|
+
* re-deriving it in a second place is how two spellings of the same key
|
|
48
|
+
* appear and a confirmation attaches to nothing.
|
|
49
|
+
*/
|
|
50
|
+
ref: string;
|
|
51
|
+
/** Recipe that filed it, for attribution during review. */
|
|
52
|
+
recipe?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ObservationRun {
|
|
55
|
+
observations: ErrandObservation[];
|
|
56
|
+
/** Refs whose state could not be read, with the reason. Reported, never
|
|
57
|
+
* silently dropped — a channel that quietly skips failures looks identical
|
|
58
|
+
* to one with nothing to do. */
|
|
59
|
+
unavailable: {
|
|
60
|
+
ref: string;
|
|
61
|
+
reason: string;
|
|
62
|
+
}[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Look up each errand's task and build grader input.
|
|
66
|
+
*
|
|
67
|
+
* Sequential rather than parallel: Todoist rate-limits, `rate_limited` maps to
|
|
68
|
+
* `unavailable`, and a burst that trips the limit would convert a working
|
|
69
|
+
* channel into a batch of non-observations. Slow and complete beats fast and
|
|
70
|
+
* blank for a job that runs on a schedule.
|
|
71
|
+
*/
|
|
72
|
+
export declare function observeTodoistErrands(connector: Pick<TodoistConnector, "observeTask">, refs: readonly TodoistErrandRef[]): Promise<ObservationRun>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Todoist observation channel — turns live task state into grader input.
|
|
3
|
+
*
|
|
4
|
+
* The Butler ingester was merged with no way to observe anything, so its
|
|
5
|
+
* shadow ledger was empty and nothing could be measured. This is the first
|
|
6
|
+
* real channel.
|
|
7
|
+
*
|
|
8
|
+
* ## Why a connector query and not a scheduled LLM task
|
|
9
|
+
*
|
|
10
|
+
* A Claude-Desktop scheduled task was the easy route and is the wrong one: an
|
|
11
|
+
* LLM *gathering* observations can report `completed: true` for an errand it
|
|
12
|
+
* never checked. That poisons the trust ledger exactly as the LLM judge did —
|
|
13
|
+
* the one this repo replaced after it flipped verdicts between runs on
|
|
14
|
+
* identical inputs. Every value here comes from an HTTP response.
|
|
15
|
+
*
|
|
16
|
+
* ## The mapping, and the one rule that matters
|
|
17
|
+
*
|
|
18
|
+
* 200 + is_completed → completed: true a positive act
|
|
19
|
+
* 200 + !is_completed → stateObserved: true open, and we LOOKED
|
|
20
|
+
* 404 → deleted: true a positive act
|
|
21
|
+
* anything else → nothing at all NOT an observation
|
|
22
|
+
*
|
|
23
|
+
* That last line is the load-bearing one. 401, 429, 5xx and network failures
|
|
24
|
+
* yield an observation with no `stateObserved` and no `createdAt`, so the
|
|
25
|
+
* grader returns `unknown` / `not-observed` and the fold withholds it.
|
|
26
|
+
*
|
|
27
|
+
* Getting this wrong in either direction is a real harm and they are not
|
|
28
|
+
* symmetric:
|
|
29
|
+
*
|
|
30
|
+
* - reading a failure as `deleted` manufactures a NEGATIVE against a worker
|
|
31
|
+
* that did nothing wrong;
|
|
32
|
+
* - reading a failure as "observed but open" lets the staleness horizon turn
|
|
33
|
+
* an outage into a negative 14 days later, which is the same harm with a
|
|
34
|
+
* delay on it.
|
|
35
|
+
*
|
|
36
|
+
* Neither is available here: `unavailable` produces neither field.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* Look up each errand's task and build grader input.
|
|
40
|
+
*
|
|
41
|
+
* Sequential rather than parallel: Todoist rate-limits, `rate_limited` maps to
|
|
42
|
+
* `unavailable`, and a burst that trips the limit would convert a working
|
|
43
|
+
* channel into a batch of non-observations. Slow and complete beats fast and
|
|
44
|
+
* blank for a job that runs on a schedule.
|
|
45
|
+
*/
|
|
46
|
+
export async function observeTodoistErrands(connector, refs) {
|
|
47
|
+
const observations = [];
|
|
48
|
+
const unavailable = [];
|
|
49
|
+
for (const { taskId, ref, recipe } of refs) {
|
|
50
|
+
let result;
|
|
51
|
+
try {
|
|
52
|
+
result = await connector.observeTask(taskId);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
// A throw is not evidence either. The connector is not supposed to
|
|
56
|
+
// throw here, but "it returned a shape we did not expect" must not
|
|
57
|
+
// become a verdict about a worker.
|
|
58
|
+
unavailable.push({
|
|
59
|
+
ref,
|
|
60
|
+
reason: err instanceof Error ? err.message : "threw",
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (result.kind === "deleted") {
|
|
65
|
+
observations.push({ ref, deleted: true, ...(recipe ? { recipe } : {}) });
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (result.kind === "unavailable") {
|
|
69
|
+
unavailable.push({ ref, reason: result.reason });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
observations.push({
|
|
73
|
+
ref,
|
|
74
|
+
...(recipe ? { recipe } : {}),
|
|
75
|
+
completed: result.completed,
|
|
76
|
+
createdAt: result.createdAt,
|
|
77
|
+
// Set ONLY on a real 200. This is what licenses the staleness rule to
|
|
78
|
+
// turn silence into a negative, and silence is only evidence if
|
|
79
|
+
// somebody was listening.
|
|
80
|
+
stateObserved: true,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return { observations, unavailable };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=todoistObservation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todoistObservation.js","sourceRoot":"","sources":["../../src/butler/todoistObservation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AA4BH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAAgD,EAChD,IAAiC;IAEjC,MAAM,YAAY,GAAwB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAsC,EAAE,CAAC;IAE1D,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3C,IAAI,MAA4D,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mEAAmE;YACnE,mEAAmE;YACnE,mCAAmC;YACnC,WAAW,CAAC,IAAI,CAAC;gBACf,GAAG;gBACH,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;aACrD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QACD,YAAY,CAAC,IAAI,CAAC;YAChB,GAAG;YACH,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,sEAAsE;YACtE,gEAAgE;YAChE,0BAA0B;YAC1B,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -100,6 +100,39 @@ export declare class TodoistConnector extends BaseConnector {
|
|
|
100
100
|
private buildHeaders;
|
|
101
101
|
getTasks(projectId?: string, filter?: string, limit?: number): Promise<TodoistTask[]>;
|
|
102
102
|
getTask(id: string): Promise<TodoistTask>;
|
|
103
|
+
/**
|
|
104
|
+
* Observe a task for outcome grading — the ONE call the Butler ingester
|
|
105
|
+
* makes, and deliberately not `getTask`.
|
|
106
|
+
*
|
|
107
|
+
* `getTask` throws on every failure, which collapses three different facts
|
|
108
|
+
* into one: the task is gone, the token expired, the network is down. The
|
|
109
|
+
* grader's contract is explicit that a lookup failure must be reported as
|
|
110
|
+
* `undefined` and never as `deleted: true` — "a transient API error that
|
|
111
|
+
* reads as deletion would manufacture a negative against a worker that did
|
|
112
|
+
* nothing wrong."
|
|
113
|
+
*
|
|
114
|
+
* So this returns a discriminated result instead of throwing:
|
|
115
|
+
*
|
|
116
|
+
* `observed` — HTTP 200. `completed` is the task's own flag.
|
|
117
|
+
* `deleted` — HTTP 404 ONLY. Todoist returns 404 for a deleted task,
|
|
118
|
+
* and `not_found` is already a distinct error code here,
|
|
119
|
+
* so this does not have to infer deletion from a message.
|
|
120
|
+
* `unavailable` — everything else: 401, 403, 429, 5xx, network. NOT an
|
|
121
|
+
* observation, and the caller must not treat it as one.
|
|
122
|
+
*
|
|
123
|
+
* Additive on purpose. Changing `getTask` would alter behaviour for every
|
|
124
|
+
* existing caller to serve one new one.
|
|
125
|
+
*/
|
|
126
|
+
observeTask(id: string): Promise<{
|
|
127
|
+
kind: "observed";
|
|
128
|
+
completed: boolean;
|
|
129
|
+
createdAt: number;
|
|
130
|
+
} | {
|
|
131
|
+
kind: "deleted";
|
|
132
|
+
} | {
|
|
133
|
+
kind: "unavailable";
|
|
134
|
+
reason: string;
|
|
135
|
+
}>;
|
|
103
136
|
createTask(content: string, projectId?: string, description?: string, dueString?: string, priority?: number, labels?: string[]): Promise<TodoistTask>;
|
|
104
137
|
updateTask(id: string, content?: string, description?: string, dueString?: string, priority?: number, labels?: string[]): Promise<TodoistTask>;
|
|
105
138
|
closeTask(id: string): Promise<void>;
|
|
@@ -223,6 +223,55 @@ export class TodoistConnector extends BaseConnector {
|
|
|
223
223
|
throw new Error(result.error.message);
|
|
224
224
|
return result.data;
|
|
225
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* Observe a task for outcome grading — the ONE call the Butler ingester
|
|
228
|
+
* makes, and deliberately not `getTask`.
|
|
229
|
+
*
|
|
230
|
+
* `getTask` throws on every failure, which collapses three different facts
|
|
231
|
+
* into one: the task is gone, the token expired, the network is down. The
|
|
232
|
+
* grader's contract is explicit that a lookup failure must be reported as
|
|
233
|
+
* `undefined` and never as `deleted: true` — "a transient API error that
|
|
234
|
+
* reads as deletion would manufacture a negative against a worker that did
|
|
235
|
+
* nothing wrong."
|
|
236
|
+
*
|
|
237
|
+
* So this returns a discriminated result instead of throwing:
|
|
238
|
+
*
|
|
239
|
+
* `observed` — HTTP 200. `completed` is the task's own flag.
|
|
240
|
+
* `deleted` — HTTP 404 ONLY. Todoist returns 404 for a deleted task,
|
|
241
|
+
* and `not_found` is already a distinct error code here,
|
|
242
|
+
* so this does not have to infer deletion from a message.
|
|
243
|
+
* `unavailable` — everything else: 401, 403, 429, 5xx, network. NOT an
|
|
244
|
+
* observation, and the caller must not treat it as one.
|
|
245
|
+
*
|
|
246
|
+
* Additive on purpose. Changing `getTask` would alter behaviour for every
|
|
247
|
+
* existing caller to serve one new one.
|
|
248
|
+
*/
|
|
249
|
+
async observeTask(id) {
|
|
250
|
+
const result = await this.apiCall(async (token) => {
|
|
251
|
+
const res = await fetch(`${TODOIST_BASE}/tasks/${id}`, {
|
|
252
|
+
headers: this.buildHeaders(token),
|
|
253
|
+
});
|
|
254
|
+
if (!res.ok) {
|
|
255
|
+
throw Object.assign(new Error(`HTTP ${res.status}`), {
|
|
256
|
+
status: res.status,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
return res.json();
|
|
260
|
+
});
|
|
261
|
+
if ("error" in result) {
|
|
262
|
+
if (result.error.code === "not_found")
|
|
263
|
+
return { kind: "deleted" };
|
|
264
|
+
return { kind: "unavailable", reason: result.error.code };
|
|
265
|
+
}
|
|
266
|
+
const createdAt = Date.parse(result.data.created_at);
|
|
267
|
+
return {
|
|
268
|
+
kind: "observed",
|
|
269
|
+
completed: result.data.is_completed === true,
|
|
270
|
+
// An unparseable timestamp must not become 0 — that is 1970, which the
|
|
271
|
+
// staleness horizon would read as infinitely old and grade `junk`.
|
|
272
|
+
createdAt: Number.isFinite(createdAt) ? createdAt : Date.now(),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
226
275
|
async createTask(content, projectId, description, dueString, priority, labels) {
|
|
227
276
|
const result = await this.apiCall(async (token) => {
|
|
228
277
|
const body = { content };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todoist.js","sourceRoot":"","sources":["../../src/connectors/todoist.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"todoist.js","sourceRoot":"","sources":["../../src/connectors/todoist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The authentication seam — ADR-0020 Phase A, and the valuable half.
|
|
3
|
+
*
|
|
4
|
+
* One interface that answers "who is making this request?", with Phase A
|
|
5
|
+
* (local scrypt credentials against `members.json`) behind it today and Phase
|
|
6
|
+
* B (OIDC, mapped on `sub`) able to slot in later WITHOUT changing any
|
|
7
|
+
* consumer.
|
|
8
|
+
*
|
|
9
|
+
* Phase B is built in `patchwork-control-plane`, not here — ADR-0019 reserves
|
|
10
|
+
* organisation identity for the non-MIT repo, and the two ADRs were written in
|
|
11
|
+
* the same commit with this collision unexamined. The seam, `UNATTRIBUTED` and
|
|
12
|
+
* the fail-soft roster default are MIT and live here. Federation does not.
|
|
13
|
+
*
|
|
14
|
+
* ## UNATTRIBUTED is a value, not an absence
|
|
15
|
+
*
|
|
16
|
+
* The single most important rule in this file, and the one a reasonable
|
|
17
|
+
* implementation gets wrong: when nobody has authenticated, the answer is
|
|
18
|
+
* `UNATTRIBUTED` — never the implicit owner.
|
|
19
|
+
*
|
|
20
|
+
* The roster fails SOFT: a missing `members.json` yields one implicit owner so
|
|
21
|
+
* a single-user machine keeps working. That is right for "who may act on your
|
|
22
|
+
* own machine". It is catastrophic for "who did this", because defaulting an
|
|
23
|
+
* actor to the implicit owner writes a claim about a real person into an audit
|
|
24
|
+
* record on no evidence. An absent `actor` already means "nobody recorded
|
|
25
|
+
* this" and is never backfilled; a defaulted one is indistinguishable from a
|
|
26
|
+
* recorded one and is a lie the record cannot walk back.
|
|
27
|
+
*
|
|
28
|
+
* So `resolveActor` returns `UNATTRIBUTED` and callers must handle it. There
|
|
29
|
+
* is deliberately no `?? implicitOwner()` anywhere in this module, and a test
|
|
30
|
+
* asserts the string never appears.
|
|
31
|
+
*/
|
|
32
|
+
import type { Member } from "./members.js";
|
|
33
|
+
import { type Roster } from "./roster.js";
|
|
34
|
+
/**
|
|
35
|
+
* Nobody authenticated. Distinct from "authentication failed" only in that
|
|
36
|
+
* neither may ever be turned into a person.
|
|
37
|
+
*/
|
|
38
|
+
export declare const UNATTRIBUTED: "unattributed";
|
|
39
|
+
export type Principal = {
|
|
40
|
+
kind: "member";
|
|
41
|
+
member: Member;
|
|
42
|
+
via: string;
|
|
43
|
+
} | {
|
|
44
|
+
kind: typeof UNATTRIBUTED;
|
|
45
|
+
};
|
|
46
|
+
/** Credentials presented by a caller. Extended, never replaced, by Phase B. */
|
|
47
|
+
export interface Presented {
|
|
48
|
+
memberId?: string;
|
|
49
|
+
password?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* One authentication method. Phase A is `LocalPasswordProvider` below; Phase B
|
|
53
|
+
* would add an OIDC provider behind this same shape.
|
|
54
|
+
*
|
|
55
|
+
* Returning `null` means "not my business" — no credentials of my kind were
|
|
56
|
+
* presented. Returning `UNATTRIBUTED` means "mine were, and they were wrong".
|
|
57
|
+
* The distinction matters: the first lets another provider try, the second
|
|
58
|
+
* must not.
|
|
59
|
+
*/
|
|
60
|
+
export interface AuthProvider {
|
|
61
|
+
readonly name: string;
|
|
62
|
+
authenticate(presented: Presented, roster: Roster): Promise<Principal | null>;
|
|
63
|
+
}
|
|
64
|
+
/** Phase A: member id + password, verified against the stored scrypt record. */
|
|
65
|
+
export declare class LocalPasswordProvider implements AuthProvider {
|
|
66
|
+
private readonly credentialFor;
|
|
67
|
+
readonly name = "local-password";
|
|
68
|
+
/**
|
|
69
|
+
* `credentialFor` is injected rather than read from the Member type, because
|
|
70
|
+
* where a hash is STORED is a separate decision from how it is verified —
|
|
71
|
+
* and putting a password hash on the in-memory `Member` that decision
|
|
72
|
+
* records copy from is how a hash ends up in an audit log.
|
|
73
|
+
*/
|
|
74
|
+
constructor(credentialFor: (memberId: string) => string | undefined);
|
|
75
|
+
authenticate(presented: Presented, roster: Roster): Promise<Principal | null>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Try each provider in order; the first that claims the request decides.
|
|
79
|
+
*
|
|
80
|
+
* With no providers, or none claiming it, the answer is `UNATTRIBUTED`. That
|
|
81
|
+
* is the byte-identical status quo for a single-user machine with no
|
|
82
|
+
* credentials configured: nothing is denied here, because this module answers
|
|
83
|
+
* WHO, not WHETHER.
|
|
84
|
+
*/
|
|
85
|
+
export declare function resolveActor(presented: Presented, roster: Roster, providers: readonly AuthProvider[]): Promise<Principal>;
|
|
86
|
+
/**
|
|
87
|
+
* The actor snapshot to stamp on a decision record, or undefined.
|
|
88
|
+
*
|
|
89
|
+
* Undefined, NOT a placeholder person. Decision records store the actor as a
|
|
90
|
+
* snapshot (id + kind + display name as it was) so a later rename cannot
|
|
91
|
+
* rewrite history; absence stays absence.
|
|
92
|
+
*/
|
|
93
|
+
export declare function actorSnapshot(principal: Principal): {
|
|
94
|
+
id: string;
|
|
95
|
+
kind: Member["kind"];
|
|
96
|
+
displayName: string;
|
|
97
|
+
} | undefined;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The authentication seam — ADR-0020 Phase A, and the valuable half.
|
|
3
|
+
*
|
|
4
|
+
* One interface that answers "who is making this request?", with Phase A
|
|
5
|
+
* (local scrypt credentials against `members.json`) behind it today and Phase
|
|
6
|
+
* B (OIDC, mapped on `sub`) able to slot in later WITHOUT changing any
|
|
7
|
+
* consumer.
|
|
8
|
+
*
|
|
9
|
+
* Phase B is built in `patchwork-control-plane`, not here — ADR-0019 reserves
|
|
10
|
+
* organisation identity for the non-MIT repo, and the two ADRs were written in
|
|
11
|
+
* the same commit with this collision unexamined. The seam, `UNATTRIBUTED` and
|
|
12
|
+
* the fail-soft roster default are MIT and live here. Federation does not.
|
|
13
|
+
*
|
|
14
|
+
* ## UNATTRIBUTED is a value, not an absence
|
|
15
|
+
*
|
|
16
|
+
* The single most important rule in this file, and the one a reasonable
|
|
17
|
+
* implementation gets wrong: when nobody has authenticated, the answer is
|
|
18
|
+
* `UNATTRIBUTED` — never the implicit owner.
|
|
19
|
+
*
|
|
20
|
+
* The roster fails SOFT: a missing `members.json` yields one implicit owner so
|
|
21
|
+
* a single-user machine keeps working. That is right for "who may act on your
|
|
22
|
+
* own machine". It is catastrophic for "who did this", because defaulting an
|
|
23
|
+
* actor to the implicit owner writes a claim about a real person into an audit
|
|
24
|
+
* record on no evidence. An absent `actor` already means "nobody recorded
|
|
25
|
+
* this" and is never backfilled; a defaulted one is indistinguishable from a
|
|
26
|
+
* recorded one and is a lie the record cannot walk back.
|
|
27
|
+
*
|
|
28
|
+
* So `resolveActor` returns `UNATTRIBUTED` and callers must handle it. There
|
|
29
|
+
* is deliberately no `?? implicitOwner()` anywhere in this module, and a test
|
|
30
|
+
* asserts the string never appears.
|
|
31
|
+
*/
|
|
32
|
+
import { verifyPassword } from "./credentials.js";
|
|
33
|
+
import { findMember } from "./roster.js";
|
|
34
|
+
/**
|
|
35
|
+
* Nobody authenticated. Distinct from "authentication failed" only in that
|
|
36
|
+
* neither may ever be turned into a person.
|
|
37
|
+
*/
|
|
38
|
+
export const UNATTRIBUTED = "unattributed";
|
|
39
|
+
/** Phase A: member id + password, verified against the stored scrypt record. */
|
|
40
|
+
export class LocalPasswordProvider {
|
|
41
|
+
credentialFor;
|
|
42
|
+
name = "local-password";
|
|
43
|
+
/**
|
|
44
|
+
* `credentialFor` is injected rather than read from the Member type, because
|
|
45
|
+
* where a hash is STORED is a separate decision from how it is verified —
|
|
46
|
+
* and putting a password hash on the in-memory `Member` that decision
|
|
47
|
+
* records copy from is how a hash ends up in an audit log.
|
|
48
|
+
*/
|
|
49
|
+
constructor(credentialFor) {
|
|
50
|
+
this.credentialFor = credentialFor;
|
|
51
|
+
}
|
|
52
|
+
async authenticate(presented, roster) {
|
|
53
|
+
const { memberId, password } = presented;
|
|
54
|
+
if (!memberId || !password)
|
|
55
|
+
return null; // not our business
|
|
56
|
+
const member = findMember(roster, memberId);
|
|
57
|
+
const record = this.credentialFor(memberId);
|
|
58
|
+
// Both branches do the same work whether or not the member exists, so
|
|
59
|
+
// "no such member" and "wrong password" cost the same. Otherwise the
|
|
60
|
+
// response time enumerates the roster.
|
|
61
|
+
const stored = record ?? DUMMY_RECORD;
|
|
62
|
+
const ok = await verifyPassword(password, stored);
|
|
63
|
+
if (!ok || !member || !member.active || !record) {
|
|
64
|
+
// A deactivated member keeps their record and history and may do
|
|
65
|
+
// nothing — including authenticate.
|
|
66
|
+
return { kind: UNATTRIBUTED };
|
|
67
|
+
}
|
|
68
|
+
return { kind: "member", member, via: this.name };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A syntactically valid record no password verifies against, so the unknown-
|
|
73
|
+
* member path performs a real scrypt derivation instead of returning early.
|
|
74
|
+
* The salt and hash are fixed and meaningless; the point is the CPU time.
|
|
75
|
+
*/
|
|
76
|
+
const DUMMY_RECORD = "scrypt$32768$8$1$AAAAAAAAAAAAAAAAAAAAAA==$" +
|
|
77
|
+
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
|
|
78
|
+
/**
|
|
79
|
+
* Try each provider in order; the first that claims the request decides.
|
|
80
|
+
*
|
|
81
|
+
* With no providers, or none claiming it, the answer is `UNATTRIBUTED`. That
|
|
82
|
+
* is the byte-identical status quo for a single-user machine with no
|
|
83
|
+
* credentials configured: nothing is denied here, because this module answers
|
|
84
|
+
* WHO, not WHETHER.
|
|
85
|
+
*/
|
|
86
|
+
export async function resolveActor(presented, roster, providers) {
|
|
87
|
+
for (const p of providers) {
|
|
88
|
+
const result = await p.authenticate(presented, roster);
|
|
89
|
+
if (result !== null)
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
return { kind: UNATTRIBUTED };
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The actor snapshot to stamp on a decision record, or undefined.
|
|
96
|
+
*
|
|
97
|
+
* Undefined, NOT a placeholder person. Decision records store the actor as a
|
|
98
|
+
* snapshot (id + kind + display name as it was) so a later rename cannot
|
|
99
|
+
* rewrite history; absence stays absence.
|
|
100
|
+
*/
|
|
101
|
+
export function actorSnapshot(principal) {
|
|
102
|
+
if (principal.kind === UNATTRIBUTED)
|
|
103
|
+
return undefined;
|
|
104
|
+
const { id, kind, displayName } = principal.member;
|
|
105
|
+
return { id, kind, displayName };
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=authSeam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authSeam.js","sourceRoot":"","sources":["../../src/identity/authSeam.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,cAAuB,CAAC;AA0BpD,gFAAgF;AAChF,MAAM,OAAO,qBAAqB;IAUb;IATV,IAAI,GAAG,gBAAgB,CAAC;IAEjC;;;;;OAKG;IACH,YACmB,aAAuD;QAAvD,kBAAa,GAAb,aAAa,CAA0C;IACvE,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,SAAoB,EACpB,MAAc;QAEd,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;QACzC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAC,mBAAmB;QAE5D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE5C,sEAAsE;QACtE,qEAAqE;QACrE,uCAAuC;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,YAAY,CAAC;QACtC,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAElD,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,iEAAiE;YACjE,oCAAoC;YACpC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACpD,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,YAAY,GAChB,4CAA4C;IAC5C,sFAAsF,CAAC;AAEzF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAoB,EACpB,MAAc,EACd,SAAkC;IAElC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAoB;IAEpB,IAAI,SAAS,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-member local credentials — ADR-0020 Phase A.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this exists
|
|
5
|
+
*
|
|
6
|
+
* `canApproveAction` is referenced by nothing in production, and not because
|
|
7
|
+
* anyone forgot. The bridge authenticates ONE shared bearer token, and the
|
|
8
|
+
* dashboard session cookie's signed payload is literally `v1.${expiresAt}` —
|
|
9
|
+
* not "no subject field" but no field except expiry. Every approver is
|
|
10
|
+
* indistinguishable at the auth layer, so segregation of duties is
|
|
11
|
+
* unenforceable rather than merely unimplemented, and no decision record can
|
|
12
|
+
* honestly name a person.
|
|
13
|
+
*
|
|
14
|
+
* ## `crypto.scrypt`, from the standard library
|
|
15
|
+
*
|
|
16
|
+
* The dependency audit is unambiguous: no bcrypt, argon2, passport, next-auth
|
|
17
|
+
* or jose in this tree, direct or dev. Adding a native-compilation
|
|
18
|
+
* password-hashing dependency to a project that installs globally on macOS,
|
|
19
|
+
* Linux and Windows — and which already documents a macOS TCC symlink footgun
|
|
20
|
+
* around global installs — buys a marginally better KDF for a real
|
|
21
|
+
* cross-platform install risk. scrypt is memory-hard, in the standard library,
|
|
22
|
+
* and present in every runtime the bridge already targets.
|
|
23
|
+
*
|
|
24
|
+
* ## What this module does NOT do
|
|
25
|
+
*
|
|
26
|
+
* It does not read the roster, does not decide authorisation, and does not
|
|
27
|
+
* touch the dashboard cookie. Verifying a secret and deciding what somebody
|
|
28
|
+
* may do are different questions, and the cookie change touches ten consumers
|
|
29
|
+
* and wants its own review. This is the half with no blast radius.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* scrypt parameters, stored per-hash rather than assumed.
|
|
33
|
+
*
|
|
34
|
+
* Encoding them in the record is what makes them changeable later: a stored
|
|
35
|
+
* hash that does not say how it was derived can only be verified by a
|
|
36
|
+
* constant, so raising the cost would silently invalidate every existing
|
|
37
|
+
* credential instead of upgrading it.
|
|
38
|
+
*
|
|
39
|
+
* N=2^15 with r=8, p=1 is ~32 MB of memory per verification. `maxmem` must be
|
|
40
|
+
* raised above Node's 32 MB default or scrypt throws at these parameters —
|
|
41
|
+
* a footgun that presents as "the correct password is rejected".
|
|
42
|
+
*/
|
|
43
|
+
export declare const SCRYPT_PARAMS: {
|
|
44
|
+
readonly N: 32768;
|
|
45
|
+
readonly r: 8;
|
|
46
|
+
readonly p: 1;
|
|
47
|
+
};
|
|
48
|
+
/** Serialised credential: `scrypt$N$r$p$<saltB64>$<hashB64>`. */
|
|
49
|
+
export type CredentialRecord = string;
|
|
50
|
+
/** Hash a password for storage. A fresh 16-byte salt per call. */
|
|
51
|
+
export declare function hashPassword(password: string, params?: {
|
|
52
|
+
N: number;
|
|
53
|
+
r: number;
|
|
54
|
+
p: number;
|
|
55
|
+
}): Promise<CredentialRecord>;
|
|
56
|
+
/**
|
|
57
|
+
* Verify a password against a stored record.
|
|
58
|
+
*
|
|
59
|
+
* Returns false for a malformed record rather than throwing: a corrupt
|
|
60
|
+
* credential must read as "this password is wrong", not as an exception a
|
|
61
|
+
* caller might catch and treat as a pass. It is the same fail-closed reasoning
|
|
62
|
+
* as ADR-0016 — deciding whether an action happens defaults to no.
|
|
63
|
+
*
|
|
64
|
+
* The comparison is `timingSafeEqual` on the derived key. Lengths are checked
|
|
65
|
+
* first because it throws on a length mismatch, and a thrown comparison is a
|
|
66
|
+
* timing signal of its own.
|
|
67
|
+
*/
|
|
68
|
+
export declare function verifyPassword(password: string, record: CredentialRecord): Promise<boolean>;
|
|
69
|
+
/** True when a string is a well-formed credential record. */
|
|
70
|
+
export declare function isCredentialRecord(value: unknown): value is CredentialRecord;
|