wicked-crew 0.7.46 → 0.7.48
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/api/capture.d.ts +2 -2
- package/dist/api/chat-citations.d.ts +10 -1
- package/dist/api/chat-citations.d.ts.map +1 -1
- package/dist/api/chat-citations.js +28 -0
- package/dist/api/chat-citations.js.map +1 -1
- package/dist/api/chat-scope.d.ts +4 -2
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +35 -3
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/chat-transcripts.d.ts +23 -1
- package/dist/api/chat-transcripts.d.ts.map +1 -1
- package/dist/api/chat-transcripts.js +61 -6
- package/dist/api/chat-transcripts.js.map +1 -1
- package/dist/api/delivery-index.d.ts +21 -0
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +36 -0
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/elicitation-cache.d.ts +12 -0
- package/dist/api/elicitation-cache.d.ts.map +1 -1
- package/dist/api/elicitation-cache.js +17 -1
- package/dist/api/elicitation-cache.js.map +1 -1
- package/dist/api/eval-sample.d.ts +12 -12
- package/dist/api/governance-steering.d.ts.map +1 -1
- package/dist/api/governance-steering.js +1 -0
- package/dist/api/governance-steering.js.map +1 -1
- package/dist/api/mcp.d.ts +4 -4
- package/dist/api/policy-landing.d.ts +55 -0
- package/dist/api/policy-landing.d.ts.map +1 -0
- package/dist/api/policy-landing.js +174 -0
- package/dist/api/policy-landing.js.map +1 -0
- package/dist/api/recording.d.ts +228 -0
- package/dist/api/recording.d.ts.map +1 -0
- package/dist/api/recording.js +1140 -0
- package/dist/api/recording.js.map +1 -0
- package/dist/api/routes.d.ts +42 -39
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +362 -107
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-timing-index.d.ts +17 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +43 -1
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/server.d.ts +27 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +168 -4
- package/dist/api/server.js.map +1 -1
- package/dist/api/testing.d.ts +4 -4
- package/dist/api/testing.d.ts.map +1 -1
- package/dist/api/testing.js +3 -0
- package/dist/api/testing.js.map +1 -1
- package/dist/api/watch-routes.d.ts +30 -0
- package/dist/api/watch-routes.d.ts.map +1 -0
- package/dist/api/watch-routes.js +104 -0
- package/dist/api/watch-routes.js.map +1 -0
- package/dist/campaigns/routes.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +20 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +52 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +193 -5
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/run-identity.js +1 -1
- package/dist/core/run-identity.js.map +1 -1
- package/dist/core/walkthrough-root.d.ts +21 -0
- package/dist/core/walkthrough-root.d.ts.map +1 -0
- package/dist/core/walkthrough-root.js +66 -0
- package/dist/core/walkthrough-root.js.map +1 -0
- package/dist/decisions/chat-recorder.d.ts +129 -0
- package/dist/decisions/chat-recorder.d.ts.map +1 -0
- package/dist/decisions/chat-recorder.js +367 -0
- package/dist/decisions/chat-recorder.js.map +1 -0
- package/dist/decisions/consider.d.ts +102 -0
- package/dist/decisions/consider.d.ts.map +1 -0
- package/dist/decisions/consider.js +207 -0
- package/dist/decisions/consider.js.map +1 -0
- package/dist/decisions/derive.d.ts +79 -0
- package/dist/decisions/derive.d.ts.map +1 -0
- package/dist/decisions/derive.js +282 -0
- package/dist/decisions/derive.js.map +1 -0
- package/dist/decisions/events.d.ts +25 -0
- package/dist/decisions/events.d.ts.map +1 -0
- package/dist/decisions/events.js +24 -0
- package/dist/decisions/events.js.map +1 -0
- package/dist/decisions/ingest.d.ts +51 -0
- package/dist/decisions/ingest.d.ts.map +1 -0
- package/dist/decisions/ingest.js +100 -0
- package/dist/decisions/ingest.js.map +1 -0
- package/dist/decisions/land.d.ts +100 -0
- package/dist/decisions/land.d.ts.map +1 -0
- package/dist/decisions/land.js +466 -0
- package/dist/decisions/land.js.map +1 -0
- package/dist/decisions/ledger.d.ts +60 -0
- package/dist/decisions/ledger.d.ts.map +1 -0
- package/dist/decisions/ledger.js +246 -0
- package/dist/decisions/ledger.js.map +1 -0
- package/dist/decisions/routes.d.ts +10 -0
- package/dist/decisions/routes.d.ts.map +1 -0
- package/dist/decisions/routes.js +141 -0
- package/dist/decisions/routes.js.map +1 -0
- package/dist/decisions/rules-text.d.ts +21 -0
- package/dist/decisions/rules-text.d.ts.map +1 -0
- package/dist/decisions/rules-text.js +50 -0
- package/dist/decisions/rules-text.js.map +1 -0
- package/dist/decisions/types.d.ts +120 -0
- package/dist/decisions/types.d.ts.map +1 -0
- package/dist/decisions/types.js +19 -0
- package/dist/decisions/types.js.map +1 -0
- package/dist/editors/csp.d.ts +31 -0
- package/dist/editors/csp.d.ts.map +1 -0
- package/dist/editors/csp.js +46 -0
- package/dist/editors/csp.js.map +1 -0
- package/dist/editors/pack-install.d.ts +28 -0
- package/dist/editors/pack-install.d.ts.map +1 -0
- package/dist/editors/pack-install.js +153 -0
- package/dist/editors/pack-install.js.map +1 -0
- package/dist/editors/registry.d.ts +142 -0
- package/dist/editors/registry.d.ts.map +1 -0
- package/dist/editors/registry.js +255 -0
- package/dist/editors/registry.js.map +1 -0
- package/dist/editors/routes.d.ts +46 -0
- package/dist/editors/routes.d.ts.map +1 -0
- package/dist/editors/routes.js +166 -0
- package/dist/editors/routes.js.map +1 -0
- package/dist/interactive/bridge-pool.d.ts +7 -2
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +6 -1
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +1 -0
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/interactive/theme-events.d.ts +119 -0
- package/dist/interactive/theme-events.d.ts.map +1 -0
- package/dist/interactive/theme-events.js +606 -0
- package/dist/interactive/theme-events.js.map +1 -0
- package/dist/projects/events.d.ts.map +1 -1
- package/dist/projects/events.js +2 -1
- package/dist/projects/events.js.map +1 -1
- package/dist/projects/routes.d.ts +2 -2
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +3 -0
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/projects/state-home.d.ts +6 -0
- package/dist/projects/state-home.d.ts.map +1 -1
- package/dist/projects/state-home.js +28 -1
- package/dist/projects/state-home.js.map +1 -1
- package/dist/qe/acceptance.d.ts +45 -4
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +93 -4
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/ledger.d.ts +20 -0
- package/dist/qe/ledger.d.ts.map +1 -1
- package/dist/qe/ledger.js +34 -0
- package/dist/qe/ledger.js.map +1 -1
- package/dist/qe/walkthrough-acceptance.d.ts +82 -0
- package/dist/qe/walkthrough-acceptance.d.ts.map +1 -0
- package/dist/qe/walkthrough-acceptance.js +248 -0
- package/dist/qe/walkthrough-acceptance.js.map +1 -0
- package/dist/skills/base-skill.d.ts.map +1 -1
- package/dist/skills/base-skill.js +3 -2
- package/dist/skills/base-skill.js.map +1 -1
- package/dist/skills/plugin-source.d.ts +19 -1
- package/dist/skills/plugin-source.d.ts.map +1 -1
- package/dist/skills/plugin-source.js +31 -2
- package/dist/skills/plugin-source.js.map +1 -1
- package/dist/skills/runtime.d.ts +11 -2
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +29 -1
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/store.d.ts +14 -1
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +19 -5
- package/dist/skills/store.js.map +1 -1
- package/dist/standing-orders/routes.d.ts +22 -22
- package/dist/standing-orders/store.d.ts +10 -10
- package/dist/watch/checks/check-failed.d.ts +24 -0
- package/dist/watch/checks/check-failed.d.ts.map +1 -0
- package/dist/watch/checks/check-failed.js +56 -0
- package/dist/watch/checks/check-failed.js.map +1 -0
- package/dist/watch/checks/claim-vs-evidence.d.ts +30 -0
- package/dist/watch/checks/claim-vs-evidence.d.ts.map +1 -0
- package/dist/watch/checks/claim-vs-evidence.js +152 -0
- package/dist/watch/checks/claim-vs-evidence.js.map +1 -0
- package/dist/watch/checks/deliver-audit.d.ts +19 -0
- package/dist/watch/checks/deliver-audit.d.ts.map +1 -0
- package/dist/watch/checks/deliver-audit.js +129 -0
- package/dist/watch/checks/deliver-audit.js.map +1 -0
- package/dist/watch/checks/index.d.ts +8 -0
- package/dist/watch/checks/index.d.ts.map +1 -0
- package/dist/watch/checks/index.js +24 -0
- package/dist/watch/checks/index.js.map +1 -0
- package/dist/watch/checks/lag.d.ts +24 -0
- package/dist/watch/checks/lag.d.ts.map +1 -0
- package/dist/watch/checks/lag.js +55 -0
- package/dist/watch/checks/lag.js.map +1 -0
- package/dist/watch/checks/quiet-after-claim.d.ts +17 -0
- package/dist/watch/checks/quiet-after-claim.d.ts.map +1 -0
- package/dist/watch/checks/quiet-after-claim.js +89 -0
- package/dist/watch/checks/quiet-after-claim.js.map +1 -0
- package/dist/watch/checks/ungated.d.ts +12 -0
- package/dist/watch/checks/ungated.d.ts.map +1 -0
- package/dist/watch/checks/ungated.js +64 -0
- package/dist/watch/checks/ungated.js.map +1 -0
- package/dist/watch/checks/warned-rule.d.ts +26 -0
- package/dist/watch/checks/warned-rule.d.ts.map +1 -0
- package/dist/watch/checks/warned-rule.js +126 -0
- package/dist/watch/checks/warned-rule.js.map +1 -0
- package/dist/watch/emit.d.ts +122 -0
- package/dist/watch/emit.d.ts.map +1 -0
- package/dist/watch/emit.js +443 -0
- package/dist/watch/emit.js.map +1 -0
- package/dist/watch/events.d.ts +21 -0
- package/dist/watch/events.d.ts.map +1 -0
- package/dist/watch/events.js +21 -0
- package/dist/watch/events.js.map +1 -0
- package/dist/watch/keys.d.ts +15 -0
- package/dist/watch/keys.d.ts.map +1 -0
- package/dist/watch/keys.js +23 -0
- package/dist/watch/keys.js.map +1 -0
- package/dist/watch/lanes.d.ts +41 -0
- package/dist/watch/lanes.d.ts.map +1 -0
- package/dist/watch/lanes.js +73 -0
- package/dist/watch/lanes.js.map +1 -0
- package/dist/watch/loader.d.ts +47 -0
- package/dist/watch/loader.d.ts.map +1 -0
- package/dist/watch/loader.js +178 -0
- package/dist/watch/loader.js.map +1 -0
- package/dist/watch/registry.d.ts +166 -0
- package/dist/watch/registry.d.ts.map +1 -0
- package/dist/watch/registry.js +589 -0
- package/dist/watch/registry.js.map +1 -0
- package/dist/watch/ring.d.ts +32 -0
- package/dist/watch/ring.d.ts.map +1 -0
- package/dist/watch/ring.js +90 -0
- package/dist/watch/ring.js.map +1 -0
- package/dist/watch/router.d.ts +25 -0
- package/dist/watch/router.d.ts.map +1 -0
- package/dist/watch/router.js +87 -0
- package/dist/watch/router.js.map +1 -0
- package/dist/watch/sources.d.ts +42 -0
- package/dist/watch/sources.d.ts.map +1 -0
- package/dist/watch/sources.js +104 -0
- package/dist/watch/sources.js.map +1 -0
- package/dist/watch/types.d.ts +129 -0
- package/dist/watch/types.d.ts.map +1 -0
- package/dist/watch/types.js +6 -0
- package/dist/watch/types.js.map +1 -0
- package/endpoint-manifest.json +272 -1
- package/package.json +3 -2
- package/watch/entries/claim-vs-evidence.json +13 -0
- package/watch/entries/deliver-audit.json +17 -0
- package/watch/entries/quiet-after-claim.json +16 -0
- package/watch/entries/registry-check-failed.json +12 -0
- package/watch/entries/registry-lagging.json +12 -0
- package/watch/entries/risky-call.json +12 -0
- package/watch/entries/ungated.json +13 -0
- package/dist/api/demo.d.ts +0 -90
- package/dist/api/demo.d.ts.map +0 -1
- package/dist/api/demo.js +0 -492
- package/dist/api/demo.js.map +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Considered · set aside · cited (unchecked)" (DES-decision-capture §4.7, DC-S7).
|
|
3
|
+
*
|
|
4
|
+
* - **Considered** = the engine's `considerRules({projects:[project]}).in_force` for the turn's or
|
|
5
|
+
* unit's project (project rules + global ones). On an engine without the binding, the global
|
|
6
|
+
* rules alone, and the Consideration says so (`source: 'global-only'`).
|
|
7
|
+
* - **Set aside** = the engine's `set_aside` (out of scope / replaced / retired) plus crew's own
|
|
8
|
+
* pending candidates for that project — decisions `offered` but not yet confirmed.
|
|
9
|
+
* - **Cited (unchecked)** = every `[rule:<id>]` the persisted reply or step wrote. An id in the
|
|
10
|
+
* in-force set is "cited by the step — unchecked"; any other id is unverified. It is NEVER
|
|
11
|
+
* summed into a "followed" count (B4): advisory rules never decide, so nothing here can know
|
|
12
|
+
* whether a rule was followed — DES-rule-check supplies that verdict.
|
|
13
|
+
*
|
|
14
|
+
* The same object answers `GET /chats/:id/turns/:turnId/considered` and
|
|
15
|
+
* `GET /runs/:id/units/:unitKey/considered?attempt=`, and one `wicked.crew.rule.considered` fact
|
|
16
|
+
* (counts and ids, never words) is emitted when a turn or a unit attempt lands — keyed per turn
|
|
17
|
+
* and per (run, ord, attempt), so a re-dispatch is its own record (review N5).
|
|
18
|
+
*/
|
|
19
|
+
import { RULE_CITED_LABEL, RULE_UNKNOWN_LABEL, extractRuleCitations } from '../api/chat-citations.js';
|
|
20
|
+
import { coreUnitId } from '../api/evidence.js';
|
|
21
|
+
import { resolveUnit } from '../api/unit-output.js';
|
|
22
|
+
import { RULE_CONSIDERED, decisionFact } from './events.js';
|
|
23
|
+
import { orderBySeverity, rulesPreface } from './rules-text.js';
|
|
24
|
+
export { RULE_CITED_LABEL, extractRuleCitations, rulesPreface };
|
|
25
|
+
/**
|
|
26
|
+
* The in-force rules for a project. `considerRules` when the engine has it; else the global,
|
|
27
|
+
* non-retired rules; else (no engine read at all) nothing, said as `unavailable`. Never throws.
|
|
28
|
+
*/
|
|
29
|
+
export async function readInForce(adapter, projectId, log) {
|
|
30
|
+
try {
|
|
31
|
+
if (typeof adapter.projectRulesSupported === 'function' && adapter.projectRulesSupported() && typeof adapter.considerRules === 'function') {
|
|
32
|
+
const c = await adapter.considerRules({ projects: projectId !== null ? [projectId] : [] });
|
|
33
|
+
return { rules: c.in_force, setAside: c.set_aside, source: 'considerRules' };
|
|
34
|
+
}
|
|
35
|
+
if (typeof adapter.listConformanceRules === 'function') {
|
|
36
|
+
const all = await adapter.listConformanceRules();
|
|
37
|
+
return {
|
|
38
|
+
rules: all.filter((r) => r.retired !== true && r.targets?.project === undefined),
|
|
39
|
+
setAside: all.filter((r) => r.retired === true).map((r) => ({ id: r.id, statement: r.statement, reason: 'retired' })),
|
|
40
|
+
source: 'global-only',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
log?.(`[decisions] could not read the in-force rules: ${err instanceof Error ? err.message : String(err)}`);
|
|
46
|
+
}
|
|
47
|
+
return { rules: [], setAside: [], source: 'unavailable' };
|
|
48
|
+
}
|
|
49
|
+
export class ConsiderationService {
|
|
50
|
+
deps;
|
|
51
|
+
/** chat → the rule ids its seats have been told about (the statement at open, then every preface). */
|
|
52
|
+
seen = new Map();
|
|
53
|
+
constructor(deps) {
|
|
54
|
+
this.deps = deps;
|
|
55
|
+
}
|
|
56
|
+
log(msg) {
|
|
57
|
+
this.deps.log?.(msg);
|
|
58
|
+
}
|
|
59
|
+
async inForceFor(projectId) {
|
|
60
|
+
return readInForce(this.deps.adapter, projectId, (m) => this.log(m));
|
|
61
|
+
}
|
|
62
|
+
/** The in-force ids, or `null` when no engine read was possible (a citation then stays unchecked). */
|
|
63
|
+
async inForceIds(projectId) {
|
|
64
|
+
const read = await this.inForceFor(projectId);
|
|
65
|
+
return read.source === 'unavailable' ? null : new Set(read.rules.map((r) => r.id));
|
|
66
|
+
}
|
|
67
|
+
// ── How seats learn the rules ──────────────────────────────────────────────────────────────
|
|
68
|
+
/** The chat opened with these rules in its statement. */
|
|
69
|
+
noteChatOpen(chat, rules) {
|
|
70
|
+
this.seen.set(chat, new Set(rules.map((r) => r.id)));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The preface the next send carries, or `null`: the rules in force now that the seats have not
|
|
74
|
+
* been told about. A chat this daemon did not open (a restart) is SEEDED on its first send —
|
|
75
|
+
* nothing is known about what its seats were told, so the current set stands in for the open
|
|
76
|
+
* statement and that send carries no preface; a rule that lands after the seed is new to the
|
|
77
|
+
* seats and IS prefaced on the send after (codex r1, wording fixed: "seeded, then prefaced").
|
|
78
|
+
*/
|
|
79
|
+
async prefaceForSend(chat, opts = {}) {
|
|
80
|
+
const rules = opts.inForce ?? (await this.inForceFor(this.deps.projectOf(chat) ?? null)).rules;
|
|
81
|
+
const seen = this.seen.get(chat);
|
|
82
|
+
if (seen === undefined) {
|
|
83
|
+
this.seen.set(chat, new Set(rules.map((r) => r.id)));
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
const fresh = rules.filter((r) => !seen.has(r.id));
|
|
87
|
+
for (const r of rules)
|
|
88
|
+
seen.add(r.id);
|
|
89
|
+
return fresh.length > 0 ? rulesPreface(fresh) : null;
|
|
90
|
+
}
|
|
91
|
+
chatClosed(chat) {
|
|
92
|
+
this.seen.delete(chat);
|
|
93
|
+
}
|
|
94
|
+
// ── The Consideration ──────────────────────────────────────────────────────────────────────
|
|
95
|
+
notConfirmed(projectId) {
|
|
96
|
+
const ledger = this.deps.ledger;
|
|
97
|
+
if (ledger === undefined)
|
|
98
|
+
return [];
|
|
99
|
+
const views = ledger.list({ state: 'offered', ...(projectId !== null ? { project: projectId } : {}) });
|
|
100
|
+
return views
|
|
101
|
+
.filter((v) => v.project_id === projectId)
|
|
102
|
+
.map((v) => ({ id: v.proposal_id ?? v.id, statement: v.derived.statement ?? v.origin.words, reason: 'not_confirmed' }));
|
|
103
|
+
}
|
|
104
|
+
async build(subject, key, projectId, texts) {
|
|
105
|
+
const read = await this.inForceFor(projectId);
|
|
106
|
+
const inForce = new Set(read.rules.map((r) => r.id));
|
|
107
|
+
const considered = orderBySeverity(read.rules).map((r) => ({
|
|
108
|
+
id: r.id,
|
|
109
|
+
statement: r.statement,
|
|
110
|
+
severity: r.severity,
|
|
111
|
+
...(r.steering_type !== undefined ? { steering_type: r.steering_type } : {}),
|
|
112
|
+
...(r.targets?.project !== undefined ? { project: r.targets.project } : {}),
|
|
113
|
+
}));
|
|
114
|
+
const cited = [];
|
|
115
|
+
const seenCite = new Set();
|
|
116
|
+
for (const { by, text } of texts) {
|
|
117
|
+
for (const id of extractRuleCitations(text)) {
|
|
118
|
+
const k = `${by}\u0000${id}`;
|
|
119
|
+
if (seenCite.has(k))
|
|
120
|
+
continue;
|
|
121
|
+
seenCite.add(k);
|
|
122
|
+
cited.push(inForce.has(id)
|
|
123
|
+
? { id, by, status: 'unchecked', label: RULE_CITED_LABEL }
|
|
124
|
+
: { id, by, status: 'unverified', label: RULE_UNKNOWN_LABEL });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
subject,
|
|
129
|
+
key,
|
|
130
|
+
project_id: projectId,
|
|
131
|
+
considered,
|
|
132
|
+
set_aside: [...read.setAside, ...this.notConfirmed(projectId)],
|
|
133
|
+
cited,
|
|
134
|
+
source: read.source,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** The Consideration of one chat turn, or `null` when the transcript holds no such turn. */
|
|
138
|
+
async forChatTurn(chat, turnId) {
|
|
139
|
+
const transcripts = this.deps.transcripts;
|
|
140
|
+
if (transcripts === undefined)
|
|
141
|
+
return null;
|
|
142
|
+
const records = transcripts.read(chat);
|
|
143
|
+
if (!records.some((r) => r.turnId === turnId && r.kind === 'user'))
|
|
144
|
+
return null;
|
|
145
|
+
const texts = records.flatMap((r) => (r.turnId === turnId && r.kind === 'seat' ? [{ by: r.cliKey, text: r.text }] : []));
|
|
146
|
+
return this.build({ kind: 'chat', chat_id: chat, turn_id: turnId }, `considered:${chat}:${turnId}`, this.deps.projectOf(chat) ?? null, texts);
|
|
147
|
+
}
|
|
148
|
+
/** The Consideration of one unit attempt (`unitKey` as `resolveUnit` accepts it), or `null`. */
|
|
149
|
+
async forUnit(runId, unitKey, attempt = 0) {
|
|
150
|
+
const { adapter } = this.deps;
|
|
151
|
+
if (typeof adapter.sessionsDetail !== 'function')
|
|
152
|
+
return null;
|
|
153
|
+
const run = (await adapter.sessionsDetail()).find((v) => v.session.id === runId);
|
|
154
|
+
if (run === undefined)
|
|
155
|
+
return null;
|
|
156
|
+
const unit = resolveUnit(run, unitKey);
|
|
157
|
+
if (unit === null)
|
|
158
|
+
return null;
|
|
159
|
+
const text = typeof adapter.workOutput === 'function' ? ((await adapter.workOutput(coreUnitId(runId, unit))) ?? '') : '';
|
|
160
|
+
return this.build({ kind: 'unit', run_id: runId, ord: unit.ord, attempt }, `considered:${runId}:${unit.ord}:${attempt}`, this.deps.projectOf(runId) ?? null, [{ by: unit.id, text }]);
|
|
161
|
+
}
|
|
162
|
+
// ── The fact (post-commit, counts only) ───────────────────────────────────────────────────
|
|
163
|
+
async emit(c) {
|
|
164
|
+
const emit = this.deps.emit;
|
|
165
|
+
if (emit === null || emit === undefined)
|
|
166
|
+
return;
|
|
167
|
+
const counts = {
|
|
168
|
+
project_id: c.project_id,
|
|
169
|
+
considered_count: c.considered.length,
|
|
170
|
+
set_aside_count: c.set_aside.length,
|
|
171
|
+
cited_count: c.cited.length,
|
|
172
|
+
};
|
|
173
|
+
const subject = c.subject.kind === 'chat'
|
|
174
|
+
? { chat_id: c.subject.chat_id, turn_id: c.subject.turn_id }
|
|
175
|
+
: { run_id: c.subject.run_id, ord: c.subject.ord, attempt: c.subject.attempt };
|
|
176
|
+
const f = decisionFact(RULE_CONSIDERED, { ...subject, ...counts }, c.key);
|
|
177
|
+
try {
|
|
178
|
+
await emit(f.type, f.payload, f.key);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
this.log(`[decisions] emit ${RULE_CONSIDERED} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** A chat turn's replies all landed: compute and emit. Never throws. */
|
|
185
|
+
async onChatTurn(chat, turnId) {
|
|
186
|
+
try {
|
|
187
|
+
const c = await this.forChatTurn(chat, turnId);
|
|
188
|
+
if (c !== null)
|
|
189
|
+
await this.emit(c);
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
this.log(`[decisions] considered for chat ${chat} turn ${turnId} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** A unit attempt's output was captured: compute and emit. Never throws. */
|
|
196
|
+
async onUnitCaptured(runId, ord, attempt) {
|
|
197
|
+
try {
|
|
198
|
+
const c = await this.forUnit(runId, String(ord), attempt);
|
|
199
|
+
if (c !== null)
|
|
200
|
+
await this.emit(c);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
this.log(`[decisions] considered for run ${runId} unit ${ord} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=consider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consider.js","sourceRoot":"","sources":["../../src/decisions/consider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic derivation (DES-decision-capture §4.4) — PURE: no I/O, no model, golden-tested.
|
|
3
|
+
*
|
|
4
|
+
* Words → exclusions → template → D·G·C·R → key → route. Auto is decided here and ONLY here, from
|
|
5
|
+
* facts the model cannot set: a human actor, `auth=required`, typed words, a T1/T2 template that
|
|
6
|
+
* passes D and G, a known project, no redaction, not an approval of a proposal, not a restatement
|
|
7
|
+
* or a conflict. Model labels can add an offer, or turn an auto into a question (`same_as` →
|
|
8
|
+
* `maybe-restated`); they can never promote and never swallow a rule silently (review N6).
|
|
9
|
+
*
|
|
10
|
+
* The rev-1 template table is not carried in the rev-2 spec text; the six templates below are its
|
|
11
|
+
* reconstruction from §3/§4.4/§8 (T1 always and T2 never auto-eligible; T3 "X before Y" is the
|
|
12
|
+
* spec's own offer example), recorded in the PR as an assumption.
|
|
13
|
+
*/
|
|
14
|
+
import type { DecisionModelLabels, DecisionRoute, DecisionTemplateId } from './types.js';
|
|
15
|
+
import type { SteeringType } from 'wicked-crew-api-types';
|
|
16
|
+
/** One in-force rule the derivation compares against (from `considerRules`). */
|
|
17
|
+
export interface InForceRule {
|
|
18
|
+
id: string;
|
|
19
|
+
statement: string;
|
|
20
|
+
project?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface DeriveInput {
|
|
23
|
+
words: string;
|
|
24
|
+
actorKind: 'human' | 'agent' | 'system';
|
|
25
|
+
authMode: 'off' | 'required';
|
|
26
|
+
wordsSource: 'typed' | 'operator-files' | 'cli-transcript';
|
|
27
|
+
projectId: string | null;
|
|
28
|
+
inForce: ReadonlyArray<InForceRule>;
|
|
29
|
+
/** Prior records with the same key (the ledger index); absent = none. */
|
|
30
|
+
recurrence?: (key: string) => {
|
|
31
|
+
count: number;
|
|
32
|
+
first_at: number;
|
|
33
|
+
projects: string[];
|
|
34
|
+
} | null;
|
|
35
|
+
labels?: DecisionModelLabels;
|
|
36
|
+
now?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface Derivation {
|
|
39
|
+
words: string;
|
|
40
|
+
redacted: boolean;
|
|
41
|
+
template: DecisionTemplateId | null;
|
|
42
|
+
exclusions: string[];
|
|
43
|
+
dgc: {
|
|
44
|
+
durable: boolean;
|
|
45
|
+
general: boolean;
|
|
46
|
+
checkable: boolean;
|
|
47
|
+
};
|
|
48
|
+
recurrence: {
|
|
49
|
+
count: number;
|
|
50
|
+
first_at: number;
|
|
51
|
+
projects: string[];
|
|
52
|
+
};
|
|
53
|
+
statement: string | null;
|
|
54
|
+
polarity: 'do' | 'dont' | null;
|
|
55
|
+
key: string | null;
|
|
56
|
+
scope: 'project' | 'everywhere';
|
|
57
|
+
steering_type: SteeringType;
|
|
58
|
+
route: DecisionRoute;
|
|
59
|
+
/** The in-force rule a restated / maybe-restated decision names, or a conflict contradicts. */
|
|
60
|
+
rule_ref?: string;
|
|
61
|
+
}
|
|
62
|
+
/** Mask secrets and email addresses. Returns the stored copy and whether anything was masked. */
|
|
63
|
+
export declare function scrubWords(words: string): {
|
|
64
|
+
words: string;
|
|
65
|
+
redacted: boolean;
|
|
66
|
+
};
|
|
67
|
+
/** The content words of a text: lowercase tokens that are not stopwords, ids, paths or versions. */
|
|
68
|
+
export declare function contentWords(text: string): string[];
|
|
69
|
+
export declare function exclusionsOf(words: string, hasOpener: boolean, contentCount: number): string[];
|
|
70
|
+
export declare function steeringTypeOf(text: string): SteeringType;
|
|
71
|
+
export declare function keyOf(template: DecisionTemplateId, polarity: 'do' | 'dont', body: string): string;
|
|
72
|
+
/** The key a stored rule's statement derives to, so a restatement is an exact key match. */
|
|
73
|
+
export declare function ruleKey(statement: string): {
|
|
74
|
+
key: string;
|
|
75
|
+
polarity: 'do' | 'dont';
|
|
76
|
+
subject: string;
|
|
77
|
+
} | null;
|
|
78
|
+
export declare function deriveDecision(input: DeriveInput): Derivation;
|
|
79
|
+
//# sourceMappingURL=derive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.d.ts","sourceRoot":"","sources":["../../src/decisions/derive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic derivation (DES-decision-capture §4.4) — PURE: no I/O, no model, golden-tested.
|
|
3
|
+
*
|
|
4
|
+
* Words → exclusions → template → D·G·C·R → key → route. Auto is decided here and ONLY here, from
|
|
5
|
+
* facts the model cannot set: a human actor, `auth=required`, typed words, a T1/T2 template that
|
|
6
|
+
* passes D and G, a known project, no redaction, not an approval of a proposal, not a restatement
|
|
7
|
+
* or a conflict. Model labels can add an offer, or turn an auto into a question (`same_as` →
|
|
8
|
+
* `maybe-restated`); they can never promote and never swallow a rule silently (review N6).
|
|
9
|
+
*
|
|
10
|
+
* The rev-1 template table is not carried in the rev-2 spec text; the six templates below are its
|
|
11
|
+
* reconstruction from §3/§4.4/§8 (T1 always and T2 never auto-eligible; T3 "X before Y" is the
|
|
12
|
+
* spec's own offer example), recorded in the PR as an assumption.
|
|
13
|
+
*/
|
|
14
|
+
// ── Privacy (§4.9): a hit masks the stored copy, sets `redacted`, and blocks auto ──────────────────
|
|
15
|
+
const SECRET_PATTERNS = [
|
|
16
|
+
/\bgh[pousr]_[A-Za-z0-9]{20,}\b/g,
|
|
17
|
+
/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,
|
|
18
|
+
/\bsk-[A-Za-z0-9_-]{16,}\b/g,
|
|
19
|
+
/\bAKIA[0-9A-Z]{16}\b/g,
|
|
20
|
+
/\bxox[abpr]-[A-Za-z0-9-]{10,}\b/g,
|
|
21
|
+
/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,
|
|
22
|
+
/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,
|
|
23
|
+
/\b(?:password|passwd|secret|token|api[_-]?key)\s*[:=]\s*\S+/gi,
|
|
24
|
+
/[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+/g,
|
|
25
|
+
];
|
|
26
|
+
/** Mask secrets and email addresses. Returns the stored copy and whether anything was masked. */
|
|
27
|
+
export function scrubWords(words) {
|
|
28
|
+
let out = words;
|
|
29
|
+
let redacted = false;
|
|
30
|
+
for (const re of SECRET_PATTERNS) {
|
|
31
|
+
out = out.replace(re, () => {
|
|
32
|
+
redacted = true;
|
|
33
|
+
return '[redacted]';
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return { words: out, redacted };
|
|
37
|
+
}
|
|
38
|
+
// ── Normalisation and content words ─────────────────────────────────────────────────────────────
|
|
39
|
+
const STANDING_OPENER = /^(?:from now on|going forward|from here on(?: out)?|in (?:the )?future|as a rule|by default|in general|moving forward)\b[,:;]?\s*/i;
|
|
40
|
+
const POLITE_LEAD = /^(?:please|ok(?:ay)?|so|and|also|but|hey)\b[,:;]?\s*/i;
|
|
41
|
+
const STOPWORDS = new Set([
|
|
42
|
+
'a', 'an', 'the', 'to', 'of', 'in', 'on', 'for', 'and', 'or', 'but', 'with', 'at', 'by', 'from', 'into', 'onto',
|
|
43
|
+
'it', 'its', "it's", 'this', 'that', 'these', 'those', 'is', 'are', 'be', 'been', 'being', 'was', 'were', 'am',
|
|
44
|
+
'we', 'you', 'i', 'our', 'your', 'my', 'me', 'us', 'they', 'them', 'their', 'he', 'she', 'his', 'her',
|
|
45
|
+
'please', 'always', 'never', 'now', 'going', 'forward', 'future', 'every', 'time', 'any', 'all', 'each',
|
|
46
|
+
'do', 'does', 'did', "don't", 'dont', 'not', 'no', 'should', 'must', 'has', 'have', 'had', 'need', 'needs',
|
|
47
|
+
'before', 'after', 'only', 'prefer', 'instead', 'rather', 'than', 'over', 'just', 'also', 'then', 'so', 'as',
|
|
48
|
+
'if', 'when', 'whenever', 'unless', 'ever', 'again', 'here', 'there', 'out', 'up', 'can', 'could', 'would',
|
|
49
|
+
'will', "let's", 'lets', 'let', 'ok', 'okay', 'yes', 'yeah', 'stop', 'make', 'sure', 'one', 'thing', 'things',
|
|
50
|
+
'via', 'per', 'own', 'more', 'less', 'very', 'really', 'still', 'some', 'what', 'which', 'who', 'how',
|
|
51
|
+
]);
|
|
52
|
+
/** Strip ids, URLs, SHAs, paths and versions before counting content words (G). */
|
|
53
|
+
function stripTokens(text) {
|
|
54
|
+
return text
|
|
55
|
+
.replace(/https?:\/\/\S+/gi, ' ')
|
|
56
|
+
.replace(/\b[0-9a-f]{7,40}\b/gi, ' ')
|
|
57
|
+
.replace(/\bv?\d+(?:\.\d+){1,3}\b/g, ' ')
|
|
58
|
+
.replace(/(?:^|\s)(?:\.{0,2}\/)?[\w.-]+(?:\/[\w.-]+)+/g, ' ')
|
|
59
|
+
.replace(/\b[\w-]*\d[\w-]*\b/g, ' ')
|
|
60
|
+
.replace(/#\d+/g, ' ');
|
|
61
|
+
}
|
|
62
|
+
/** The content words of a text: lowercase tokens that are not stopwords, ids, paths or versions. */
|
|
63
|
+
export function contentWords(text) {
|
|
64
|
+
const tokens = stripTokens(text.toLowerCase()).match(/[a-z][a-z'-]*/g) ?? [];
|
|
65
|
+
const out = [];
|
|
66
|
+
for (const raw of tokens) {
|
|
67
|
+
const t = raw.replace(/^'+|'+$/g, '').replace(/'s$/, '');
|
|
68
|
+
if (t.length < 2 || STOPWORDS.has(t))
|
|
69
|
+
continue;
|
|
70
|
+
out.push(t);
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function sentence(text) {
|
|
75
|
+
const t = text.trim().replace(/[\s.!;,]+$/u, '');
|
|
76
|
+
if (t === '')
|
|
77
|
+
return t;
|
|
78
|
+
return `${t.charAt(0).toUpperCase()}${t.slice(1)}.`;
|
|
79
|
+
}
|
|
80
|
+
// ── Exclusions (§4.4 step 1) ────────────────────────────────────────────────────────────────────
|
|
81
|
+
const QUESTION_LEAD = /^(?:(?:does|do|did|don't|doesn't|didn't|is|are|was|were|isn't|aren't|can|could|should|would|will|shouldn't|have|has)\s+(?:we|you|i|they|it|this|that|these|those|the|there|he|she|anyone|someone)\b|(?:why|what|how|when|where|who|which)\b)/i;
|
|
82
|
+
const ONE_OFF = /\b(?:never ?mind|skip (?:that|this|it)|for now|this time|this once|just once|today|tonight|in this (?:session|chat|run)|for this one|for this (?:run|pr|change|task)|right now)\b/i;
|
|
83
|
+
export function exclusionsOf(words, hasOpener, contentCount) {
|
|
84
|
+
const out = [];
|
|
85
|
+
const trimmed = words.trim();
|
|
86
|
+
if (trimmed.endsWith('?') || QUESTION_LEAD.test(trimmed))
|
|
87
|
+
out.push('question');
|
|
88
|
+
if (ONE_OFF.test(trimmed))
|
|
89
|
+
out.push('one-off');
|
|
90
|
+
if (hasOpener && contentCount < 3)
|
|
91
|
+
out.push('short-opener');
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
const SUBJECT = /^(?:we|you|i|they|the team|everyone|agents?|seats?|workers?)\s+/i;
|
|
95
|
+
function matchTemplate(body, hasOpener) {
|
|
96
|
+
const b = body.replace(SUBJECT, '');
|
|
97
|
+
let m;
|
|
98
|
+
// T1 — always X / X every time.
|
|
99
|
+
if ((m = /^(?:should\s+|must\s+)?(?:always|every\s+time,?)\s+(.+)$/i.exec(b)) !== null) {
|
|
100
|
+
const rest = (m[1] ?? '').trim();
|
|
101
|
+
return { template: 'T1-always', polarity: 'do', statement: sentence(`Always ${rest}`), body: rest };
|
|
102
|
+
}
|
|
103
|
+
if ((m = /^(.+?),?\s+(?:always|every\s+(?:single\s+)?time)$/i.exec(b.replace(/[.!]+$/, ''))) !== null) {
|
|
104
|
+
const rest = (m[1] ?? '').trim();
|
|
105
|
+
return { template: 'T1-always', polarity: 'do', statement: sentence(`Always ${rest}`), body: rest };
|
|
106
|
+
}
|
|
107
|
+
// T2 — never X / don't ever X / (with a standing opener) don't X.
|
|
108
|
+
if ((m = /^(?:should\s+|must\s+)?(?:never|do\s+not\s+ever|don'?t\s+ever)\s+(.+)$/i.exec(b)) !== null) {
|
|
109
|
+
const rest = (m[1] ?? '').trim();
|
|
110
|
+
return { template: 'T2-never', polarity: 'dont', statement: sentence(`Never ${rest}`), body: rest };
|
|
111
|
+
}
|
|
112
|
+
if (hasOpener && (m = /^(?:do\s+not|don'?t)\s+(.+)$/i.exec(b)) !== null) {
|
|
113
|
+
const rest = (m[1] ?? '').trim();
|
|
114
|
+
return { template: 'T2-never', polarity: 'dont', statement: sentence(`Never ${rest}`), body: rest };
|
|
115
|
+
}
|
|
116
|
+
if (hasOpener && (m = /^stop\s+(.+)$/i.exec(b)) !== null) {
|
|
117
|
+
const rest = (m[1] ?? '').trim();
|
|
118
|
+
return { template: 'T2-never', polarity: 'dont', statement: sentence(`Stop ${rest}`), body: rest };
|
|
119
|
+
}
|
|
120
|
+
// T6 — only X.
|
|
121
|
+
if ((m = /^only\s+(.+)$/i.exec(b)) !== null) {
|
|
122
|
+
const rest = (m[1] ?? '').trim();
|
|
123
|
+
return { template: 'T6-only', polarity: 'do', statement: sentence(`Only ${rest}`), body: rest };
|
|
124
|
+
}
|
|
125
|
+
// T4 — prefer X (over Y) / use X instead of Y.
|
|
126
|
+
if ((m = /^(?:prefer|favou?r)\s+(.+)$/i.exec(b)) !== null) {
|
|
127
|
+
const rest = (m[1] ?? '').trim();
|
|
128
|
+
return { template: 'T4-prefer', polarity: 'do', statement: sentence(`Prefer ${rest}`), body: rest };
|
|
129
|
+
}
|
|
130
|
+
if ((m = /^(?:use|pick|choose)\s+(.+?)\s+(?:instead of|rather than|over)\s+(.+)$/i.exec(b)) !== null) {
|
|
131
|
+
const rest = `${(m[1] ?? '').trim()} over ${(m[2] ?? '').trim()}`;
|
|
132
|
+
return { template: 'T4-prefer', polarity: 'do', statement: sentence(`Prefer ${rest}`), body: rest };
|
|
133
|
+
}
|
|
134
|
+
// T3 — X before Y (an order).
|
|
135
|
+
if ((m = /^(.+?)\s+before\s+(.+)$/i.exec(b)) !== null && contentWords(m[1] ?? '').length > 0) {
|
|
136
|
+
return { template: 'T3-before', polarity: 'do', statement: sentence(b), body: b };
|
|
137
|
+
}
|
|
138
|
+
// T5 — X must / should / has to Y; do not X (no opener).
|
|
139
|
+
if ((m = /^(?:do\s+not|don'?t)\s+(.+)$/i.exec(b)) !== null) {
|
|
140
|
+
const rest = (m[1] ?? '').trim();
|
|
141
|
+
return { template: 'T5-must', polarity: 'dont', statement: sentence(`Do not ${rest}`), body: rest };
|
|
142
|
+
}
|
|
143
|
+
if (/\b(?:must|should|has to|have to|needs to|need to|ought to|mustn't|shouldn't)\b/i.test(b) && !/\b(?:must|should)\s+(?:we|i|you)\b/i.test(b)) {
|
|
144
|
+
const dont = /\b(?:must not|mustn't|should not|shouldn't)\b/i.test(b);
|
|
145
|
+
return { template: 'T5-must', polarity: dont ? 'dont' : 'do', statement: sentence(b), body: b };
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const CHECKABLE_VERB = /\b(?:run|check|test|use|add|write|fix|review|ask|merge|push|deploy|keep|put|show|avoid|include|wait|open|close|delete|remove|call|read|record|verify|build|ship|cite|name|mark|commit|rebase|document|lint|format|log|skip|pin|label|tag|link|attach|scan|grep|reply|answer|confirm|block|require|land|release|publish|record|start|finish|stop)\b/i;
|
|
150
|
+
// ── Steering type (deterministic; the operator can edit it at Remember) ─────────────────────────
|
|
151
|
+
const STEERING_KEYWORDS = [
|
|
152
|
+
['security', /\b(?:secur\w*|secrets?|tokens?|credentials?|passwords?|auth\w*|permissions?|leak\w*|vulnerab\w*|encrypt\w*)\b/i],
|
|
153
|
+
['compliance', /\b(?:complian\w*|gdpr|pci|hipaa|soc ?2|audit\w*|licen[cs]\w*|legal|regulat\w*|privacy|pii)\b/i],
|
|
154
|
+
['testing', /\b(?:tests?|testing|tested|checks?|walkthroughs?|e2e|qa|coverage|assert\w*|verif\w*|lint\w*|ci)\b/i],
|
|
155
|
+
['operations', /\b(?:deploy\w*|releases?|release|publish\w*|rollback|incidents?|monitor\w*|disk|daemons?|ops|merge|merging|tags?|tagging|on-?call)\b/i],
|
|
156
|
+
['design-ux', /\b(?:design|ux|ui|copy|wording|layout|colou?rs?|fonts?|accessib\w*|a11y|screens?|pages?|buttons?|calm\w*)\b/i],
|
|
157
|
+
['architecture', /\b(?:architect\w*|modules?|services?|schemas?|apis?|interfaces?|layers?|dependenc\w*|database|seams?)\b/i],
|
|
158
|
+
];
|
|
159
|
+
export function steeringTypeOf(text) {
|
|
160
|
+
for (const [type, re] of STEERING_KEYWORDS)
|
|
161
|
+
if (re.test(text))
|
|
162
|
+
return type;
|
|
163
|
+
return 'development';
|
|
164
|
+
}
|
|
165
|
+
// ── The key (§4.4 step 5) and the in-force comparison ───────────────────────────────────────────
|
|
166
|
+
export function keyOf(template, polarity, body) {
|
|
167
|
+
const words = [...new Set(contentWords(body))].sort();
|
|
168
|
+
return `${template}|${polarity}|${words.join(' ')}`;
|
|
169
|
+
}
|
|
170
|
+
/** The key a stored rule's statement derives to, so a restatement is an exact key match. */
|
|
171
|
+
export function ruleKey(statement) {
|
|
172
|
+
const body = statement.trim().replace(/[.!]+$/, '');
|
|
173
|
+
const hit = matchTemplate(body, false);
|
|
174
|
+
if (hit === null)
|
|
175
|
+
return null;
|
|
176
|
+
const subject = [...new Set(contentWords(hit.body))].sort().join(' ');
|
|
177
|
+
return { key: keyOf(hit.template, hit.polarity, hit.body), polarity: hit.polarity, subject };
|
|
178
|
+
}
|
|
179
|
+
// ── The derivation ──────────────────────────────────────────────────────────────────────────────
|
|
180
|
+
export function deriveDecision(input) {
|
|
181
|
+
const scrub = scrubWords(input.words);
|
|
182
|
+
const words = scrub.words.trim();
|
|
183
|
+
const opener = STANDING_OPENER.exec(words.replace(POLITE_LEAD, ''));
|
|
184
|
+
const hasOpener = opener !== null;
|
|
185
|
+
let body = words.replace(POLITE_LEAD, '');
|
|
186
|
+
if (opener !== null)
|
|
187
|
+
body = body.slice(opener[0].length);
|
|
188
|
+
body = body.replace(POLITE_LEAD, '').trim().replace(/[.!]+$/, '');
|
|
189
|
+
const content = contentWords(body);
|
|
190
|
+
const exclusions = exclusionsOf(words, hasOpener, content.length);
|
|
191
|
+
// An excluded utterance is never shaped into a rule (a question, a one-off, a bare opener).
|
|
192
|
+
const hit = exclusions.length > 0 ? null : matchTemplate(body, hasOpener);
|
|
193
|
+
let template = hit?.template ?? null;
|
|
194
|
+
let polarity = hit?.polarity ?? null;
|
|
195
|
+
let statement = hit?.statement ?? null;
|
|
196
|
+
let keyBody = hit?.body ?? body;
|
|
197
|
+
if (hit === null && hasOpener && exclusions.length === 0 && content.length >= 3) {
|
|
198
|
+
// The "in your words" row: a standing opener over a body no template shapes — offered as typed.
|
|
199
|
+
template = 'in-your-words';
|
|
200
|
+
polarity = /^(?:do\s+not|don'?t|no)\b/i.test(body) ? 'dont' : 'do';
|
|
201
|
+
statement = sentence(body);
|
|
202
|
+
keyBody = body;
|
|
203
|
+
}
|
|
204
|
+
const ruleContent = contentWords(keyBody);
|
|
205
|
+
const general = ruleContent.length >= 3;
|
|
206
|
+
const durable = exclusions.length === 0 && template !== null;
|
|
207
|
+
const checkable = template !== null && (template !== 'in-your-words' || CHECKABLE_VERB.test(keyBody));
|
|
208
|
+
const key = template !== null && polarity !== null ? keyOf(template, polarity, keyBody) : null;
|
|
209
|
+
const recurrenceHit = key !== null ? input.recurrence?.(key) ?? null : null;
|
|
210
|
+
const recurrence = recurrenceHit ?? { count: 0, first_at: input.now ?? Date.now(), projects: [] };
|
|
211
|
+
const scope = input.projectId !== null ? 'project' : 'everywhere';
|
|
212
|
+
const steering_type = input.labels?.steering_type ?? steeringTypeOf(statement ?? body);
|
|
213
|
+
const base = {
|
|
214
|
+
words,
|
|
215
|
+
redacted: scrub.redacted,
|
|
216
|
+
template,
|
|
217
|
+
exclusions,
|
|
218
|
+
dgc: { durable, general, checkable },
|
|
219
|
+
recurrence,
|
|
220
|
+
statement,
|
|
221
|
+
polarity,
|
|
222
|
+
key,
|
|
223
|
+
scope,
|
|
224
|
+
steering_type,
|
|
225
|
+
};
|
|
226
|
+
if (exclusions.length > 0 || key === null || polarity === null) {
|
|
227
|
+
return { ...base, route: modelOffers(input.labels, durable, general, checkable, recurrence.count) ? 'offer' : 'ledger' };
|
|
228
|
+
}
|
|
229
|
+
// Compare with the in-force rules that apply here (this project's, or global).
|
|
230
|
+
const subject = [...new Set(ruleContent)].sort().join(' ');
|
|
231
|
+
for (const rule of input.inForce) {
|
|
232
|
+
if (rule.project !== undefined && rule.project !== input.projectId)
|
|
233
|
+
continue;
|
|
234
|
+
const rk = ruleKey(rule.statement);
|
|
235
|
+
if (rk === null)
|
|
236
|
+
continue;
|
|
237
|
+
if (rk.key === key)
|
|
238
|
+
return { ...base, route: 'restated', rule_ref: rule.id };
|
|
239
|
+
}
|
|
240
|
+
for (const rule of input.inForce) {
|
|
241
|
+
if (rule.project !== undefined && rule.project !== input.projectId)
|
|
242
|
+
continue;
|
|
243
|
+
const rk = ruleKey(rule.statement);
|
|
244
|
+
if (rk === null)
|
|
245
|
+
continue;
|
|
246
|
+
if (rk.subject === subject && subject !== '' && rk.polarity !== polarity) {
|
|
247
|
+
return { ...base, route: 'conflict', rule_ref: rule.id };
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// The model may name an in-force rule this restates: a question, never a silent swallow.
|
|
251
|
+
const sameAs = input.labels?.same_as;
|
|
252
|
+
if (typeof sameAs === 'string' && input.inForce.some((r) => r.id === sameAs)) {
|
|
253
|
+
return { ...base, route: 'maybe-restated', rule_ref: sameAs };
|
|
254
|
+
}
|
|
255
|
+
const autoEligible = input.actorKind === 'human' &&
|
|
256
|
+
input.authMode === 'required' &&
|
|
257
|
+
input.wordsSource === 'typed' &&
|
|
258
|
+
(template === 'T1-always' || template === 'T2-never') &&
|
|
259
|
+
durable &&
|
|
260
|
+
general &&
|
|
261
|
+
input.projectId !== null &&
|
|
262
|
+
input.labels?.approves_proposal !== true &&
|
|
263
|
+
!scrub.redacted;
|
|
264
|
+
if (autoEligible)
|
|
265
|
+
return { ...base, route: 'auto' };
|
|
266
|
+
if (durable && general)
|
|
267
|
+
return { ...base, route: 'offer' };
|
|
268
|
+
if (modelOffers(input.labels, durable, general, checkable, recurrence.count))
|
|
269
|
+
return { ...base, route: 'offer' };
|
|
270
|
+
return { ...base, route: 'ledger' };
|
|
271
|
+
}
|
|
272
|
+
/** The model's offer arm: type ∈ {rule, correction, scope} ∧ codify ∧ D ∧ G ∧ (C ∨ R). */
|
|
273
|
+
function modelOffers(labels, durable, general, checkable, recurrences) {
|
|
274
|
+
if (labels === undefined)
|
|
275
|
+
return false;
|
|
276
|
+
return ((labels.type === 'rule' || labels.type === 'correction' || labels.type === 'scope') &&
|
|
277
|
+
labels.codify &&
|
|
278
|
+
durable &&
|
|
279
|
+
general &&
|
|
280
|
+
(checkable || recurrences > 0));
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=derive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive.js","sourceRoot":"","sources":["../../src/decisions/derive.ts"],"names":[],"mappings":"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"}
|