patchwork-os 0.2.0-beta.13.canary.278 → 0.2.0-beta.13.canary.280
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/workers/shadowGate.d.ts +2 -2
- package/dist/workers/shadowGate.js +15 -5
- package/dist/workers/shadowGate.js.map +1 -1
- package/dist/workers/trustLevel.d.ts +7 -2
- package/dist/workers/trustLevel.js +13 -4
- package/dist/workers/trustLevel.js.map +1 -1
- package/dist/workers/workerGate.d.ts +2 -2
- package/dist/workers/workerGate.js +31 -7
- package/dist/workers/workerGate.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,8 +10,8 @@ import type { WorkerLevelStore } from "./workerLevelStore.js";
|
|
|
10
10
|
* decisions track reality. Until then this exists to log "ramp would bypass /
|
|
11
11
|
* gate did queue" and to drive the dial.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* The effective level drives two thresholds that mirror the live gate:
|
|
14
|
+
* compensable at L2+ → bypass; irreversible at L4+ → bypass; else → queue.
|
|
15
15
|
* The full earned level (0–4) is reported for the dial. The effective level is
|
|
16
16
|
* `min(earned, autonomyCeiling)`, floored to 0 for actions outside the worker's
|
|
17
17
|
* domain — a worker has no standing trust on things it doesn't own.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { classifyActionClass } from "./actionClass.js";
|
|
2
2
|
import { ownsAction } from "./worker.js";
|
|
3
|
+
const COMPENSABLE_AUTONOMY_LEVEL = 2;
|
|
3
4
|
const AUTONOMOUS_LEVEL = 4;
|
|
4
5
|
export function recommend(worker, toolName, params, store) {
|
|
5
6
|
const ac = classifyActionClass(toolName, params);
|
|
@@ -9,16 +10,25 @@ export function recommend(worker, toolName, params, store) {
|
|
|
9
10
|
let effectiveLevel = owned ? earnedLevel : 0;
|
|
10
11
|
if (effectiveLevel > worker.autonomyCeiling)
|
|
11
12
|
effectiveLevel = worker.autonomyCeiling;
|
|
12
|
-
const decision =
|
|
13
|
+
const decision = ac.reversibility === "compensable"
|
|
14
|
+
? effectiveLevel >= COMPENSABLE_AUTONOMY_LEVEL
|
|
15
|
+
? "bypass"
|
|
16
|
+
: "queue"
|
|
17
|
+
: effectiveLevel >= AUTONOMOUS_LEVEL
|
|
18
|
+
? "bypass"
|
|
19
|
+
: "queue";
|
|
20
|
+
const threshold = ac.reversibility === "compensable"
|
|
21
|
+
? COMPENSABLE_AUTONOMY_LEVEL
|
|
22
|
+
: AUTONOMOUS_LEVEL;
|
|
13
23
|
let reason;
|
|
14
24
|
if (!owned)
|
|
15
25
|
reason = "outside-worker-domain";
|
|
16
|
-
else if (worker.autonomyCeiling <
|
|
17
|
-
reason = `capped-by-autonomy-ceiling (L${worker.autonomyCeiling}, earned L${earnedLevel})`;
|
|
26
|
+
else if (worker.autonomyCeiling < threshold)
|
|
27
|
+
reason = `capped-by-autonomy-ceiling (L${worker.autonomyCeiling} < L${threshold}, earned L${earnedLevel})`;
|
|
18
28
|
else if (decision === "bypass")
|
|
19
|
-
reason =
|
|
29
|
+
reason = `autonomous (earned L${effectiveLevel}, threshold L${threshold})`;
|
|
20
30
|
else
|
|
21
|
-
reason = `below-autonomy (effective L${effectiveLevel})`;
|
|
31
|
+
reason = `below-autonomy (effective L${effectiveLevel} < L${threshold})`;
|
|
22
32
|
return {
|
|
23
33
|
decision,
|
|
24
34
|
classKey: ac.key,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadowGate.js","sourceRoot":"","sources":["../../src/workers/shadowGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AA+B9D,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,SAAS,CACvB,MAAsB,EACtB,QAAgB,EAChB,MAA2C,EAC3C,KAAuB;IAEvB,MAAM,EAAE,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK;QAC3D,CAAC,CAAe,CAAC;IAEnB,IAAI,cAAc,GAAe,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,cAAc,GAAG,MAAM,CAAC,eAAe;QACzC,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;IAE1C,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"shadowGate.js","sourceRoot":"","sources":["../../src/workers/shadowGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AA+B9D,MAAM,0BAA0B,GAAG,CAAC,CAAC;AACrC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,MAAM,UAAU,SAAS,CACvB,MAAsB,EACtB,QAAgB,EAChB,MAA2C,EAC3C,KAAuB;IAEvB,MAAM,EAAE,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK;QAC3D,CAAC,CAAe,CAAC;IAEnB,IAAI,cAAc,GAAe,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,cAAc,GAAG,MAAM,CAAC,eAAe;QACzC,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;IAE1C,MAAM,QAAQ,GACZ,EAAE,CAAC,aAAa,KAAK,aAAa;QAChC,CAAC,CAAC,cAAc,IAAI,0BAA0B;YAC5C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO;QACX,CAAC,CAAC,cAAc,IAAI,gBAAgB;YAClC,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,OAAO,CAAC;IAEhB,MAAM,SAAS,GACb,EAAE,CAAC,aAAa,KAAK,aAAa;QAChC,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,gBAAgB,CAAC;IACvB,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC,KAAK;QAAE,MAAM,GAAG,uBAAuB,CAAC;SACxC,IAAI,MAAM,CAAC,eAAe,GAAG,SAAS;QACzC,MAAM,GAAG,gCAAgC,MAAM,CAAC,eAAe,OAAO,SAAS,aAAa,WAAW,GAAG,CAAC;SACxG,IAAI,QAAQ,KAAK,QAAQ;QAC5B,MAAM,GAAG,uBAAuB,cAAc,gBAAgB,SAAS,GAAG,CAAC;;QACxE,MAAM,GAAG,8BAA8B,cAAc,OAAO,SAAS,GAAG,CAAC;IAE9E,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,EAAE,CAAC,GAAG;QAChB,KAAK;QACL,WAAW;QACX,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc;QACd,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -68,8 +68,13 @@ export interface LevelResult {
|
|
|
68
68
|
/**
|
|
69
69
|
* Map a posterior to a discrete rung, applying:
|
|
70
70
|
* 1. LCB → raw level via thresholds.
|
|
71
|
-
* 2. Novel-class floor: below the evidence minimum, cap at L1
|
|
72
|
-
*
|
|
71
|
+
* 2. Novel-class floor: below the effective evidence minimum, cap at L1.
|
|
72
|
+
* "Effective evidence" = real observations + prior pseudo-count beyond the
|
|
73
|
+
* uniform baseline (prior.alpha + prior.beta − 2). A strong operator prior
|
|
74
|
+
* (strength 8 → contributes 6) reduces the real observations needed before
|
|
75
|
+
* graduation is permitted; the default uniform prior contributes 0 so
|
|
76
|
+
* existing behaviour is unchanged. No class can skip the floor entirely via
|
|
77
|
+
* prior alone — the prior's LCB is still too wide without real data.
|
|
73
78
|
* 3. Reachability clamp: drop to the highest reachable rung ≤ the computed one,
|
|
74
79
|
* so an irreversible class climbing through "would-be L2/L3" stays at L1
|
|
75
80
|
* until it actually clears the L4 bar.
|
|
@@ -64,8 +64,13 @@ export const DEFAULT_THRESHOLDS = [
|
|
|
64
64
|
/**
|
|
65
65
|
* Map a posterior to a discrete rung, applying:
|
|
66
66
|
* 1. LCB → raw level via thresholds.
|
|
67
|
-
* 2. Novel-class floor: below the evidence minimum, cap at L1
|
|
68
|
-
*
|
|
67
|
+
* 2. Novel-class floor: below the effective evidence minimum, cap at L1.
|
|
68
|
+
* "Effective evidence" = real observations + prior pseudo-count beyond the
|
|
69
|
+
* uniform baseline (prior.alpha + prior.beta − 2). A strong operator prior
|
|
70
|
+
* (strength 8 → contributes 6) reduces the real observations needed before
|
|
71
|
+
* graduation is permitted; the default uniform prior contributes 0 so
|
|
72
|
+
* existing behaviour is unchanged. No class can skip the floor entirely via
|
|
73
|
+
* prior alone — the prior's LCB is still too wide without real data.
|
|
69
74
|
* 3. Reachability clamp: drop to the highest reachable rung ≤ the computed one,
|
|
70
75
|
* so an irreversible class climbing through "would-be L2/L3" stays at L1
|
|
71
76
|
* until it actually clears the L4 bar.
|
|
@@ -80,8 +85,12 @@ export function levelFromPosterior(p, prior, opts = {}) {
|
|
|
80
85
|
const evidence = evidenceCount(p, prior);
|
|
81
86
|
const rawLevel = thresholds.find((t) => lcb >= t.min)?.level ?? 0;
|
|
82
87
|
let level = rawLevel;
|
|
83
|
-
// Novel-class floor
|
|
84
|
-
|
|
88
|
+
// Novel-class floor: prior pseudo-count beyond the uniform baseline counts
|
|
89
|
+
// toward the evidence minimum, reducing cold-start latency for operator-
|
|
90
|
+
// configured workers without letting the prior alone bypass the floor.
|
|
91
|
+
const priorContribution = Math.max(0, prior.alpha + prior.beta - 2);
|
|
92
|
+
const effectiveEvidence = evidence + priorContribution;
|
|
93
|
+
if (effectiveEvidence < minEvidence && level > 1)
|
|
85
94
|
level = 1;
|
|
86
95
|
// Reachability clamp (highest reachable rung ≤ level).
|
|
87
96
|
const allowed = reachable.filter((r) => r <= level);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trustLevel.js","sourceRoot":"","sources":["../../src/workers/trustLevel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAc,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,QAAgB;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAY;IACxC,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAY;IAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;yBACyB;AACzB,MAAM,UAAU,oBAAoB,CAAC,CAAY,EAAE,CAAC,GAAG,GAAG;IACxD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED;oEACoE;AACpE,MAAM,UAAU,YAAY,CAC1B,CAAY,EACZ,IAAa,EACb,MAAc;IAEd,OAAO,IAAI;QACT,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC3C,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,aAAa,CAAC,CAAY,EAAE,KAAgB;IAC1D,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAID,oDAAoD;AACpD,MAAM,CAAC,MAAM,kBAAkB,GAG1B;IACH,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IACvB,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IACvB,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;IACtB,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;IACtB,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;CACrB,CAAC;AAoBF
|
|
1
|
+
{"version":3,"file":"trustLevel.js","sourceRoot":"","sources":["../../src/workers/trustLevel.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,8 +47,8 @@ export interface WorkerGateDecision {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Undoable → flows un-gated even when unearned. Only reversible actions are
|
|
50
|
-
* exempt from the trust requirement; compensable
|
|
51
|
-
*
|
|
50
|
+
* exempt from the trust requirement; compensable ones graduate to autonomous
|
|
51
|
+
* at L2+; irreversible ones wait for earned L4.
|
|
52
52
|
*/
|
|
53
53
|
export declare function flowsUngated(ac: ActionClass): boolean;
|
|
54
54
|
export declare function decideWorkerAction(worker: WorkerManifest, toolName: string, params: Record<string, unknown> | undefined, store: WorkerLevelStore): WorkerGateDecision;
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { classifyActionClass } from "./actionClass.js";
|
|
2
2
|
import { ownsAction } from "./worker.js";
|
|
3
|
+
/**
|
|
4
|
+
* Compensable actions (git-remote, issue) unlock autonomous execution at L2.
|
|
5
|
+
* A compensating path exists (close the PR, delete the issue) so the cost of
|
|
6
|
+
* an error is bounded — a worker at L2 has demonstrated enough reliability
|
|
7
|
+
* that occasional human cleanup is acceptable. Irreversible actions (shell,
|
|
8
|
+
* messaging, http) still require L4; they skip L2/L3 in the reachable-levels
|
|
9
|
+
* set entirely, so this threshold never fires for them.
|
|
10
|
+
*/
|
|
11
|
+
const COMPENSABLE_AUTONOMY_LEVEL = 2;
|
|
12
|
+
/** Irreversible actions (and unowned/unearned anything) require full L4. */
|
|
3
13
|
const AUTONOMOUS_LEVEL = 4;
|
|
4
14
|
/**
|
|
5
15
|
* Undoable → flows un-gated even when unearned. Only reversible actions are
|
|
6
|
-
* exempt from the trust requirement; compensable
|
|
7
|
-
*
|
|
16
|
+
* exempt from the trust requirement; compensable ones graduate to autonomous
|
|
17
|
+
* at L2+; irreversible ones wait for earned L4.
|
|
8
18
|
*/
|
|
9
19
|
export function flowsUngated(ac) {
|
|
10
20
|
return ac.reversibility === "reversible";
|
|
@@ -49,23 +59,37 @@ export function decideWorkerAction(worker, toolName, params, store) {
|
|
|
49
59
|
reason: `reversible (${ac.blastTier} blast) — undoable, flows un-gated`,
|
|
50
60
|
};
|
|
51
61
|
}
|
|
52
|
-
// Compensable
|
|
62
|
+
// Compensable: autonomous at L2+. A compensating action exists, so the cost
|
|
63
|
+
// of being wrong is bounded. Workers earning L2 on vcs-remote or issue can
|
|
64
|
+
// push and open issues without per-action approval.
|
|
65
|
+
if (ac.reversibility === "compensable" &&
|
|
66
|
+
effectiveLevel >= COMPENSABLE_AUTONOMY_LEVEL) {
|
|
67
|
+
return {
|
|
68
|
+
...base,
|
|
69
|
+
action: "allow",
|
|
70
|
+
reason: `earned autonomy (L${effectiveLevel}) on compensable class — auto-allowed at L2+`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Irreversible (and compensable still below L2): autonomous only at L4.
|
|
53
74
|
if (effectiveLevel >= AUTONOMOUS_LEVEL) {
|
|
54
75
|
return {
|
|
55
76
|
...base,
|
|
56
77
|
action: "allow",
|
|
57
|
-
reason: `earned autonomy (L4) on
|
|
78
|
+
reason: `earned autonomy (L4) on ${ac.reversibility} class`,
|
|
58
79
|
};
|
|
59
80
|
}
|
|
81
|
+
const threshold = ac.reversibility === "compensable"
|
|
82
|
+
? COMPENSABLE_AUTONOMY_LEVEL
|
|
83
|
+
: AUTONOMOUS_LEVEL;
|
|
60
84
|
let reason;
|
|
61
85
|
if (!owned) {
|
|
62
86
|
reason = `${ac.reversibility} action outside the worker's owned domain — gated`;
|
|
63
87
|
}
|
|
64
|
-
else if (worker.autonomyCeiling <
|
|
65
|
-
reason = `${ac.reversibility} class capped by autonomy ceiling (L${worker.autonomyCeiling}) — always gated`;
|
|
88
|
+
else if (worker.autonomyCeiling < threshold) {
|
|
89
|
+
reason = `${ac.reversibility} class capped by autonomy ceiling (L${worker.autonomyCeiling} < L${threshold}) — always gated`;
|
|
66
90
|
}
|
|
67
91
|
else {
|
|
68
|
-
reason = `${ac.reversibility} + unearned (effective L${effectiveLevel} <
|
|
92
|
+
reason = `${ac.reversibility} + unearned (effective L${effectiveLevel} < L${threshold}) — gated for approval`;
|
|
69
93
|
}
|
|
70
94
|
return { ...base, action: "gate", reason };
|
|
71
95
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workerGate.js","sourceRoot":"","sources":["../../src/workers/workerGate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AAiD9D,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAe;IAC1C,OAAO,EAAE,CAAC,aAAa,KAAK,YAAY,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAsB,EACtB,QAAgB,EAChB,MAA2C,EAC3C,KAAuB;IAEvB,MAAM,EAAE,GAAG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK;QAC3D,CAAC,CAAe,CAAC;IAEnB,IAAI,cAAc,GAAe,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,cAAc,GAAG,MAAM,CAAC,eAAe;QACzC,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;IAE1C,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE,EAAE,CAAC,GAAG;QAChB,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,KAAK;QACL,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,aAAa,EAAE,EAAE,CAAC,aAAa;QAC/B,WAAW;QACX,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,cAAc;KACN,CAAC;IAEX,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,8DAA8D;IAC9D,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,iDAAiD;SAC1D,CAAC;IACJ,CAAC;IAED,0EAA0E;IAC1E,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,GAAG,IAAI;YACP,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,eAAe,EAAE,CAAC,SAAS,oCAAoC;SACxE,CAAC;IACJ,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"workerGate.js","sourceRoot":"","sources":["../../src/workers/workerGate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchwork-os",
|
|
3
|
-
"version": "0.2.0-beta.13.canary.
|
|
3
|
+
"version": "0.2.0-beta.13.canary.280",
|
|
4
4
|
"description": "Your personal AI runtime, local-first. Patchwork OS gives any AI model a consistent set of tools, YAML recipes, a delegation policy with approval queue, and a durable trace memory — all on your machine, all under your policy.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|