wicked-crew 0.7.45 → 0.7.47
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/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 +6 -6
- 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 +10 -10
- 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/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +5 -1
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +31 -39
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +264 -104
- 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/seat-health.d.ts +35 -0
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +72 -0
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-standing.d.ts +2 -2
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +27 -7
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/server.d.ts +12 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +74 -1
- 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 +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +36 -0
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +177 -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/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 +23 -0
- package/dist/decisions/events.d.ts.map +1 -0
- package/dist/decisions/events.js +22 -0
- package/dist/decisions/events.js.map +1 -0
- package/dist/decisions/ingest.d.ts +28 -0
- package/dist/decisions/ingest.d.ts.map +1 -0
- package/dist/decisions/ingest.js +92 -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/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/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/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/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 +4 -4
- package/dist/standing-orders/store.d.ts +2 -2
- 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/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 +19 -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/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 +137 -0
- package/dist/watch/registry.d.ts.map +1 -0
- package/dist/watch/registry.js +530 -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 +110 -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 +178 -1
- package/package.json +3 -2
- 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/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,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where operator words enter the ledger (DES-decision-capture §4.3.1 / §4.3.2, DC-S4a).
|
|
3
|
+
*
|
|
4
|
+
* The structured hosts — a gate note, an elicitation answer, a run inject — call
|
|
5
|
+
* {@link ingestDecision} POST-COMMIT, after their action succeeded. Only a `human` actor is
|
|
6
|
+
* recorded: an agent's words are never a decision source (operator decision 4). `auth_mode` is the
|
|
7
|
+
* daemon's resolved auth and decides auto eligibility (§4.4). Derivation is deterministic; under
|
|
8
|
+
* `WICKED_DECISIONS=on` the record's route is then acted on (auto → `remember()`, offer → the review
|
|
9
|
+
* queue). Never throws into the host route: a failure is logged and the host's answer stands.
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { deriveDecision } from './derive.js';
|
|
13
|
+
import { DECISION_DETECTED } from './events.js';
|
|
14
|
+
import { newDecisionId } from './land.js';
|
|
15
|
+
export async function ingestDecision(service, input) {
|
|
16
|
+
const { ledger, authMode, log } = service.deps;
|
|
17
|
+
if (service.mode === 'off')
|
|
18
|
+
return null;
|
|
19
|
+
// §4.3.1: only human words are recorded — an agent token writes nothing at all.
|
|
20
|
+
if (input.actor.kind !== 'human')
|
|
21
|
+
return null;
|
|
22
|
+
const words = input.words.trim();
|
|
23
|
+
if (words === '' && input.choice === undefined)
|
|
24
|
+
return null;
|
|
25
|
+
try {
|
|
26
|
+
const now = service.deps.now?.() ?? Date.now();
|
|
27
|
+
const inForce = words === '' ? [] : await service.inForce(input.projectId);
|
|
28
|
+
const d = deriveDecision({
|
|
29
|
+
words,
|
|
30
|
+
actorKind: 'human',
|
|
31
|
+
authMode,
|
|
32
|
+
wordsSource: 'typed',
|
|
33
|
+
projectId: input.projectId,
|
|
34
|
+
inForce,
|
|
35
|
+
recurrence: (key) => ledger.recurrence(key),
|
|
36
|
+
now,
|
|
37
|
+
});
|
|
38
|
+
const record = {
|
|
39
|
+
op: 'record',
|
|
40
|
+
v: 1,
|
|
41
|
+
id: newDecisionId(now),
|
|
42
|
+
at: now,
|
|
43
|
+
project_id: input.projectId,
|
|
44
|
+
host: input.host,
|
|
45
|
+
origin: {
|
|
46
|
+
actor: { id: input.actor.id, kind: 'human', trust: input.actor.trust },
|
|
47
|
+
auth_mode: authMode,
|
|
48
|
+
run_id: input.runId,
|
|
49
|
+
...(input.ord !== undefined ? { ord: input.ord } : {}),
|
|
50
|
+
...(input.gateId !== undefined ? { gate_id: input.gateId } : {}),
|
|
51
|
+
...(input.elicitationId !== undefined ? { elicitation_id: input.elicitationId } : {}),
|
|
52
|
+
words: d.words,
|
|
53
|
+
...(input.choice !== undefined ? { choice: input.choice } : {}),
|
|
54
|
+
message_sha256: createHash('sha256').update(input.words).digest('hex'),
|
|
55
|
+
proposal: null,
|
|
56
|
+
words_source: 'typed',
|
|
57
|
+
redacted: d.redacted,
|
|
58
|
+
},
|
|
59
|
+
labels: {
|
|
60
|
+
deterministic: { template: d.template, exclusions: d.exclusions, dgc: d.dgc, recurrence: d.recurrence },
|
|
61
|
+
},
|
|
62
|
+
derived: {
|
|
63
|
+
statement: d.statement,
|
|
64
|
+
polarity: d.polarity,
|
|
65
|
+
key: d.key,
|
|
66
|
+
scope: d.scope,
|
|
67
|
+
steering_type: d.steering_type,
|
|
68
|
+
},
|
|
69
|
+
route: d.route,
|
|
70
|
+
...(d.rule_ref !== undefined ? { rule_ref: d.rule_ref } : {}),
|
|
71
|
+
};
|
|
72
|
+
ledger.appendRecord(record);
|
|
73
|
+
const emit = service.deps.emit;
|
|
74
|
+
if (emit !== null && emit !== undefined) {
|
|
75
|
+
await emit(DECISION_DETECTED, {
|
|
76
|
+
decision_id: record.id,
|
|
77
|
+
project_id: record.project_id,
|
|
78
|
+
host: record.host,
|
|
79
|
+
type: input.choice !== undefined && words === '' ? 'choice' : (d.template ?? 'none'),
|
|
80
|
+
route: record.route,
|
|
81
|
+
template: d.template,
|
|
82
|
+
}, `detected:${record.id}`).catch((err) => log?.(`[decisions] emit detected failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
83
|
+
}
|
|
84
|
+
await service.act(record);
|
|
85
|
+
return record;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
log?.(`[decisions] recording ${input.host} words for run ${input.runId} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/decisions/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE landing path for decisions (DES-decision-capture §4.5, DC-S4a): `remember()` and its
|
|
3
|
+
* siblings `undo` / `dismiss` / `widen` / `same`, plus the act-on-route step `ingest` hands over.
|
|
4
|
+
*
|
|
5
|
+
* Every landing — auto, the chip, Needs You, and `POST /proposals/:id/approve` of a proposal this
|
|
6
|
+
* ledger filed — goes through `remember()`, and the human check lives INSIDE it (actor kind
|
|
7
|
+
* `human` ∧ trust ≥ operator), so no route branch can skip it. Words, actor and ORIGIN come from
|
|
8
|
+
* the ledger, never from a proposal payload (which carries only the decision id).
|
|
9
|
+
*/
|
|
10
|
+
import type { CoreAdapter } from '../core/adapter.js';
|
|
11
|
+
import type { Actor, DecisionChangedFrame, SteeringType } from '../core/types.js';
|
|
12
|
+
import { type AuthMode } from '../api/auth.js';
|
|
13
|
+
import type { AuditLog } from '../api/audit.js';
|
|
14
|
+
import type { InForceRule } from './derive.js';
|
|
15
|
+
import { type DecisionBusEmit } from './events.js';
|
|
16
|
+
import type { DecisionLedger } from './ledger.js';
|
|
17
|
+
import type { DecisionDismissReason, DecisionRecord, DecisionsMode } from './types.js';
|
|
18
|
+
/** A refusal with its HTTP status (403 human check, 404 unknown, 409 wrong state, 502 upstream). */
|
|
19
|
+
export declare class DecisionError extends Error {
|
|
20
|
+
readonly status: 400 | 403 | 404 | 409 | 501 | 502;
|
|
21
|
+
constructor(status: 400 | 403 | 404 | 409 | 501 | 502, message: string);
|
|
22
|
+
}
|
|
23
|
+
export interface DecisionDeps {
|
|
24
|
+
ledger: DecisionLedger;
|
|
25
|
+
mode: DecisionsMode;
|
|
26
|
+
authMode: AuthMode;
|
|
27
|
+
estateTool: (tool: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
28
|
+
adapter: Pick<CoreAdapter, 'projectRulesSupported' | 'upsertConformanceRule' | 'readConformanceRule' | 'retireConformanceRule' | 'listConformanceRules'> & Partial<Pick<CoreAdapter, 'considerRules'>>;
|
|
29
|
+
audit: AuditLog;
|
|
30
|
+
emit?: DecisionBusEmit | null;
|
|
31
|
+
broadcast?: (frame: DecisionChangedFrame) => void;
|
|
32
|
+
log?: (msg: string) => void;
|
|
33
|
+
now?: () => number;
|
|
34
|
+
}
|
|
35
|
+
export interface RememberEdits {
|
|
36
|
+
statement?: string;
|
|
37
|
+
scope?: 'project' | 'everywhere';
|
|
38
|
+
steering_type?: SteeringType;
|
|
39
|
+
}
|
|
40
|
+
/** `dec_` + a uuid v7-shaped id: a 48-bit ms timestamp prefix so ids sort by time. */
|
|
41
|
+
export declare function newDecisionId(now?: number): string;
|
|
42
|
+
export declare class DecisionService {
|
|
43
|
+
readonly deps: DecisionDeps;
|
|
44
|
+
constructor(deps: DecisionDeps);
|
|
45
|
+
get mode(): DecisionsMode;
|
|
46
|
+
private readonly inFlight;
|
|
47
|
+
/** Per-decision serialization: two concurrent writes on one decision never both land (codex). */
|
|
48
|
+
private readonly locks;
|
|
49
|
+
private locked;
|
|
50
|
+
/** Run host-side work off the request path (`void`), tracked so tests and shutdown can await it. */
|
|
51
|
+
track(work: Promise<unknown>): void;
|
|
52
|
+
/** Resolves once every tracked host recording has settled. */
|
|
53
|
+
idle(): Promise<void>;
|
|
54
|
+
private now;
|
|
55
|
+
private log;
|
|
56
|
+
private requireHuman;
|
|
57
|
+
private requireRecord;
|
|
58
|
+
private viewOf;
|
|
59
|
+
private fact;
|
|
60
|
+
private changed;
|
|
61
|
+
private outcome;
|
|
62
|
+
/** The in-force rules for a project (this project's and the global ones). Fail-soft: `[]` + a log. */
|
|
63
|
+
inForce(projectId: string | null): Promise<InForceRule[]>;
|
|
64
|
+
/** Act on a record's route. Never throws: a failure is a `landing_failed` outcome + a log. */
|
|
65
|
+
act(record: DecisionRecord): Promise<void>;
|
|
66
|
+
/** Re-drive records whose route asks for an action but which have no outcome (a restart mid-landing). */
|
|
67
|
+
redrive(): Promise<number>;
|
|
68
|
+
/** The review-queue proposal already filed for a decision (idempotent re-drive), or `null`. */
|
|
69
|
+
private proposalFor;
|
|
70
|
+
private submitProposal;
|
|
71
|
+
/** File the decision into the review queue (the chip + its Needs You row are the same object). */
|
|
72
|
+
offer(record: DecisionRecord): Promise<string>;
|
|
73
|
+
private offerLocked;
|
|
74
|
+
remember(id: string, actor: Actor, opts: {
|
|
75
|
+
how: 'auto' | 'chip' | 'needs-you';
|
|
76
|
+
edits?: RememberEdits;
|
|
77
|
+
}): Promise<{
|
|
78
|
+
rule_id: string;
|
|
79
|
+
proposal_id: string;
|
|
80
|
+
project?: string;
|
|
81
|
+
}>;
|
|
82
|
+
private rememberLocked;
|
|
83
|
+
private isApproved;
|
|
84
|
+
/** Approve a proposal; one already approved (a re-drive after a crash) is not an error. */
|
|
85
|
+
private approve;
|
|
86
|
+
undo(id: string, actor: Actor): Promise<void>;
|
|
87
|
+
private undoLocked;
|
|
88
|
+
dismiss(id: string, actor: Actor, reason: DecisionDismissReason): Promise<void>;
|
|
89
|
+
private dismissLocked;
|
|
90
|
+
/** B7 "Same as your rule '…'? · Same · New rule" — resolves a `maybe-restated` decision. */
|
|
91
|
+
same(id: string, actor: Actor, same: boolean): Promise<{
|
|
92
|
+
rule_id?: string;
|
|
93
|
+
}>;
|
|
94
|
+
private sameLocked;
|
|
95
|
+
/** B8: one project-less successor that supersedes the same rule in every project. */
|
|
96
|
+
widen(id: string, actor: Actor): Promise<{
|
|
97
|
+
rule_id: string;
|
|
98
|
+
}>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=land.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"land.d.ts","sourceRoot":"","sources":["../../src/decisions/land.ts"],"names":[],"mappings":"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"}
|