@nestos/kanban 0.0.0-stage → 0.5.2
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 +674 -0
- package/README.md +165 -2
- package/dist/activity-BbC4sgKL.d.cts +258 -0
- package/dist/activity-Czlan5xW.d.ts +258 -0
- package/dist/activity-module-DaO1Rry0.d.cts +22 -0
- package/dist/activity-module-T22wliZu.d.ts +22 -0
- package/dist/activity-ports-Dqxa86zT.d.cts +12 -0
- package/dist/activity-ports-cxfrelaL.d.ts +12 -0
- package/dist/activity.cjs +16 -0
- package/dist/activity.cjs.map +1 -0
- package/dist/activity.d.cts +12 -0
- package/dist/activity.d.ts +12 -0
- package/dist/activity.js +16 -0
- package/dist/activity.js.map +1 -0
- package/dist/chunk-3JYLJPE5.js +95 -0
- package/dist/chunk-3JYLJPE5.js.map +1 -0
- package/dist/chunk-3LEIHB7Y.js +221 -0
- package/dist/chunk-3LEIHB7Y.js.map +1 -0
- package/dist/chunk-4XF6LQSU.cjs +9 -0
- package/dist/chunk-4XF6LQSU.cjs.map +1 -0
- package/dist/chunk-5Q7WB63A.cjs +282 -0
- package/dist/chunk-5Q7WB63A.cjs.map +1 -0
- package/dist/chunk-7KDOTBRX.cjs +58 -0
- package/dist/chunk-7KDOTBRX.cjs.map +1 -0
- package/dist/chunk-AHHEGTUA.js +148 -0
- package/dist/chunk-AHHEGTUA.js.map +1 -0
- package/dist/chunk-AOHQCX7K.cjs +95 -0
- package/dist/chunk-AOHQCX7K.cjs.map +1 -0
- package/dist/chunk-DINLR6E6.cjs +443 -0
- package/dist/chunk-DINLR6E6.cjs.map +1 -0
- package/dist/chunk-EYTVC2H5.cjs +1612 -0
- package/dist/chunk-EYTVC2H5.cjs.map +1 -0
- package/dist/chunk-FEE2YBZ7.js +1972 -0
- package/dist/chunk-FEE2YBZ7.js.map +1 -0
- package/dist/chunk-FNO5K3A7.js +282 -0
- package/dist/chunk-FNO5K3A7.js.map +1 -0
- package/dist/chunk-IHHDXZPZ.js +382 -0
- package/dist/chunk-IHHDXZPZ.js.map +1 -0
- package/dist/chunk-J3EAIVA3.js +280 -0
- package/dist/chunk-J3EAIVA3.js.map +1 -0
- package/dist/chunk-KH3WF3K4.js +443 -0
- package/dist/chunk-KH3WF3K4.js.map +1 -0
- package/dist/chunk-M35X5PHO.js +196 -0
- package/dist/chunk-M35X5PHO.js.map +1 -0
- package/dist/chunk-QRGZD2JU.cjs +1972 -0
- package/dist/chunk-QRGZD2JU.cjs.map +1 -0
- package/dist/chunk-RBOER6EW.cjs +221 -0
- package/dist/chunk-RBOER6EW.cjs.map +1 -0
- package/dist/chunk-RQP77ZTY.js +9 -0
- package/dist/chunk-RQP77ZTY.js.map +1 -0
- package/dist/chunk-RSH6QSEC.cjs +196 -0
- package/dist/chunk-RSH6QSEC.cjs.map +1 -0
- package/dist/chunk-VMRDXOLX.cjs +148 -0
- package/dist/chunk-VMRDXOLX.cjs.map +1 -0
- package/dist/chunk-X4UHZX6F.js +58 -0
- package/dist/chunk-X4UHZX6F.js.map +1 -0
- package/dist/chunk-XBSGUVCY.cjs +382 -0
- package/dist/chunk-XBSGUVCY.cjs.map +1 -0
- package/dist/chunk-XKDZHAUE.js +1612 -0
- package/dist/chunk-XKDZHAUE.js.map +1 -0
- package/dist/chunk-ZUZGAO6G.cjs +280 -0
- package/dist/chunk-ZUZGAO6G.cjs.map +1 -0
- package/dist/content-C5aJZFlw.d.cts +35 -0
- package/dist/content-hLH5BNud.d.ts +35 -0
- package/dist/contracts/index.cjs +31 -0
- package/dist/contracts/index.cjs.map +1 -0
- package/dist/contracts/index.d.cts +5 -0
- package/dist/contracts/index.d.ts +5 -0
- package/dist/contracts/index.js +31 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/discovery-9E-LfwIw.d.cts +61 -0
- package/dist/discovery-D60yrjej.d.ts +61 -0
- package/dist/discovery.cjs +377 -0
- package/dist/discovery.cjs.map +1 -0
- package/dist/discovery.d.cts +22 -0
- package/dist/discovery.d.ts +22 -0
- package/dist/discovery.js +377 -0
- package/dist/discovery.js.map +1 -0
- package/dist/execution-bridge-fpCnH6z5.d.cts +52 -0
- package/dist/execution-bridge-rk0uVy_n.d.ts +52 -0
- package/dist/execution.cjs +18 -0
- package/dist/execution.cjs.map +1 -0
- package/dist/execution.d.cts +42 -0
- package/dist/execution.d.ts +42 -0
- package/dist/execution.js +18 -0
- package/dist/execution.js.map +1 -0
- package/dist/index.cjs +74 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +54 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/module-CYfE7YhM.d.ts +11 -0
- package/dist/module-Ca9L3qCn.d.cts +11 -0
- package/dist/planning-CHrOqQ6b.d.cts +879 -0
- package/dist/planning-CHrOqQ6b.d.ts +879 -0
- package/dist/ports-B0McVg7B.d.ts +143 -0
- package/dist/ports-BeGO1VRI.d.cts +49 -0
- package/dist/ports-GQy0x-RI.d.cts +143 -0
- package/dist/ports-ykGiNUSx.d.ts +49 -0
- package/dist/runtime/index.cjs +205 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +75 -0
- package/dist/runtime/index.d.ts +75 -0
- package/dist/runtime/index.js +205 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/integration.cjs +423 -0
- package/dist/runtime/integration.cjs.map +1 -0
- package/dist/runtime/integration.d.cts +658 -0
- package/dist/runtime/integration.d.ts +658 -0
- package/dist/runtime/integration.js +423 -0
- package/dist/runtime/integration.js.map +1 -0
- package/dist/storage.cjs +21 -0
- package/dist/storage.cjs.map +1 -0
- package/dist/storage.d.cts +71 -0
- package/dist/storage.d.ts +71 -0
- package/dist/storage.js +21 -0
- package/dist/storage.js.map +1 -0
- package/dist/store-DPwHzGiz.d.cts +28 -0
- package/dist/store-DgdrPCV9.d.ts +28 -0
- package/dist/task-projection-CSorlMws.d.ts +11 -0
- package/dist/task-projection-DKKB_ueb.d.cts +11 -0
- package/examples/standalone.ts +22 -0
- package/package.json +143 -4
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunk7KDOTBRXcjs = require('./chunk-7KDOTBRX.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkRSH6QSECcjs = require('./chunk-RSH6QSEC.cjs');
|
|
8
|
+
|
|
9
|
+
// src/discovery-state.ts
|
|
10
|
+
function discoveryState(state) {
|
|
11
|
+
return _optionalChain([state, 'optionalAccess', _ => _.discovery]);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// src/configuration.ts
|
|
15
|
+
function policy(input = {}) {
|
|
16
|
+
return {
|
|
17
|
+
claimTimeoutMs: 864e5,
|
|
18
|
+
leaseMs: 6e5,
|
|
19
|
+
progressTimeoutMs: 36e5,
|
|
20
|
+
transferTimeoutMs: 18e5,
|
|
21
|
+
maxComplexity: 10,
|
|
22
|
+
maxWorkUnits: 100,
|
|
23
|
+
maxDurationMs: 288e5,
|
|
24
|
+
escalationSessionIds: [],
|
|
25
|
+
...input
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function workTypes(board) {
|
|
29
|
+
return _nullishCoalesce(board.workTypes, () => ( _chunk7KDOTBRXcjs.DEFAULT_KANBAN_WORK_TYPES));
|
|
30
|
+
}
|
|
31
|
+
function workType(board, id) {
|
|
32
|
+
const found = workTypes(board).find((type) => type.id === id);
|
|
33
|
+
requireValue(found, "UNKNOWN_WORK_TYPE");
|
|
34
|
+
return found;
|
|
35
|
+
}
|
|
36
|
+
function executable(board, item) {
|
|
37
|
+
workType(board, _nullishCoalesce(_nullishCoalesce(_optionalChain([item, 'access', _2 => _2.planning, 'optionalAccess', _3 => _3.kind]), () => ( board.defaultWorkType)), () => ( "task")));
|
|
38
|
+
return _chunk7KDOTBRXcjs.executableWorkItem.call(void 0, board, item);
|
|
39
|
+
}
|
|
40
|
+
function validateConfiguration(board) {
|
|
41
|
+
const types = workTypes(board);
|
|
42
|
+
requireValue(types.length > 0 && types.length <= 20, "WORK_TYPE_LIMIT");
|
|
43
|
+
requireValue(new Set(types.map((t) => t.id)).size === types.length, "DUPLICATE_WORK_TYPE");
|
|
44
|
+
for (const type of types) {
|
|
45
|
+
identity(type.id);
|
|
46
|
+
text(type.label);
|
|
47
|
+
requireValue(Number.isInteger(type.rank) && type.rank >= 0 && type.rank <= 9 && typeof type.executable === "boolean", "INVALID_WORK_TYPE");
|
|
48
|
+
}
|
|
49
|
+
workType(board, _nullishCoalesce(board.defaultWorkType, () => ( "task")));
|
|
50
|
+
const members = roster(board);
|
|
51
|
+
requireValue(members.length > 0, "MEMBER_ROSTER_REQUIRED");
|
|
52
|
+
requireValue(new Set(members.map(principalKey)).size === members.length, "DUPLICATE_MEMBER");
|
|
53
|
+
for (const member of members) {
|
|
54
|
+
identity(member.id);
|
|
55
|
+
requireValue(["agent", "human", "service"].includes(member.kind), "INVALID_PRINCIPAL");
|
|
56
|
+
}
|
|
57
|
+
for (const member of _nullishCoalesce(board.members, () => ( []))) {
|
|
58
|
+
text(member.responsibility);
|
|
59
|
+
requireValue(!member.roles || member.roles.every((r) => ["worker", "reviewer", "coordinator"].includes(r)), "INVALID_MEMBER_ROLE");
|
|
60
|
+
}
|
|
61
|
+
validateColumns(board);
|
|
62
|
+
for (const [kind, value] of Object.entries(_nullishCoalesce(_optionalChain([board, 'access', _4 => _4.notifications, 'optionalAccess', _5 => _5.rules]), () => ( {}))))
|
|
63
|
+
requireValue(/^[a-z][a-z0-9.-]{0,79}$/.test(kind) && ["info", "error", "none"].includes(value), "INVALID_NOTIFICATION_RULE");
|
|
64
|
+
}
|
|
65
|
+
function validateColumns(board) {
|
|
66
|
+
if (!board.columns) return;
|
|
67
|
+
const states = board.columns.flatMap((c) => c.states);
|
|
68
|
+
requireValue(states.length === 7 && new Set(states).size === 7 && ["proposed", "backlog", "open", "claimed", "review", "completed", "cancelled"].every((s) => states.includes(s)), "INVALID_COLUMNS");
|
|
69
|
+
requireValue(new Set(board.columns.map((c) => c.id)).size === board.columns.length, "DUPLICATE_COLUMN");
|
|
70
|
+
for (const column of board.columns) {
|
|
71
|
+
identity(column.id);
|
|
72
|
+
text(column.label);
|
|
73
|
+
requireValue(column.states.length > 0, "EMPTY_COLUMN");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/rules.ts
|
|
78
|
+
function requireValue(condition, code) {
|
|
79
|
+
if (!condition) throw new (0, _chunkRSH6QSECcjs.KanbanError)(code);
|
|
80
|
+
}
|
|
81
|
+
function text(value) {
|
|
82
|
+
requireValue(typeof value === "string" && value.trim().length > 0 && value.length <= 8e3, "INVALID_TEXT");
|
|
83
|
+
}
|
|
84
|
+
function identity(value) {
|
|
85
|
+
requireValue(typeof value === "string" && value.length > 0 && value.length <= 256 && !["__proto__", "prototype", "constructor"].includes(value), "INVALID_ID");
|
|
86
|
+
}
|
|
87
|
+
function positive(value) {
|
|
88
|
+
requireValue(Number.isFinite(value) && value > 0, "INVALID_THRESHOLD");
|
|
89
|
+
}
|
|
90
|
+
function validateEstimate(estimate) {
|
|
91
|
+
positive(estimate.complexity);
|
|
92
|
+
positive(estimate.workUnits);
|
|
93
|
+
positive(estimate.durationMs);
|
|
94
|
+
requireValue(["low", "medium", "high"].includes(estimate.confidence), "INVALID_CONFIDENCE");
|
|
95
|
+
}
|
|
96
|
+
function validateBoard(board) {
|
|
97
|
+
identity(board.id);
|
|
98
|
+
text(board.title);
|
|
99
|
+
requireValue(["system", "project", "collection"].includes(board.scope.kind), "INVALID_SCOPE");
|
|
100
|
+
if (board.scope.kind === "project") identity(board.scope.projectId);
|
|
101
|
+
if (board.scope.kind === "collection") {
|
|
102
|
+
identity(board.scope.namespace);
|
|
103
|
+
identity(board.scope.id);
|
|
104
|
+
}
|
|
105
|
+
validateConfiguration(board);
|
|
106
|
+
for (const agent of _nullishCoalesce(board.agents, () => ( []))) {
|
|
107
|
+
identity(agent.agentId);
|
|
108
|
+
text(agent.responsibility);
|
|
109
|
+
}
|
|
110
|
+
requireValue(new Set((_nullishCoalesce(board.agents, () => ( []))).map((a) => a.agentId)).size === (_nullishCoalesce(board.agents, () => ( []))).length, "DUPLICATE_AGENT");
|
|
111
|
+
const p = board.policy;
|
|
112
|
+
for (const value of [p.maxReady, p.maxInProgress, p.maxInProgressPerAgent, p.maxInProgressPerAssignee]) if (value !== void 0) requireValue(Number.isSafeInteger(value) && value > 0, "INVALID_LIMIT");
|
|
113
|
+
requireValue(p.maxInProgressPerAgent === void 0 || p.maxInProgressPerAssignee === void 0 || p.maxInProgressPerAgent === p.maxInProgressPerAssignee, "POLICY_LIMIT_CONFLICT");
|
|
114
|
+
for (const value of [p.archiveAfterMs, p.backlogReviewMs]) if (value !== void 0) positive(value);
|
|
115
|
+
for (const value of [
|
|
116
|
+
p.claimTimeoutMs,
|
|
117
|
+
p.leaseMs,
|
|
118
|
+
p.progressTimeoutMs,
|
|
119
|
+
p.transferTimeoutMs,
|
|
120
|
+
p.maxComplexity,
|
|
121
|
+
p.maxWorkUnits,
|
|
122
|
+
p.maxDurationMs
|
|
123
|
+
]) positive(value);
|
|
124
|
+
requireValue(Array.isArray(p.escalationSessionIds), "INVALID_ESCALATION_TARGETS");
|
|
125
|
+
requireValue(p.review === void 0 || ["independent", "assignee"].includes(p.review), "INVALID_REVIEW_POLICY");
|
|
126
|
+
requireValue(p.requireEstimate === void 0 || typeof p.requireEstimate === "boolean", "INVALID_ESTIMATE_POLICY");
|
|
127
|
+
p.escalationSessionIds.forEach(identity);
|
|
128
|
+
}
|
|
129
|
+
function participant(list, sessionId, agentId, role, subscribed, now) {
|
|
130
|
+
identity(sessionId);
|
|
131
|
+
requireValue(["creator", "owner", "consultant", "reviewer", "observer", "escalation"].includes(role), "INVALID_ROLE");
|
|
132
|
+
let entry = list.find((value) => value.sessionId === sessionId);
|
|
133
|
+
if (!entry) {
|
|
134
|
+
entry = { sessionId, agentId, roles: [], subscribed, joinedAt: now };
|
|
135
|
+
list.push(entry);
|
|
136
|
+
}
|
|
137
|
+
if (entry.agentId && agentId) requireValue(entry.agentId === agentId, "SESSION_AGENT_CONFLICT");
|
|
138
|
+
entry.agentId ??= agentId;
|
|
139
|
+
if (!entry.roles.includes(role)) entry.roles.push(role);
|
|
140
|
+
entry.subscribed = subscribed;
|
|
141
|
+
}
|
|
142
|
+
function owned(item, actor, token, now) {
|
|
143
|
+
requireValue(item.status === "claimed", "ITEM_NOT_RUNNING");
|
|
144
|
+
requireValue(item.owner && sameOwner(item.owner, actor) && item.owner.token === token, "OWNER_MISMATCH");
|
|
145
|
+
requireValue(item.owner.leaseUntil > now, "LEASE_EXPIRED");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// src/identity.ts
|
|
149
|
+
function principal(actor) {
|
|
150
|
+
const kind = _nullishCoalesce(actor.kind, () => ( "agent")), id = kind === "agent" ? _nullishCoalesce(actor.agentId, () => ( actor.id)) : actor.id;
|
|
151
|
+
requireValue(["agent", "human", "service"].includes(kind) && id, "INVALID_ACTOR");
|
|
152
|
+
identity(id);
|
|
153
|
+
if (kind === "agent") {
|
|
154
|
+
requireValue(!actor.agentId || !actor.id || actor.agentId === actor.id, "ACTOR_ID_MISMATCH");
|
|
155
|
+
if (actor.sessionId !== void 0) identity(actor.sessionId);
|
|
156
|
+
if (actor.taskId !== void 0) identity(actor.taskId);
|
|
157
|
+
}
|
|
158
|
+
return { kind, id };
|
|
159
|
+
}
|
|
160
|
+
function principalKey(value) {
|
|
161
|
+
return JSON.stringify([value.kind, value.id]);
|
|
162
|
+
}
|
|
163
|
+
function assigneeKey(value) {
|
|
164
|
+
return _nullishCoalesce(value.principalId, () => ( principalKey({ kind: "agent", id: value.agentId })));
|
|
165
|
+
}
|
|
166
|
+
function sameOwner(owner, actor) {
|
|
167
|
+
const value = principal(actor);
|
|
168
|
+
return assigneeKey(owner) === principalKey(value) && (value.kind !== "agent" || owner.sessionId === actor.sessionId && owner.taskId === actor.taskId);
|
|
169
|
+
}
|
|
170
|
+
function roster(board) {
|
|
171
|
+
return [...(_nullishCoalesce(board.agents, () => ( []))).map((a) => ({ kind: "agent", id: a.agentId })), ..._nullishCoalesce(board.members, () => ( []))];
|
|
172
|
+
}
|
|
173
|
+
function candidates(board, item) {
|
|
174
|
+
if (item.eligibleAgentIds === void 0 && item.eligiblePrincipals === void 0)
|
|
175
|
+
return [
|
|
176
|
+
...(_nullishCoalesce(board.agents, () => ( []))).map((a) => ({ kind: "agent", id: a.agentId })),
|
|
177
|
+
...(_nullishCoalesce(board.members, () => ( []))).filter((m) => !m.roles || m.roles.includes("worker"))
|
|
178
|
+
];
|
|
179
|
+
return [...(_nullishCoalesce(item.eligibleAgentIds, () => ( []))).map((id) => ({ kind: "agent", id })), ..._nullishCoalesce(item.eligiblePrincipals, () => ( []))];
|
|
180
|
+
}
|
|
181
|
+
function eligible(board, item, actor) {
|
|
182
|
+
const key = principalKey(principal(actor));
|
|
183
|
+
requireValue(candidates(board, item).some((p) => principalKey(p) === key), actor.kind && actor.kind !== "agent" ? "ASSIGNEE_NOT_ELIGIBLE" : "AGENT_NOT_ELIGIBLE");
|
|
184
|
+
}
|
|
185
|
+
function validateCandidates(board, item, executable2) {
|
|
186
|
+
const allowed = new Set(roster(board).map(principalKey)), values = candidates(board, item);
|
|
187
|
+
requireValue(!executable2 || values.length > 0, "ELIGIBLE_ASSIGNEES_REQUIRED");
|
|
188
|
+
for (const value of values) {
|
|
189
|
+
identity(value.id);
|
|
190
|
+
requireValue(["agent", "human", "service"].includes(value.kind), "INVALID_PRINCIPAL");
|
|
191
|
+
requireValue(allowed.has(principalKey(value)), value.kind === "agent" ? "AGENT_NOT_REGISTERED" : "ASSIGNEE_NOT_REGISTERED");
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function normalizeActor(actor) {
|
|
195
|
+
const value = principal(actor);
|
|
196
|
+
return value.kind === "agent" ? { agentId: value.id, sessionId: actor.sessionId, taskId: actor.taskId } : { kind: value.kind, id: value.id };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
exports.principal = principal; exports.principalKey = principalKey; exports.assigneeKey = assigneeKey; exports.sameOwner = sameOwner; exports.candidates = candidates; exports.eligible = eligible; exports.validateCandidates = validateCandidates; exports.normalizeActor = normalizeActor; exports.policy = policy; exports.workType = workType; exports.executable = executable; exports.requireValue = requireValue; exports.text = text; exports.identity = identity; exports.positive = positive; exports.validateEstimate = validateEstimate; exports.validateBoard = validateBoard; exports.participant = participant; exports.owned = owned; exports.discoveryState = discoveryState;
|
|
221
|
+
//# sourceMappingURL=chunk-RBOER6EW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/chunk-RBOER6EW.cjs","../src/discovery-state.ts","../src/configuration.ts","../src/rules.ts","../src/identity.ts"],"names":["executable"],"mappings":"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","file":"/home/li/share/prj/x1/libraries/kanban/dist/chunk-RBOER6EW.cjs","sourcesContent":[null,"import type {KanbanDiscoveryState} from './scan-ports';\n\nexport function discoveryState(state: {discovery?: unknown} | null | undefined): KanbanDiscoveryState | undefined {\n return state?.discovery as KanbanDiscoveryState | undefined;\n}\n","import {DEFAULT_KANBAN_WORK_TYPES, executableWorkItem} from './contracts';\nimport type {KanbanBoard, KanbanPolicy, KanbanWorkType} from './contracts';\nimport {identity, requireValue, text} from './rules';\nimport {principalKey, roster} from './identity';\n\nexport function policy(input: Partial<KanbanPolicy> = {}): KanbanPolicy {\n return {claimTimeoutMs: 86400000, leaseMs: 600000, progressTimeoutMs: 3600000, transferTimeoutMs: 1800000,\n maxComplexity: 10, maxWorkUnits: 100, maxDurationMs: 28800000, escalationSessionIds: [], ...input};\n}\nexport function workTypes(board: KanbanBoard): readonly KanbanWorkType[] {return board.workTypes ?? DEFAULT_KANBAN_WORK_TYPES;}\nexport function workType(board: KanbanBoard, id: string): KanbanWorkType {\n const found = workTypes(board).find(type => type.id === id); requireValue(found, 'UNKNOWN_WORK_TYPE'); return found;\n}\nexport function executable(board: KanbanBoard, item: {planning?: {kind: string; execution?: 'direct'|'children'}}): boolean {\n workType(board, item.planning?.kind ?? board.defaultWorkType ?? 'task');\n return executableWorkItem(board,item);\n}\nexport function validateConfiguration(board: KanbanBoard): void {\n const types = workTypes(board); requireValue(types.length > 0 && types.length <= 20, 'WORK_TYPE_LIMIT');\n requireValue(new Set(types.map(t => t.id)).size === types.length, 'DUPLICATE_WORK_TYPE');\n for (const type of types) {\n identity(type.id); text(type.label); requireValue(Number.isInteger(type.rank) && type.rank >= 0 && type.rank <= 9 && typeof type.executable === 'boolean', 'INVALID_WORK_TYPE');\n }\n workType(board, board.defaultWorkType ?? 'task');\n const members = roster(board); requireValue(members.length > 0, 'MEMBER_ROSTER_REQUIRED');\n requireValue(new Set(members.map(principalKey)).size === members.length, 'DUPLICATE_MEMBER');\n for (const member of members) {identity(member.id); requireValue(['agent', 'human', 'service'].includes(member.kind), 'INVALID_PRINCIPAL');}\n for (const member of board.members ?? []) {\n text(member.responsibility); requireValue(!member.roles || member.roles.every(r => ['worker', 'reviewer', 'coordinator'].includes(r)), 'INVALID_MEMBER_ROLE');\n }\n validateColumns(board);\n for (const [kind, value] of Object.entries(board.notifications?.rules ?? {}))\n requireValue(/^[a-z][a-z0-9.-]{0,79}$/.test(kind) && ['info', 'error', 'none'].includes(value), 'INVALID_NOTIFICATION_RULE');\n}\nfunction validateColumns(board: KanbanBoard): void {\n if (!board.columns) return;\n const states = board.columns.flatMap(c => c.states);\n requireValue(states.length === 7 && new Set(states).size === 7 && ['proposed', 'backlog', 'open', 'claimed', 'review', 'completed', 'cancelled'].every(s => states.includes(s as never)), 'INVALID_COLUMNS');\n requireValue(new Set(board.columns.map(c => c.id)).size === board.columns.length, 'DUPLICATE_COLUMN');\n for (const column of board.columns) {identity(column.id); text(column.label); requireValue(column.states.length > 0, 'EMPTY_COLUMN');}\n}\n","import type { KanbanActor, KanbanBoard, KanbanEstimate, KanbanItem, KanbanParticipant } from './contracts';\nimport {validateConfiguration} from './configuration';\nimport {sameOwner} from './identity';\nimport { KanbanError } from './ports';\n\nexport function requireValue(condition: unknown, code: string): asserts condition {\n if (!condition) throw new KanbanError(code);\n}\nexport function text(value: string): void { requireValue(typeof value === 'string' && value.trim().length > 0 && value.length <= 8000, 'INVALID_TEXT'); }\nexport function identity(value: string): void { requireValue(typeof value === 'string' && value.length > 0 && value.length <= 256 && !['__proto__', 'prototype', 'constructor'].includes(value), 'INVALID_ID'); }\nexport function positive(value: number): void { requireValue(Number.isFinite(value) && value > 0, 'INVALID_THRESHOLD'); }\nexport function validateEstimate(estimate: KanbanEstimate): void {\n positive(estimate.complexity); positive(estimate.workUnits); positive(estimate.durationMs);\n requireValue(['low', 'medium', 'high'].includes(estimate.confidence), 'INVALID_CONFIDENCE');\n}\nexport function validateBoard(board: KanbanBoard): void {\n identity(board.id); text(board.title);\n requireValue(['system', 'project', 'collection'].includes(board.scope.kind), 'INVALID_SCOPE');\n if (board.scope.kind === 'project') identity(board.scope.projectId);\n if (board.scope.kind === 'collection') {identity(board.scope.namespace); identity(board.scope.id);}\n validateConfiguration(board);\n for (const agent of board.agents ?? []) { identity(agent.agentId); text(agent.responsibility); }\n requireValue(new Set((board.agents ?? []).map(a => a.agentId)).size === (board.agents ?? []).length, 'DUPLICATE_AGENT');\n const p = board.policy;\n for (const value of [p.maxReady, p.maxInProgress, p.maxInProgressPerAgent, p.maxInProgressPerAssignee]) if (value !== undefined) requireValue(Number.isSafeInteger(value) && value > 0, 'INVALID_LIMIT');\n requireValue(p.maxInProgressPerAgent === undefined || p.maxInProgressPerAssignee === undefined || p.maxInProgressPerAgent === p.maxInProgressPerAssignee, 'POLICY_LIMIT_CONFLICT');\n for (const value of [p.archiveAfterMs, p.backlogReviewMs]) if (value !== undefined) positive(value);\n for (const value of [p.claimTimeoutMs, p.leaseMs, p.progressTimeoutMs, p.transferTimeoutMs,\n p.maxComplexity, p.maxWorkUnits, p.maxDurationMs]) positive(value);\n requireValue(Array.isArray(p.escalationSessionIds), 'INVALID_ESCALATION_TARGETS');\n requireValue(p.review === undefined || ['independent', 'assignee'].includes(p.review), 'INVALID_REVIEW_POLICY');\n requireValue(p.requireEstimate === undefined || typeof p.requireEstimate === 'boolean', 'INVALID_ESTIMATE_POLICY');\n p.escalationSessionIds.forEach(identity);\n}\nexport function participant(list: KanbanParticipant[], sessionId: string, agentId: string | undefined,\n role: KanbanParticipant['roles'][number], subscribed: boolean, now: number): void {\n identity(sessionId);\n requireValue(['creator', 'owner', 'consultant', 'reviewer', 'observer', 'escalation'].includes(role), 'INVALID_ROLE');\n let entry = list.find(value => value.sessionId === sessionId);\n if (!entry) { entry = { sessionId, agentId, roles: [], subscribed, joinedAt: now }; list.push(entry); }\n if (entry.agentId && agentId) requireValue(entry.agentId === agentId, 'SESSION_AGENT_CONFLICT');\n entry.agentId ??= agentId;\n if (!entry.roles.includes(role)) entry.roles.push(role);\n entry.subscribed = subscribed;\n}\nexport function owned(item: KanbanItem, actor: KanbanActor, token: string, now: number): void {\n requireValue(item.status === 'claimed', 'ITEM_NOT_RUNNING');\n requireValue(item.owner && sameOwner(item.owner, actor) && item.owner.token === token, 'OWNER_MISMATCH');\n requireValue(item.owner.leaseUntil > now, 'LEASE_EXPIRED');\n}\n","import type {KanbanActor, KanbanAssignment, KanbanBoard, KanbanItem, KanbanPrincipal} from './contracts';\nimport {identity, requireValue} from './rules';\n\nexport function principal(actor: KanbanActor): KanbanPrincipal {\n const kind = actor.kind ?? 'agent', id = kind === 'agent' ? actor.agentId ?? actor.id : actor.id;\n requireValue(['agent', 'human', 'service'].includes(kind) && id, 'INVALID_ACTOR'); identity(id);\n if (kind === 'agent') {requireValue(!actor.agentId || !actor.id || actor.agentId === actor.id, 'ACTOR_ID_MISMATCH'); if (actor.sessionId !== undefined) identity(actor.sessionId); if (actor.taskId !== undefined) identity(actor.taskId);}\n return {kind, id};\n}\nexport function principalKey(value: KanbanPrincipal): string {return JSON.stringify([value.kind, value.id]);}\nexport function assigneeKey(value: KanbanAssignment): string {\n return value.principalId ?? principalKey({kind: 'agent', id: value.agentId!});\n}\nexport function sameOwner(owner: KanbanAssignment, actor: KanbanActor): boolean {\n const value = principal(actor);\n return assigneeKey(owner) === principalKey(value) && (value.kind !== 'agent' || owner.sessionId === actor.sessionId && owner.taskId === actor.taskId);\n}\nexport function roster(board: KanbanBoard): KanbanPrincipal[] {\n return [...(board.agents ?? []).map(a => ({kind: 'agent' as const, id: a.agentId})), ...(board.members ?? [])];\n}\nexport function candidates(board: KanbanBoard, item: KanbanItem): KanbanPrincipal[] {\n if (item.eligibleAgentIds === undefined && item.eligiblePrincipals === undefined)\n return [...(board.agents ?? []).map(a => ({kind: 'agent' as const, id: a.agentId})),\n ...(board.members ?? []).filter(m => !m.roles || m.roles.includes('worker'))];\n return [...(item.eligibleAgentIds ?? []).map(id => ({kind: 'agent' as const, id})), ...(item.eligiblePrincipals ?? [])];\n}\nexport function eligible(board: KanbanBoard, item: KanbanItem, actor: KanbanActor): void {\n const key = principalKey(principal(actor));\n requireValue(candidates(board, item).some(p => principalKey(p) === key), actor.kind && actor.kind !== 'agent' ? 'ASSIGNEE_NOT_ELIGIBLE' : 'AGENT_NOT_ELIGIBLE');\n}\nexport function validateCandidates(board: KanbanBoard, item: KanbanItem, executable: boolean): void {\n const allowed = new Set(roster(board).map(principalKey)), values = candidates(board, item);\n requireValue(!executable || values.length > 0, 'ELIGIBLE_ASSIGNEES_REQUIRED');\n for (const value of values) {\n identity(value.id); requireValue(['agent', 'human', 'service'].includes(value.kind), 'INVALID_PRINCIPAL');\n requireValue(allowed.has(principalKey(value)), value.kind === 'agent' ? 'AGENT_NOT_REGISTERED' : 'ASSIGNEE_NOT_REGISTERED');\n }\n}\n\nexport function normalizeActor(actor: KanbanActor): KanbanActor {\n const value = principal(actor);\n return value.kind === 'agent' ? {agentId: value.id, sessionId: actor.sessionId, taskId: actor.taskId}\n : {kind: value.kind, id: value.id};\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/execution-observation.ts
|
|
2
|
+
function executionObservationChanged(current, next) {
|
|
3
|
+
return current.outcome !== next.outcome || current.code !== next.code || JSON.stringify(current.outputs ?? []) !== JSON.stringify(next.outputs ?? []) || next.executionSessionId !== void 0 && current.executionSessionId !== next.executionSessionId || next.controlCapabilities !== void 0 && JSON.stringify(current.controlCapabilities) !== JSON.stringify(next.controlCapabilities);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
executionObservationChanged
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=chunk-RQP77ZTY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/execution-observation.ts"],"sourcesContent":["import type {KanbanDispatch} from './contracts';\n\ntype Observation = Pick<KanbanDispatch, 'outcome' | 'code' | 'outputs' | 'executionSessionId' | 'controlCapabilities'>;\n/** A lease renewal is operational state, separate from observable execution changes. */\nexport function executionObservationChanged(current: Observation, next: Observation): boolean {\n return current.outcome !== next.outcome || current.code !== next.code\n || JSON.stringify(current.outputs ?? []) !== JSON.stringify(next.outputs ?? [])\n || next.executionSessionId !== undefined && current.executionSessionId !== next.executionSessionId\n || next.controlCapabilities !== undefined && JSON.stringify(current.controlCapabilities) !== JSON.stringify(next.controlCapabilities);\n}\n"],"mappings":";AAIO,SAAS,4BAA4B,SAAsB,MAA4B;AAC1F,SAAO,QAAQ,YAAY,KAAK,WAAW,QAAQ,SAAS,KAAK,QAC1D,KAAK,UAAU,QAAQ,WAAW,CAAC,CAAC,MAAM,KAAK,UAAU,KAAK,WAAW,CAAC,CAAC,KAC3E,KAAK,uBAAuB,UAAa,QAAQ,uBAAuB,KAAK,sBAC7E,KAAK,wBAAwB,UAAa,KAAK,UAAU,QAAQ,mBAAmB,MAAM,KAAK,UAAU,KAAK,mBAAmB;AAC5I;","names":[]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/ports.ts
|
|
2
|
+
var KanbanError = class extends Error {
|
|
3
|
+
constructor(code) {
|
|
4
|
+
super(code);
|
|
5
|
+
this.code = code;
|
|
6
|
+
this.name = "KanbanError";
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
var KanbanScanNotStartedError = class extends KanbanError {
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
// src/utils/random.ts
|
|
13
|
+
function randomUUID() {
|
|
14
|
+
const webCrypto = globalThis.crypto;
|
|
15
|
+
if (typeof _optionalChain([webCrypto, 'optionalAccess', _ => _.randomUUID]) === "function") {
|
|
16
|
+
try {
|
|
17
|
+
return webCrypto.randomUUID();
|
|
18
|
+
} catch (e2) {
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return formatV4(randomBytes(16));
|
|
22
|
+
}
|
|
23
|
+
function randomBytes(length) {
|
|
24
|
+
const bytes = new Uint8Array(length);
|
|
25
|
+
if (typeof _optionalChain([globalThis, 'access', _2 => _2.crypto, 'optionalAccess', _3 => _3.getRandomValues]) === "function") {
|
|
26
|
+
globalThis.crypto.getRandomValues(bytes);
|
|
27
|
+
return bytes;
|
|
28
|
+
}
|
|
29
|
+
for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);
|
|
30
|
+
return bytes;
|
|
31
|
+
}
|
|
32
|
+
function formatV4(bytes) {
|
|
33
|
+
bytes[6] = bytes[6] & 15 | 64;
|
|
34
|
+
bytes[8] = bytes[8] & 63 | 128;
|
|
35
|
+
const hex = [...bytes].map((byte) => byte.toString(16).padStart(2, "0"));
|
|
36
|
+
return `${hex.slice(0, 4).join("")}-${hex.slice(4, 6).join("")}-${hex.slice(6, 8).join("")}-${hex.slice(8, 10).join("")}-${hex.slice(10).join("")}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// src/utils/digest.ts
|
|
40
|
+
var SHA256_K = new Uint32Array([
|
|
41
|
+
1116352408,
|
|
42
|
+
1899447441,
|
|
43
|
+
3049323471,
|
|
44
|
+
3921009573,
|
|
45
|
+
961987163,
|
|
46
|
+
1508970993,
|
|
47
|
+
2453635748,
|
|
48
|
+
2870763221,
|
|
49
|
+
3624381080,
|
|
50
|
+
310598401,
|
|
51
|
+
607225278,
|
|
52
|
+
1426881987,
|
|
53
|
+
1925078388,
|
|
54
|
+
2162078206,
|
|
55
|
+
2614888103,
|
|
56
|
+
3248222580,
|
|
57
|
+
3835390401,
|
|
58
|
+
4022224774,
|
|
59
|
+
264347078,
|
|
60
|
+
604807628,
|
|
61
|
+
770255983,
|
|
62
|
+
1249150122,
|
|
63
|
+
1555081692,
|
|
64
|
+
1996064986,
|
|
65
|
+
2554220882,
|
|
66
|
+
2821834349,
|
|
67
|
+
2952996808,
|
|
68
|
+
3210313671,
|
|
69
|
+
3336571891,
|
|
70
|
+
3584528711,
|
|
71
|
+
113926993,
|
|
72
|
+
338241895,
|
|
73
|
+
666307205,
|
|
74
|
+
773529912,
|
|
75
|
+
1294757372,
|
|
76
|
+
1396182291,
|
|
77
|
+
1695183700,
|
|
78
|
+
1986661051,
|
|
79
|
+
2177026350,
|
|
80
|
+
2456956037,
|
|
81
|
+
2730485921,
|
|
82
|
+
2820302411,
|
|
83
|
+
3259730800,
|
|
84
|
+
3345764771,
|
|
85
|
+
3516065817,
|
|
86
|
+
3600352804,
|
|
87
|
+
4094571909,
|
|
88
|
+
275423344,
|
|
89
|
+
430227734,
|
|
90
|
+
506948616,
|
|
91
|
+
659060556,
|
|
92
|
+
883997877,
|
|
93
|
+
958139571,
|
|
94
|
+
1322822218,
|
|
95
|
+
1537002063,
|
|
96
|
+
1747873779,
|
|
97
|
+
1955562222,
|
|
98
|
+
2024104815,
|
|
99
|
+
2227730452,
|
|
100
|
+
2361852424,
|
|
101
|
+
2428436474,
|
|
102
|
+
2756734187,
|
|
103
|
+
3204031479,
|
|
104
|
+
3329325298
|
|
105
|
+
]);
|
|
106
|
+
var SHA256_H = new Uint32Array([
|
|
107
|
+
1779033703,
|
|
108
|
+
3144134277,
|
|
109
|
+
1013904242,
|
|
110
|
+
2773480762,
|
|
111
|
+
1359893119,
|
|
112
|
+
2600822924,
|
|
113
|
+
528734635,
|
|
114
|
+
1541459225
|
|
115
|
+
]);
|
|
116
|
+
var rotateRight = (value, bits) => (value >>> bits | value << 32 - bits) >>> 0;
|
|
117
|
+
function toBytes(input) {
|
|
118
|
+
if (typeof input === "string") return new TextEncoder().encode(input);
|
|
119
|
+
if (input instanceof Uint8Array && input.buffer instanceof ArrayBuffer) {
|
|
120
|
+
return input;
|
|
121
|
+
}
|
|
122
|
+
if (ArrayBuffer.isView(input)) {
|
|
123
|
+
const source = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
|
|
124
|
+
const copy = new Uint8Array(input.byteLength);
|
|
125
|
+
copy.set(source);
|
|
126
|
+
return copy;
|
|
127
|
+
}
|
|
128
|
+
return new Uint8Array(input);
|
|
129
|
+
}
|
|
130
|
+
function toHex(bytes) {
|
|
131
|
+
return [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
132
|
+
}
|
|
133
|
+
function paddedMessage(message) {
|
|
134
|
+
const padded = new Uint8Array((Math.floor((message.length + 8) / 64) + 1) * 64);
|
|
135
|
+
padded.set(message);
|
|
136
|
+
padded[message.length] = 128;
|
|
137
|
+
const view = new DataView(padded.buffer);
|
|
138
|
+
const bitLength = message.length * 8;
|
|
139
|
+
view.setUint32(padded.length - 8, Math.floor(bitLength / 4294967296));
|
|
140
|
+
view.setUint32(padded.length - 4, bitLength >>> 0);
|
|
141
|
+
return padded;
|
|
142
|
+
}
|
|
143
|
+
function blockSchedule(view, offset) {
|
|
144
|
+
const words = new Uint32Array(64);
|
|
145
|
+
for (let i = 0; i < 16; i++) words[i] = view.getUint32(offset + i * 4);
|
|
146
|
+
for (let i = 16; i < 64; i++) {
|
|
147
|
+
const s0 = rotateRight(words[i - 15], 7) ^ rotateRight(words[i - 15], 18) ^ words[i - 15] >>> 3;
|
|
148
|
+
const s1 = rotateRight(words[i - 2], 17) ^ rotateRight(words[i - 2], 19) ^ words[i - 2] >>> 10;
|
|
149
|
+
words[i] = words[i - 16] + s0 + words[i - 7] + s1 >>> 0;
|
|
150
|
+
}
|
|
151
|
+
return words;
|
|
152
|
+
}
|
|
153
|
+
function compressBlock(state, words) {
|
|
154
|
+
let [a, b, c, d, e, f, g, h] = state;
|
|
155
|
+
for (let i = 0; i < 64; i++) {
|
|
156
|
+
const sigma1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);
|
|
157
|
+
const choose = e & f ^ ~e & g;
|
|
158
|
+
const temp1 = h + sigma1 + choose + SHA256_K[i] + words[i] >>> 0;
|
|
159
|
+
const sigma0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);
|
|
160
|
+
const majority = a & b ^ a & c ^ b & c;
|
|
161
|
+
const temp2 = sigma0 + majority >>> 0;
|
|
162
|
+
h = g;
|
|
163
|
+
g = f;
|
|
164
|
+
f = e;
|
|
165
|
+
e = d + temp1 >>> 0;
|
|
166
|
+
d = c;
|
|
167
|
+
c = b;
|
|
168
|
+
b = a;
|
|
169
|
+
a = temp1 + temp2 >>> 0;
|
|
170
|
+
}
|
|
171
|
+
const next = [a, b, c, d, e, f, g, h];
|
|
172
|
+
for (let i = 0; i < 8; i++) state[i] = state[i] + next[i] >>> 0;
|
|
173
|
+
}
|
|
174
|
+
function sha256Bytes(input) {
|
|
175
|
+
const padded = paddedMessage(toBytes(input));
|
|
176
|
+
const view = new DataView(padded.buffer);
|
|
177
|
+
const state = SHA256_H.slice();
|
|
178
|
+
for (let offset = 0; offset < padded.length; offset += 64) {
|
|
179
|
+
compressBlock(state, blockSchedule(view, offset));
|
|
180
|
+
}
|
|
181
|
+
const out = new Uint8Array(32);
|
|
182
|
+
const outView = new DataView(out.buffer);
|
|
183
|
+
for (let i = 0; i < 8; i++) outView.setUint32(i * 4, state[i]);
|
|
184
|
+
return out;
|
|
185
|
+
}
|
|
186
|
+
function sha256HexSync(input) {
|
|
187
|
+
return toHex(sha256Bytes(input));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
exports.KanbanError = KanbanError; exports.KanbanScanNotStartedError = KanbanScanNotStartedError; exports.randomUUID = randomUUID; exports.sha256HexSync = sha256HexSync;
|
|
196
|
+
//# sourceMappingURL=chunk-RSH6QSEC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/li/share/prj/x1/libraries/kanban/dist/chunk-RSH6QSEC.cjs","../src/ports.ts","../src/utils/random.ts","../src/utils/digest.ts"],"names":[],"mappings":"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","file":"/home/li/share/prj/x1/libraries/kanban/dist/chunk-RSH6QSEC.cjs","sourcesContent":[null,"import type { KanbanActor, KanbanBoard, KanbanCommand, KanbanEvent, KanbanArchivedItem, KanbanItemSummary } from './contracts';\n\nexport interface KanbanState {\n workflow?: import('./contracts').KanbanWorkflowState;\n numbering?: {item: number; log: number; decision: number};\n presetVersions?: Record<string, number>;\n records?: import('./contracts').KanbanProjectRecord[];\n discovery?: import('./scan-ports').KanbanDiscoveryState;\n archiveIndex?: KanbanItemSummary[];\n archiveWrites?: Array<{id: string; value: KanbanArchivedItem | null}>;\n restore?: KanbanArchivedItem;\n schema: 1; board: KanbanBoard; sequence: number; events: KanbanEvent[]; escalations: string[];\n}\nexport interface KanbanReadView {\n /** Board metadata and summary indexes; no item/record bodies. */\n state: KanbanState;\n items: import('./contracts').KanbanItemSummary[];\n records: import('./contracts').KanbanRecordSummary[];\n}\nexport interface KanbanStore {\n boardId?(number: number): Promise<string | null>;\n view?(id: string): Promise<KanbanReadView | null>;\n ids(): Promise<string[]>;\n archived(boardId: string, itemId: string): Promise<KanbanArchivedItem | null>;\n events(id: string, after: number, limit: number, through: number): Promise<KanbanEvent[]>;\n read(id: string): Promise<KanbanState | null>;\n update(id: string, operationId: string, fingerprint: string,\n change: (state: KanbanState | null) => KanbanState): Promise<KanbanState>;\n}\nexport interface KanbanModuleOptions {\n /** Host supplies metadata within the authorized user's/project's session scope. */\n suggestions?(board: KanbanBoard, kind: import('./contracts').KanbanSuggestionKind, search: string, limit: number): Promise<import('./contracts').KanbanSuggestion[] | undefined>;\n verifyOutputs?(input: {stage?: 'observe' | 'accept'; board: KanbanBoard; itemId: string; dispatchId?: string; outputs: import('./contracts').KanbanArtifactRef[]}): Promise<boolean>;\n onCommitted?(boardId: string, service: import('./contracts').KanbanService, now: number): Promise<void>;\n store: KanbanStore;\n /** Trusted identity resolved by the host, never from command payloads. */\n actor: KanbanActor;\n /** Must validate project access, delegated authority and session registration. */\n authorize(input: { actor: KanbanActor; board: KanbanBoard; action: 'create' | 'read' | 'install-content' | KanbanCommand['type']; command?: KanbanCommand }): Promise<void>;\n /** Confirm an automated owner has settled before releasing responsibility. */\n verifyDeletion?(board: KanbanBoard): Promise<void>;\n verifyLifecycle?(board: KanbanBoard, command: KanbanCommand): Promise<void>;\n verifyRelease?(input: {actor: KanbanActor; board: KanbanBoard; item: import('./contracts').KanbanItem}): Promise<boolean>;\n now?: () => number;\n id?: () => string;\n log(event: { operationId: string; boardId?: string; sessionId?: string; stage: string; result: 'success' | 'failure'; code?: string; durationMs: number }): void;\n}\nexport class KanbanError extends Error {\n constructor(readonly code: string) { super(code); this.name = 'KanbanError'; }\n}\n\nexport class KanbanScanNotStartedError extends KanbanError {}\n","/**\n * @file common/utils/random.ts\n * @description UUID v4 that also works outside a secure context.\n *\n * `crypto.randomUUID()` is secure-context-only: it is undefined over plain-HTTP\n * LAN origins (e.g. http://192.168.x.x:3000) and in WebKitGTK, so calling it\n * directly throws \"crypto.randomUUID is not a function\". `crypto.getRandomValues()`\n * stays available everywhere, so it backs the fallback below.\n */\n\n/** UUID v4 — native WebCrypto when available, `getRandomValues` otherwise. */\nexport function randomUUID(): string {\n const webCrypto = globalThis.crypto;\n if (typeof webCrypto?.randomUUID === 'function') {\n try {\n return webCrypto.randomUUID();\n } catch {\n // Present but unusable (insecure context) — fall through.\n }\n }\n return formatV4(randomBytes(16));\n}\n\nfunction randomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n if (typeof globalThis.crypto?.getRandomValues === 'function') {\n globalThis.crypto.getRandomValues(bytes);\n return bytes;\n }\n for (let i = 0; i < length; i++) bytes[i] = Math.floor(Math.random() * 256);\n return bytes;\n}\n\nfunction formatV4(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // RFC 4122 variant\n const hex = [...bytes].map(byte => byte.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`;\n}\n","/**\n * @file common/utils/digest.ts\n * @description SHA-256 that does not require WebCrypto.\n *\n * `crypto.subtle` only exists in a secure context (HTTPS or localhost) and is\n * absent in WebKitGTK, so `crypto.subtle.digest(...)` throws \"Cannot read\n * properties of undefined (reading 'digest')\" when the app is opened over a LAN\n * HTTP origin (e.g. http://192.168.x.x:3000) or in the packaged Linux app. The\n * pure-JS fallback below computes the very same SHA-256, so digests stay stable\n * across environments.\n */\n\n/** Any input a caller may want hashed. */\nexport type DigestInput = string | ArrayBuffer | ArrayBufferView;\n\nconst SHA256_K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst SHA256_H = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nconst rotateRight = (value: number, bits: number): number =>\n ((value >>> bits) | (value << (32 - bits))) >>> 0;\n\nfunction toBytes(input: DigestInput): Uint8Array<ArrayBuffer> {\n if (typeof input === 'string') return new TextEncoder().encode(input);\n if (input instanceof Uint8Array && input.buffer instanceof ArrayBuffer) {\n return input as Uint8Array<ArrayBuffer>;\n }\n if (ArrayBuffer.isView(input)) {\n // Copy so WebCrypto gets a plain ArrayBuffer (never a SharedArrayBuffer view).\n const source = new Uint8Array(input.buffer as ArrayBufferLike, input.byteOffset, input.byteLength);\n const copy = new Uint8Array(input.byteLength);\n copy.set(source);\n return copy;\n }\n return new Uint8Array(input);\n}\n\nfunction toHex(bytes: Uint8Array): string {\n return [...bytes].map(byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction paddedMessage(message: Uint8Array): Uint8Array {\n const padded = new Uint8Array((Math.floor((message.length + 8) / 64) + 1) * 64);\n padded.set(message);\n padded[message.length] = 0x80;\n const view = new DataView(padded.buffer);\n const bitLength = message.length * 8;\n view.setUint32(padded.length - 8, Math.floor(bitLength / 0x1_0000_0000));\n view.setUint32(padded.length - 4, bitLength >>> 0);\n return padded;\n}\n\nfunction blockSchedule(view: DataView, offset: number): Uint32Array {\n const words = new Uint32Array(64);\n for (let i = 0; i < 16; i++) words[i] = view.getUint32(offset + i * 4);\n for (let i = 16; i < 64; i++) {\n const s0 = rotateRight(words[i - 15], 7) ^ rotateRight(words[i - 15], 18) ^ (words[i - 15] >>> 3);\n const s1 = rotateRight(words[i - 2], 17) ^ rotateRight(words[i - 2], 19) ^ (words[i - 2] >>> 10);\n words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0;\n }\n return words;\n}\n\nfunction compressBlock(state: Uint32Array, words: Uint32Array): void {\n let [a, b, c, d, e, f, g, h] = state;\n for (let i = 0; i < 64; i++) {\n const sigma1 = rotateRight(e, 6) ^ rotateRight(e, 11) ^ rotateRight(e, 25);\n const choose = (e & f) ^ (~e & g);\n const temp1 = (h + sigma1 + choose + SHA256_K[i] + words[i]) >>> 0;\n const sigma0 = rotateRight(a, 2) ^ rotateRight(a, 13) ^ rotateRight(a, 22);\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (sigma0 + majority) >>> 0;\n h = g; g = f; f = e; e = (d + temp1) >>> 0;\n d = c; c = b; b = a; a = (temp1 + temp2) >>> 0;\n }\n const next = [a, b, c, d, e, f, g, h];\n for (let i = 0; i < 8; i++) state[i] = (state[i] + next[i]) >>> 0;\n}\n\n/** Pure-JS SHA-256 usable where WebCrypto is unavailable. */\nexport function sha256Bytes(input: DigestInput): Uint8Array {\n const padded = paddedMessage(toBytes(input));\n const view = new DataView(padded.buffer);\n const state = SHA256_H.slice();\n for (let offset = 0; offset < padded.length; offset += 64) {\n compressBlock(state, blockSchedule(view, offset));\n }\n const out = new Uint8Array(32);\n const outView = new DataView(out.buffer);\n for (let i = 0; i < 8; i++) outView.setUint32(i * 4, state[i]);\n return out;\n}\n\n/** SHA-256 hex digest — WebCrypto when available, pure JS otherwise. */\nexport async function sha256Hex(input: DigestInput): Promise<string> {\n const bytes = toBytes(input);\n const subtle = globalThis.crypto?.subtle;\n if (subtle?.digest) {\n try {\n return toHex(new Uint8Array(await subtle.digest('SHA-256', bytes)));\n } catch {\n // WebCrypto present but unusable (e.g. blocked by an insecure context).\n }\n }\n return toHex(sha256Bytes(bytes));\n}\n\n/** Synchronous SHA-256 hex digest (pure JS, no WebCrypto). */\nexport function sha256HexSync(input: DigestInput): string {\n return toHex(sha256Bytes(input));\n}\n"]}
|