@aligndottech/cli 0.50.0 → 0.51.0
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/README.md +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +33 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect-agents.d.ts.map +1 -1
- package/dist/commands/connect-agents.js +3 -1
- package/dist/commands/connect-agents.js.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +11 -0
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/invite.d.ts +8 -18
- package/dist/commands/invite.d.ts.map +1 -1
- package/dist/commands/invite.js +23 -46
- package/dist/commands/invite.js.map +1 -1
- package/dist/commands/join.d.ts +5 -0
- package/dist/commands/join.d.ts.map +1 -0
- package/dist/commands/join.js +49 -0
- package/dist/commands/join.js.map +1 -0
- package/dist/commands/local-relink.d.ts +35 -0
- package/dist/commands/local-relink.d.ts.map +1 -0
- package/dist/commands/local-relink.js +72 -0
- package/dist/commands/local-relink.js.map +1 -0
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/commands/local.js +37 -0
- package/dist/commands/local.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +21 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +12 -5
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +4 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/share.d.ts.map +1 -1
- package/dist/commands/share.js +81 -12
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +10 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/detector/detector-version.d.ts +16 -0
- package/dist/detector/detector-version.d.ts.map +1 -0
- package/dist/detector/detector-version.js +36 -0
- package/dist/detector/detector-version.js.map +1 -0
- package/dist/detector/relationship-contract.d.ts +30 -0
- package/dist/detector/relationship-contract.d.ts.map +1 -0
- package/dist/detector/relationship-contract.js +120 -0
- package/dist/detector/relationship-contract.js.map +1 -0
- package/dist/detector/relationship-contract.v1.json +53 -0
- package/dist/detector/relationship-prompt.d.ts +20 -0
- package/dist/detector/relationship-prompt.d.ts.map +1 -0
- package/dist/detector/relationship-prompt.js +55 -0
- package/dist/detector/relationship-prompt.js.map +1 -0
- package/dist/detector/relationship-prompt.v1.json +13 -0
- package/dist/detector/resolve-pair.d.ts +39 -0
- package/dist/detector/resolve-pair.d.ts.map +1 -0
- package/dist/detector/resolve-pair.js +345 -0
- package/dist/detector/resolve-pair.js.map +1 -0
- package/dist/detector/similar-item.d.ts +20 -0
- package/dist/detector/similar-item.d.ts.map +1 -0
- package/dist/detector/similar-item.js +16 -0
- package/dist/detector/similar-item.js.map +1 -0
- package/dist/index.js +29 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/advisory-dedup.d.ts.map +1 -1
- package/dist/lib/advisory-dedup.js +16 -8
- package/dist/lib/advisory-dedup.js.map +1 -1
- package/dist/lib/advisory-verdict.d.ts +19 -0
- package/dist/lib/advisory-verdict.d.ts.map +1 -1
- package/dist/lib/advisory-verdict.js +6 -3
- package/dist/lib/advisory-verdict.js.map +1 -1
- package/dist/lib/backup-exclusion.d.ts +10 -0
- package/dist/lib/backup-exclusion.d.ts.map +1 -0
- package/dist/lib/backup-exclusion.js +58 -0
- package/dist/lib/backup-exclusion.js.map +1 -0
- package/dist/lib/cli-oauth.d.ts +2 -0
- package/dist/lib/cli-oauth.d.ts.map +1 -1
- package/dist/lib/cli-oauth.js +61 -10
- package/dist/lib/cli-oauth.js.map +1 -1
- package/dist/lib/config.d.ts +41 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +106 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/curation/guardrail.d.ts.map +1 -1
- package/dist/lib/curation/guardrail.js +2 -0
- package/dist/lib/curation/guardrail.js.map +1 -1
- package/dist/lib/curation/judgements-db.d.ts +1 -0
- package/dist/lib/curation/judgements-db.d.ts.map +1 -1
- package/dist/lib/curation/judgements-db.js +9 -3
- package/dist/lib/curation/judgements-db.js.map +1 -1
- package/dist/lib/curation/mark.js +4 -2
- package/dist/lib/curation/mark.js.map +1 -1
- package/dist/lib/destination-name.d.ts +24 -0
- package/dist/lib/destination-name.d.ts.map +1 -0
- package/dist/lib/destination-name.js +39 -0
- package/dist/lib/destination-name.js.map +1 -0
- package/dist/lib/destination-summary.d.ts +6 -0
- package/dist/lib/destination-summary.d.ts.map +1 -0
- package/dist/lib/destination-summary.js +27 -0
- package/dist/lib/destination-summary.js.map +1 -0
- package/dist/lib/destination-trust.d.ts +54 -0
- package/dist/lib/destination-trust.d.ts.map +1 -0
- package/dist/lib/destination-trust.js +107 -0
- package/dist/lib/destination-trust.js.map +1 -0
- package/dist/lib/env-resolver.d.ts.map +1 -1
- package/dist/lib/env-resolver.js +3 -0
- package/dist/lib/env-resolver.js.map +1 -1
- package/dist/lib/fatal.d.ts +11 -0
- package/dist/lib/fatal.d.ts.map +1 -0
- package/dist/lib/fatal.js +22 -0
- package/dist/lib/fatal.js.map +1 -0
- package/dist/lib/gateway-client.d.ts +8 -16
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +30 -20
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/invite-prompt.d.ts +4 -4
- package/dist/lib/invite-prompt.d.ts.map +1 -1
- package/dist/lib/invite-prompt.js +4 -4
- package/dist/lib/invite-prompt.js.map +1 -1
- package/dist/lib/invite-settings.d.ts +18 -0
- package/dist/lib/invite-settings.d.ts.map +1 -0
- package/dist/lib/invite-settings.js +29 -0
- package/dist/lib/invite-settings.js.map +1 -0
- package/dist/lib/join-flow.d.ts +60 -0
- package/dist/lib/join-flow.d.ts.map +1 -0
- package/dist/lib/join-flow.js +282 -0
- package/dist/lib/join-flow.js.map +1 -0
- package/dist/lib/launch/mcp-child-env.d.ts.map +1 -1
- package/dist/lib/launch/mcp-child-env.js +5 -2
- package/dist/lib/launch/mcp-child-env.js.map +1 -1
- package/dist/lib/lead-prompt.d.ts +106 -0
- package/dist/lib/lead-prompt.d.ts.map +1 -0
- package/dist/lib/lead-prompt.js +175 -0
- package/dist/lib/lead-prompt.js.map +1 -0
- package/dist/lib/local-candidate-classify.d.ts +26 -0
- package/dist/lib/local-candidate-classify.d.ts.map +1 -0
- package/dist/lib/local-candidate-classify.js +53 -0
- package/dist/lib/local-candidate-classify.js.map +1 -0
- package/dist/lib/local-db-migrate.d.ts +1 -1
- package/dist/lib/local-db-migrate.d.ts.map +1 -1
- package/dist/lib/local-db-migrate.js +45 -1
- package/dist/lib/local-db-migrate.js.map +1 -1
- package/dist/lib/local-db-v12.d.ts +17 -0
- package/dist/lib/local-db-v12.d.ts.map +1 -0
- package/dist/lib/local-db-v12.js +8 -0
- package/dist/lib/local-db-v12.js.map +1 -0
- package/dist/lib/local-db.d.ts +13 -13
- package/dist/lib/local-db.d.ts.map +1 -1
- package/dist/lib/local-db.js +41 -6
- package/dist/lib/local-db.js.map +1 -1
- package/dist/lib/local-gateway-client.d.ts +1 -0
- package/dist/lib/local-gateway-client.d.ts.map +1 -1
- package/dist/lib/local-gateway-client.js +31 -20
- package/dist/lib/local-gateway-client.js.map +1 -1
- package/dist/lib/local-ingest.d.ts +2 -0
- package/dist/lib/local-ingest.d.ts.map +1 -1
- package/dist/lib/local-ingest.js.map +1 -1
- package/dist/lib/local-link-pass.d.ts.map +1 -1
- package/dist/lib/local-link-pass.js +25 -29
- package/dist/lib/local-link-pass.js.map +1 -1
- package/dist/lib/local-llm.d.ts +1 -1
- package/dist/lib/local-llm.d.ts.map +1 -1
- package/dist/lib/local-llm.js +3 -2
- package/dist/lib/local-llm.js.map +1 -1
- package/dist/lib/local-mode.d.ts +5 -1
- package/dist/lib/local-mode.d.ts.map +1 -1
- package/dist/lib/local-mode.js +11 -6
- package/dist/lib/local-mode.js.map +1 -1
- package/dist/lib/local-relationship-classifier.d.ts +4 -0
- package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
- package/dist/lib/local-relationship-classifier.js +9 -4
- package/dist/lib/local-relationship-classifier.js.map +1 -1
- package/dist/lib/local-relink.d.ts +59 -0
- package/dist/lib/local-relink.d.ts.map +1 -0
- package/dist/lib/local-relink.js +171 -0
- package/dist/lib/local-relink.js.map +1 -0
- package/dist/lib/local-set-classifier.d.ts +36 -0
- package/dist/lib/local-set-classifier.d.ts.map +1 -0
- package/dist/lib/local-set-classifier.js +81 -0
- package/dist/lib/local-set-classifier.js.map +1 -0
- package/dist/lib/local-snapshot-loader.d.ts +29 -0
- package/dist/lib/local-snapshot-loader.d.ts.map +1 -0
- package/dist/lib/local-snapshot-loader.js +108 -0
- package/dist/lib/local-snapshot-loader.js.map +1 -0
- package/dist/lib/login-flow.d.ts +15 -0
- package/dist/lib/login-flow.d.ts.map +1 -1
- package/dist/lib/login-flow.js +80 -4
- package/dist/lib/login-flow.js.map +1 -1
- package/dist/lib/mcp/share-status-tool.d.ts +13 -0
- package/dist/lib/mcp/share-status-tool.d.ts.map +1 -0
- package/dist/lib/mcp/share-status-tool.js +116 -0
- package/dist/lib/mcp/share-status-tool.js.map +1 -0
- package/dist/lib/mcp/share-tool.d.ts +18 -14
- package/dist/lib/mcp/share-tool.d.ts.map +1 -1
- package/dist/lib/mcp/share-tool.js +127 -21
- package/dist/lib/mcp/share-tool.js.map +1 -1
- package/dist/lib/model-cache.d.ts +10 -0
- package/dist/lib/model-cache.d.ts.map +1 -0
- package/dist/lib/model-cache.js +35 -0
- package/dist/lib/model-cache.js.map +1 -0
- package/dist/lib/next-step.d.ts.map +1 -1
- package/dist/lib/next-step.js +2 -1
- package/dist/lib/next-step.js.map +1 -1
- package/dist/lib/private-files.d.ts +33 -0
- package/dist/lib/private-files.d.ts.map +1 -0
- package/dist/lib/private-files.js +96 -0
- package/dist/lib/private-files.js.map +1 -0
- package/dist/lib/redaction-notice.d.ts +7 -0
- package/dist/lib/redaction-notice.d.ts.map +1 -0
- package/dist/lib/redaction-notice.js +32 -0
- package/dist/lib/redaction-notice.js.map +1 -0
- package/dist/lib/relink-estimate.d.ts +16 -0
- package/dist/lib/relink-estimate.d.ts.map +1 -0
- package/dist/lib/relink-estimate.js +30 -0
- package/dist/lib/relink-estimate.js.map +1 -0
- package/dist/lib/resolve-env.d.ts +15 -1
- package/dist/lib/resolve-env.d.ts.map +1 -1
- package/dist/lib/resolve-env.js +27 -7
- package/dist/lib/resolve-env.js.map +1 -1
- package/dist/lib/scope-defaults.d.ts.map +1 -1
- package/dist/lib/scope-defaults.js +2 -0
- package/dist/lib/scope-defaults.js.map +1 -1
- package/dist/lib/scope-real.d.ts +57 -0
- package/dist/lib/scope-real.d.ts.map +1 -1
- package/dist/lib/setup-route.d.ts +4 -2
- package/dist/lib/setup-route.d.ts.map +1 -1
- package/dist/lib/setup-route.js +12 -6
- package/dist/lib/setup-route.js.map +1 -1
- package/dist/lib/share/approval.d.ts +71 -0
- package/dist/lib/share/approval.d.ts.map +1 -0
- package/dist/lib/share/approval.js +139 -0
- package/dist/lib/share/approval.js.map +1 -0
- package/dist/lib/share/approve-link.d.ts +31 -0
- package/dist/lib/share/approve-link.d.ts.map +1 -0
- package/dist/lib/share/approve-link.js +46 -0
- package/dist/lib/share/approve-link.js.map +1 -0
- package/dist/lib/share/browser-flow.d.ts +85 -0
- package/dist/lib/share/browser-flow.d.ts.map +1 -0
- package/dist/lib/share/browser-flow.js +168 -0
- package/dist/lib/share/browser-flow.js.map +1 -0
- package/dist/lib/share/command.d.ts +34 -1
- package/dist/lib/share/command.d.ts.map +1 -1
- package/dist/lib/share/command.js +153 -11
- package/dist/lib/share/command.js.map +1 -1
- package/dist/lib/share/delivery-options.d.ts +15 -0
- package/dist/lib/share/delivery-options.d.ts.map +1 -0
- package/dist/lib/share/delivery-options.js +16 -0
- package/dist/lib/share/delivery-options.js.map +1 -0
- package/dist/lib/share/delivery.d.ts +83 -0
- package/dist/lib/share/delivery.d.ts.map +1 -0
- package/dist/lib/share/delivery.js +134 -0
- package/dist/lib/share/delivery.js.map +1 -0
- package/dist/lib/share/envelope.d.ts +61 -0
- package/dist/lib/share/envelope.d.ts.map +1 -0
- package/dist/lib/share/envelope.js +99 -0
- package/dist/lib/share/envelope.js.map +1 -0
- package/dist/lib/share/ledger.d.ts.map +1 -1
- package/dist/lib/share/ledger.js +3 -1
- package/dist/lib/share/ledger.js.map +1 -1
- package/dist/lib/share/payload.d.ts +9 -0
- package/dist/lib/share/payload.d.ts.map +1 -1
- package/dist/lib/share/payload.js +9 -0
- package/dist/lib/share/payload.js.map +1 -1
- package/dist/lib/share/pending.d.ts +47 -1
- package/dist/lib/share/pending.d.ts.map +1 -1
- package/dist/lib/share/pending.js +139 -13
- package/dist/lib/share/pending.js.map +1 -1
- package/dist/lib/share/preview.d.ts +5 -1
- package/dist/lib/share/preview.d.ts.map +1 -1
- package/dist/lib/share/preview.js +3 -1
- package/dist/lib/share/preview.js.map +1 -1
- package/dist/lib/share/qr.d.ts +13 -0
- package/dist/lib/share/qr.d.ts.map +1 -0
- package/dist/lib/share/qr.js +77 -0
- package/dist/lib/share/qr.js.map +1 -0
- package/dist/lib/share/requests-client.d.ts +63 -0
- package/dist/lib/share/requests-client.d.ts.map +1 -0
- package/dist/lib/share/requests-client.js +69 -0
- package/dist/lib/share/requests-client.js.map +1 -0
- package/dist/lib/share/run.d.ts +20 -1
- package/dist/lib/share/run.d.ts.map +1 -1
- package/dist/lib/share/run.js +27 -10
- package/dist/lib/share/run.js.map +1 -1
- package/dist/lib/share/secret-scan.d.ts +5 -0
- package/dist/lib/share/secret-scan.d.ts.map +1 -1
- package/dist/lib/share/secret-scan.js +43 -2
- package/dist/lib/share/secret-scan.js.map +1 -1
- package/dist/lib/share/target.d.ts +38 -0
- package/dist/lib/share/target.d.ts.map +1 -0
- package/dist/lib/share/target.js +80 -0
- package/dist/lib/share/target.js.map +1 -0
- package/dist/lib/share/tty.d.ts +8 -0
- package/dist/lib/share/tty.d.ts.map +1 -1
- package/dist/lib/share/tty.js +45 -0
- package/dist/lib/share/tty.js.map +1 -1
- package/dist/lib/source-sync-state.d.ts.map +1 -1
- package/dist/lib/source-sync-state.js +2 -0
- package/dist/lib/source-sync-state.js.map +1 -1
- package/dist/lib/sync/blocked.d.ts.map +1 -1
- package/dist/lib/sync/blocked.js +2 -1
- package/dist/lib/sync/blocked.js.map +1 -1
- package/dist/lib/sync/classify.d.ts.map +1 -1
- package/dist/lib/sync/classify.js +2 -0
- package/dist/lib/sync/classify.js.map +1 -1
- package/dist/lib/sync/real-env.d.ts +57 -0
- package/dist/lib/sync/real-env.d.ts.map +1 -1
- package/dist/lib/sync/sync-state.d.ts.map +1 -1
- package/dist/lib/sync/sync-state.js +3 -1
- package/dist/lib/sync/sync-state.js.map +1 -1
- package/dist/lib/usage-telemetry.d.ts +2 -2
- package/dist/lib/usage-telemetry.d.ts.map +1 -1
- package/dist/lib/usage-telemetry.js +21 -3
- package/dist/lib/usage-telemetry.js.map +1 -1
- package/package.json +4 -2
- package/dist/lib/personal-email-domains.d.ts +0 -8
- package/dist/lib/personal-email-domains.d.ts.map +0 -1
- package/dist/lib/personal-email-domains.js +0 -39
- package/dist/lib/personal-email-domains.js.map +0 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript port of the brain's pure pair resolver, `resolve_incompatible_pair` in align-stack
|
|
3
|
+
* `services/brain/app/relationship_type_rules.py` (ALI-625, ALI-1042, ALI-1050).
|
|
4
|
+
*
|
|
5
|
+
* The model reports only that two decisions are INCOMPATIBLE, plus which side's own text replaces
|
|
6
|
+
* the other. Whether that is a supersession or a conflict is a question about dates, authorship
|
|
7
|
+
* and status, so it is computed here and never taken from the model. Every ambiguous case
|
|
8
|
+
* resolves to the non-destructive `conflicts_with`.
|
|
9
|
+
*
|
|
10
|
+
* Checked against resolver-vectors.json, generated by running the brain's REAL function
|
|
11
|
+
* (scripts/gen-resolver-vectors.py). Change the brain first, regenerate, then port.
|
|
12
|
+
*
|
|
13
|
+
* Pure: no I/O, no clock, no network.
|
|
14
|
+
*/
|
|
15
|
+
/** Within this window two decisions are concurrent and a supersession is refused. */
|
|
16
|
+
export const CONCURRENT_WINDOW_HOURS = 24;
|
|
17
|
+
// A Map, not an object literal: `__proto__` or `toString` must read as unknown (0), as dict.get does.
|
|
18
|
+
const STANDING_RANK = new Map([['human', 3], ['ratified_agent', 2], ['unratified_agent', 1]]);
|
|
19
|
+
const AUTHOR_SENTINELS = new Set(['unknown']);
|
|
20
|
+
const RETIRED_STATUSES = new Set(['superseded', 'archived', 'corrected']);
|
|
21
|
+
// ---- A port of CPython 3.14's C datetime.fromisoformat (Modules/_datetimemodule.c) -------------
|
|
22
|
+
// Python's parse_decided_at is `_as_utc(fromisoformat(value.replace("Z", "+00:00")))`, naive read
|
|
23
|
+
// as UTC, and a ValueError is MISSING. The C implementation is what runs, and it differs from the
|
|
24
|
+
// pure-Python _pydatetime in ways that matter here: it works on the UTF-8 BYTES, reads exactly two
|
|
25
|
+
// digits per field, needs a time after any separator character, tolerates one stray character
|
|
26
|
+
// right before a UTC offset, and parses a fraction with no '.' in the compact form. Ported
|
|
27
|
+
// structurally, with C's NUL terminator modelled as byte 0 past the end, and checked against
|
|
28
|
+
// date-fuzz-corpus.json (4,000 strings with Python 3.14's own verdict) and resolver-vectors.json.
|
|
29
|
+
// No trimming: Python does not trim.
|
|
30
|
+
/** A NUL-terminated byte view: reads past the end return 0, as C's string does. */
|
|
31
|
+
class Bytes {
|
|
32
|
+
b;
|
|
33
|
+
constructor(b) {
|
|
34
|
+
this.b = b;
|
|
35
|
+
}
|
|
36
|
+
at(i) { return i >= 0 && i < this.b.length ? this.b[i] : 0; }
|
|
37
|
+
}
|
|
38
|
+
const isDigitByte = (c) => c >= 0x30 && c <= 0x39;
|
|
39
|
+
/** Exactly `n` ASCII digits at `p`, or null. */
|
|
40
|
+
function readDigits(s, p, n) {
|
|
41
|
+
let v = 0;
|
|
42
|
+
for (let k = 0; k < n; k++) {
|
|
43
|
+
const c = s.at(p + k);
|
|
44
|
+
if (!isDigitByte(c))
|
|
45
|
+
return null;
|
|
46
|
+
v = v * 10 + (c - 0x30);
|
|
47
|
+
}
|
|
48
|
+
return { v, p: p + n };
|
|
49
|
+
}
|
|
50
|
+
function isLeap(y) { return y % 4 === 0 && (y % 100 !== 0 || y % 400 === 0); }
|
|
51
|
+
const DAYS_IN_MONTH = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
|
|
52
|
+
function daysInMonth(y, m) { return m === 2 && isLeap(y) ? 29 : DAYS_IN_MONTH[m] ?? 0; }
|
|
53
|
+
function daysBeforeYear(y) { const p = y - 1; return p * 365 + Math.floor(p / 4) - Math.floor(p / 100) + Math.floor(p / 400); }
|
|
54
|
+
/** Proleptic Gregorian ordinal, 0001-01-01 = 1 (Python's _ymd2ord). */
|
|
55
|
+
function ymd2ord(y, m, d) {
|
|
56
|
+
let before = 0;
|
|
57
|
+
for (let k = 1; k < m; k++)
|
|
58
|
+
before += daysInMonth(y, k);
|
|
59
|
+
return daysBeforeYear(y) + before + d;
|
|
60
|
+
}
|
|
61
|
+
function ord2ymd(n) {
|
|
62
|
+
let y = Math.max(1, Math.floor(n / 365.2425) - 1);
|
|
63
|
+
while (daysBeforeYear(y + 1) < n)
|
|
64
|
+
y++;
|
|
65
|
+
while (daysBeforeYear(y) >= n)
|
|
66
|
+
y--;
|
|
67
|
+
let rest = n - daysBeforeYear(y);
|
|
68
|
+
let m = 1;
|
|
69
|
+
while (rest > daysInMonth(y, m)) {
|
|
70
|
+
rest -= daysInMonth(y, m);
|
|
71
|
+
m++;
|
|
72
|
+
}
|
|
73
|
+
return [y, m, rest];
|
|
74
|
+
}
|
|
75
|
+
/** _find_isoformat_datetime_separator, on bytes; -1 is invalid. */
|
|
76
|
+
function separatorAt(s, len) {
|
|
77
|
+
if (len === 7)
|
|
78
|
+
return 7;
|
|
79
|
+
if (s.at(4) === 0x2d) {
|
|
80
|
+
if (s.at(5) === 0x57) {
|
|
81
|
+
if (len < 8)
|
|
82
|
+
return -1;
|
|
83
|
+
if (len > 8 && s.at(8) === 0x2d) {
|
|
84
|
+
if (len === 9)
|
|
85
|
+
return -1;
|
|
86
|
+
if (len > 10 && isDigitByte(s.at(10)))
|
|
87
|
+
return 8;
|
|
88
|
+
return 10;
|
|
89
|
+
}
|
|
90
|
+
return 8;
|
|
91
|
+
}
|
|
92
|
+
return 10;
|
|
93
|
+
}
|
|
94
|
+
if (s.at(4) === 0x57) {
|
|
95
|
+
let idx = 7;
|
|
96
|
+
while (idx < len && isDigitByte(s.at(idx)))
|
|
97
|
+
idx++;
|
|
98
|
+
if (idx < 9)
|
|
99
|
+
return idx;
|
|
100
|
+
return idx % 2 === 0 ? 7 : 8;
|
|
101
|
+
}
|
|
102
|
+
return 8;
|
|
103
|
+
}
|
|
104
|
+
/** parse_isoformat_date: [y, m, d] or null. Reads past `len` exactly as C does. */
|
|
105
|
+
function parseDate(s, len) {
|
|
106
|
+
const y = readDigits(s, 0, 4);
|
|
107
|
+
if (!y)
|
|
108
|
+
return null;
|
|
109
|
+
let p = y.p;
|
|
110
|
+
const usesSep = s.at(p) === 0x2d;
|
|
111
|
+
if (usesSep)
|
|
112
|
+
p++;
|
|
113
|
+
if (s.at(p) === 0x57) {
|
|
114
|
+
p++;
|
|
115
|
+
const w = readDigits(s, p, 2);
|
|
116
|
+
if (!w)
|
|
117
|
+
return null;
|
|
118
|
+
p = w.p;
|
|
119
|
+
let day = 1;
|
|
120
|
+
if (p < len) {
|
|
121
|
+
if (usesSep) {
|
|
122
|
+
if (s.at(p) !== 0x2d)
|
|
123
|
+
return null;
|
|
124
|
+
p++;
|
|
125
|
+
}
|
|
126
|
+
const d = readDigits(s, p, 1);
|
|
127
|
+
if (!d)
|
|
128
|
+
return null;
|
|
129
|
+
day = d.v;
|
|
130
|
+
}
|
|
131
|
+
const year = y.v;
|
|
132
|
+
if (year < 1 || year > 9999)
|
|
133
|
+
return null;
|
|
134
|
+
if (!(w.v > 0 && w.v < 53)) {
|
|
135
|
+
const firstWeekday = ymd2ord(year, 1, 1) % 7;
|
|
136
|
+
if (!(w.v === 53 && (firstWeekday === 4 || (firstWeekday === 3 && isLeap(year)))))
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
if (!(day > 0 && day < 8))
|
|
140
|
+
return null;
|
|
141
|
+
const first = ymd2ord(year, 1, 1);
|
|
142
|
+
const firstWd = (first + 6) % 7;
|
|
143
|
+
let week1Monday = first - firstWd;
|
|
144
|
+
if (firstWd > 3)
|
|
145
|
+
week1Monday += 7;
|
|
146
|
+
return ord2ymd(week1Monday + (w.v - 1) * 7 + (day - 1));
|
|
147
|
+
}
|
|
148
|
+
const m = readDigits(s, p, 2);
|
|
149
|
+
if (!m)
|
|
150
|
+
return null;
|
|
151
|
+
p = m.p;
|
|
152
|
+
if (usesSep) {
|
|
153
|
+
if (s.at(p) !== 0x2d)
|
|
154
|
+
return null;
|
|
155
|
+
p++;
|
|
156
|
+
}
|
|
157
|
+
const d = readDigits(s, p, 2);
|
|
158
|
+
if (!d)
|
|
159
|
+
return null;
|
|
160
|
+
return [y.v, m.v, d.v];
|
|
161
|
+
}
|
|
162
|
+
/** parse_hh_mm_ss_ff over [p, end): -1 on error, else 0 (clean end) or 1 (something follows). */
|
|
163
|
+
function parseHms(s, p, end, out) {
|
|
164
|
+
out[0] = out[1] = out[2] = out[3] = 0;
|
|
165
|
+
let hasSep = true;
|
|
166
|
+
let fraction = false;
|
|
167
|
+
for (let i = 0; i < 3; i++) {
|
|
168
|
+
const r = readDigits(s, p, 2);
|
|
169
|
+
if (!r)
|
|
170
|
+
return -1;
|
|
171
|
+
out[i] = r.v;
|
|
172
|
+
p = r.p;
|
|
173
|
+
const c = s.at(p);
|
|
174
|
+
p++;
|
|
175
|
+
if (i === 0)
|
|
176
|
+
hasSep = c === 0x3a;
|
|
177
|
+
// A decimal mark with nothing after it is an error even right before an offset (checked on 3.14).
|
|
178
|
+
if ((c === 0x2e || c === 0x2c) && p >= end)
|
|
179
|
+
return -1;
|
|
180
|
+
if (p >= end)
|
|
181
|
+
return c !== 0 ? 1 : 0;
|
|
182
|
+
if (hasSep && c === 0x3a) {
|
|
183
|
+
if (i === 2)
|
|
184
|
+
return -1;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (c === 0x2e || c === 0x2c) {
|
|
188
|
+
if (i < 2)
|
|
189
|
+
return -1;
|
|
190
|
+
fraction = true;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
if (!hasSep) {
|
|
194
|
+
p--;
|
|
195
|
+
if (i === 2)
|
|
196
|
+
fraction = true;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
return -1;
|
|
200
|
+
}
|
|
201
|
+
if (!fraction)
|
|
202
|
+
return s.at(p) !== 0 ? 1 : 0;
|
|
203
|
+
const remains = end - p;
|
|
204
|
+
const toParse = remains >= 6 ? 6 : remains;
|
|
205
|
+
const f = readDigits(s, p, toParse);
|
|
206
|
+
if (!f)
|
|
207
|
+
return -1;
|
|
208
|
+
out[3] = toParse < 6 ? f.v * [100000, 10000, 1000, 100, 10][toParse - 1] : f.v;
|
|
209
|
+
p = f.p;
|
|
210
|
+
while (isDigitByte(s.at(p)))
|
|
211
|
+
p++;
|
|
212
|
+
return s.at(p) !== 0 ? 1 : 0;
|
|
213
|
+
}
|
|
214
|
+
const MIN_US = -62135596800000000n; // 0001-01-01T00:00:00Z
|
|
215
|
+
const MAX_US = 253402300799999999n; // 9999-12-31T23:59:59.999999Z
|
|
216
|
+
/** Microseconds since 1970-01-01T00:00:00Z, or null where Python's parse_decided_at gives None (or raises). */
|
|
217
|
+
export function parseDecidedAt(value) {
|
|
218
|
+
if (typeof value !== 'string')
|
|
219
|
+
return null;
|
|
220
|
+
const replaced = value.replaceAll('Z', '+00:00');
|
|
221
|
+
if (replaced.length < 7)
|
|
222
|
+
return null;
|
|
223
|
+
if (/[\uD800-\uDFFF]/.test(replaced))
|
|
224
|
+
return null; // a lone surrogate cannot be UTF-8 encoded
|
|
225
|
+
const s = new Bytes(new TextEncoder().encode(replaced));
|
|
226
|
+
const len = s.b.length;
|
|
227
|
+
const sep = separatorAt(s, len);
|
|
228
|
+
if (sep < 0)
|
|
229
|
+
return null;
|
|
230
|
+
const date = parseDate(s, sep);
|
|
231
|
+
if (!date)
|
|
232
|
+
return null;
|
|
233
|
+
let [y, m, d] = date;
|
|
234
|
+
const t = [0, 0, 0, 0];
|
|
235
|
+
let offsetUs = 0n;
|
|
236
|
+
if (len > sep) {
|
|
237
|
+
const lead = s.at(sep);
|
|
238
|
+
let p = sep + ((lead & 0x80) === 0 ? 1 : (lead & 0xf0) === 0xe0 ? 3 : (lead & 0xf0) === 0xf0 ? 4 : 2);
|
|
239
|
+
const end = len;
|
|
240
|
+
let tz = p;
|
|
241
|
+
do {
|
|
242
|
+
const c = s.at(tz);
|
|
243
|
+
if (c === 0x5a || c === 0x2b || c === 0x2d)
|
|
244
|
+
break;
|
|
245
|
+
} while (++tz < end);
|
|
246
|
+
const rv = parseHms(s, p, tz, t);
|
|
247
|
+
if (rv < 0)
|
|
248
|
+
return null;
|
|
249
|
+
if (tz >= end) {
|
|
250
|
+
if (rv === 1)
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
else if (s.at(tz) === 0x5a) {
|
|
254
|
+
if (s.at(tz + 1) !== 0)
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const sign = s.at(tz) === 0x2d ? -1n : 1n;
|
|
259
|
+
p = tz + 1;
|
|
260
|
+
const tzc = [0, 0, 0, 0];
|
|
261
|
+
if (parseHms(s, p, end, tzc) !== 0)
|
|
262
|
+
return null;
|
|
263
|
+
offsetUs = sign * (BigInt(tzc[0]) * 3600000000n + BigInt(tzc[1]) * 60000000n + BigInt(tzc[2]) * 1000000n + BigInt(tzc[3]));
|
|
264
|
+
if (offsetUs >= 86400000000n || offsetUs <= -86400000000n)
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const [h0, mi, se, us] = t;
|
|
269
|
+
let h = h0;
|
|
270
|
+
if (h === 24 && m <= 12 && d <= daysInMonth(y, m)) {
|
|
271
|
+
if (mi !== 0 || se !== 0 || us !== 0)
|
|
272
|
+
return null;
|
|
273
|
+
h = 0;
|
|
274
|
+
d += 1;
|
|
275
|
+
if (d > daysInMonth(y, m)) {
|
|
276
|
+
d = 1;
|
|
277
|
+
m += 1;
|
|
278
|
+
if (m > 12) {
|
|
279
|
+
m = 1;
|
|
280
|
+
y += 1;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (y < 1 || y > 9999 || m < 1 || m > 12 || d < 1 || d > daysInMonth(y, m))
|
|
285
|
+
return null;
|
|
286
|
+
if (h > 23 || mi > 59 || se > 59 || us > 999999)
|
|
287
|
+
return null;
|
|
288
|
+
const EPOCH_ORD = 719163; // ymd2ord(1970, 1, 1)
|
|
289
|
+
const local = BigInt(ymd2ord(y, m, d) - EPOCH_ORD) * 86400000000n + BigInt(h) * 3600000000n + BigInt(mi) * 60000000n + BigInt(se) * 1000000n + BigInt(us);
|
|
290
|
+
const utc = local - offsetUs;
|
|
291
|
+
// _as_utc's astimezone raises OverflowError past the datetime range: the brain gets no date.
|
|
292
|
+
if (offsetUs !== 0n && (utc < MIN_US || utc > MAX_US))
|
|
293
|
+
return null;
|
|
294
|
+
return utc;
|
|
295
|
+
}
|
|
296
|
+
/** Python's str.isspace set, so strip() here removes exactly what Python's does (JS trim also strips U+FEFF). */
|
|
297
|
+
const PY_WHITESPACE = new Set([0x9, 0xa, 0xb, 0xc, 0xd, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x85, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003,
|
|
298
|
+
0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000]);
|
|
299
|
+
export function pyStrip(s) {
|
|
300
|
+
let a = 0;
|
|
301
|
+
let b = s.length;
|
|
302
|
+
while (a < b && PY_WHITESPACE.has(s.charCodeAt(a)))
|
|
303
|
+
a++;
|
|
304
|
+
while (b > a && PY_WHITESPACE.has(s.charCodeAt(b - 1)))
|
|
305
|
+
b--;
|
|
306
|
+
return s.slice(a, b);
|
|
307
|
+
}
|
|
308
|
+
export function normalizeAuthor(value) {
|
|
309
|
+
if (typeof value !== 'string')
|
|
310
|
+
return null;
|
|
311
|
+
const normalized = pyStrip(value).toLowerCase();
|
|
312
|
+
if (!normalized || AUTHOR_SENTINELS.has(normalized))
|
|
313
|
+
return null;
|
|
314
|
+
return normalized;
|
|
315
|
+
}
|
|
316
|
+
export function isRetired(status) {
|
|
317
|
+
return status !== null && status !== undefined && RETIRED_STATUSES.has(status);
|
|
318
|
+
}
|
|
319
|
+
const rank = (standing) => (typeof standing === 'string' ? STANDING_RANK.get(standing) ?? 0 : 0);
|
|
320
|
+
const conflict = (a, b) => ({ type: 'conflicts_with', fromId: a.id, toId: b.id });
|
|
321
|
+
/** The edge for an incompatible pair, or null for no edge at all. */
|
|
322
|
+
export function resolveIncompatiblePair(a, b, explicitReplacementBy = null) {
|
|
323
|
+
if (isRetired(a.status) || isRetired(b.status))
|
|
324
|
+
return null;
|
|
325
|
+
if ((b.exceptedBy ?? []).includes(a.id) || (a.exceptedBy ?? []).includes(b.id))
|
|
326
|
+
return null;
|
|
327
|
+
const aAt = parseDecidedAt(a.decidedAt);
|
|
328
|
+
const bAt = parseDecidedAt(b.decidedAt);
|
|
329
|
+
if (aAt === null || bAt === null)
|
|
330
|
+
return conflict(a, b);
|
|
331
|
+
// Python's sorted() is stable, so on a tie `a` stays first.
|
|
332
|
+
const [first, second, firstAt, secondAt] = bAt < aAt ? [b, a, bAt, aAt] : [a, b, aAt, bAt];
|
|
333
|
+
if (secondAt - firstAt <= BigInt(CONCURRENT_WINDOW_HOURS) * 3600000000n)
|
|
334
|
+
return conflict(a, b);
|
|
335
|
+
const aAuthor = normalizeAuthor(a.author);
|
|
336
|
+
const sameAuthor = aAuthor !== null && aAuthor === normalizeAuthor(b.author);
|
|
337
|
+
const claimAgreesWithClock = explicitReplacementBy !== null && pyStrip(explicitReplacementBy) === second.id;
|
|
338
|
+
if (sameAuthor || claimAgreesWithClock) {
|
|
339
|
+
if (rank(second.standing) < rank(first.standing))
|
|
340
|
+
return conflict(a, b);
|
|
341
|
+
return { type: 'supersedes', fromId: second.id, toId: first.id };
|
|
342
|
+
}
|
|
343
|
+
return conflict(a, b);
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=resolve-pair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-pair.js","sourceRoot":"","sources":["../../src/detector/resolve-pair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One `similar[]` entry -> the edge to write, ported from the brain's
|
|
3
|
+
* `resolve_similar_relationships` (verdict_resolution.py, ALI-637) for a single entry.
|
|
4
|
+
*
|
|
5
|
+
* A non-verdict type passes through. `incompatible` goes through resolveIncompatiblePair with the
|
|
6
|
+
* new decision as side A; the model's `replaced` side becomes the replacing id. A `supersedes` the
|
|
7
|
+
* resolver orients candidate -> new cannot be written on a new-vs-candidate edge, so it degrades
|
|
8
|
+
* to `conflicts_with` with the same reason the brain appends.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParsedRelationshipItem } from './relationship-contract.js';
|
|
11
|
+
import { type PairSide } from './resolve-pair.js';
|
|
12
|
+
export declare const NEW_DECISION_REF = "__new_decision__";
|
|
13
|
+
export declare const DIRECTION_FALLBACK_REASON = "existing decision is more recent; supersession toward the new decision is not expressible on this path";
|
|
14
|
+
export interface ResolvedItem {
|
|
15
|
+
type: string;
|
|
16
|
+
confidence: number;
|
|
17
|
+
reason: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function resolveSimilarItem(item: ParsedRelationshipItem, newSide: PairSide, candidate: PairSide): ResolvedItem | null;
|
|
20
|
+
//# sourceMappingURL=similar-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similar-item.d.ts","sourceRoot":"","sources":["../../src/detector/similar-item.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,KAAK,QAAQ,EAA2B,MAAM,mBAAmB,CAAC;AAE3E,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,yBAAyB,2GACoE,CAAC;AAE3G,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAS5H"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { resolveIncompatiblePair } from './resolve-pair.js';
|
|
2
|
+
export const NEW_DECISION_REF = '__new_decision__';
|
|
3
|
+
export const DIRECTION_FALLBACK_REASON = 'existing decision is more recent; supersession toward the new decision is not expressible on this path';
|
|
4
|
+
export function resolveSimilarItem(item, newSide, candidate) {
|
|
5
|
+
if (item.type !== 'incompatible')
|
|
6
|
+
return { type: item.type, confidence: item.confidence, reason: item.reason };
|
|
7
|
+
const replacingId = item.replaced === 'new' ? newSide.id : item.replaced === 'existing' ? candidate.id : null;
|
|
8
|
+
const resolution = resolveIncompatiblePair(newSide, candidate, replacingId);
|
|
9
|
+
if (resolution === null)
|
|
10
|
+
return null;
|
|
11
|
+
if (resolution.type === 'supersedes' && resolution.fromId !== newSide.id) {
|
|
12
|
+
return { type: 'conflicts_with', confidence: item.confidence, reason: item.reason ? `${item.reason}; ${DIRECTION_FALLBACK_REASON}` : DIRECTION_FALLBACK_REASON };
|
|
13
|
+
}
|
|
14
|
+
return { type: resolution.type, confidence: item.confidence, reason: item.reason };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=similar-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"similar-item.js","sourceRoot":"","sources":["../../src/detector/similar-item.ts"],"names":[],"mappings":"AAUA,OAAO,EAAiB,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,yBAAyB,GACpC,wGAAwG,CAAC;AAQ3G,MAAM,UAAU,kBAAkB,CAAC,IAA4B,EAAE,OAAiB,EAAE,SAAmB;IACrG,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC/G,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9G,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5E,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,KAAK,YAAY,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;QACzE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC,CAAC,CAAC,yBAAyB,EAAE,CAAC;IACnK,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACrF,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,27 +2,35 @@
|
|
|
2
2
|
import './lib/startup-env.js'; // FIRST: snapshot the shell's env before any module can change it
|
|
3
3
|
import './lib/startup-xdg.js'; // SECOND: drop a relative XDG_* before anything computes a directory from it
|
|
4
4
|
import './lib/startup-backfill-track.js'; // THIRD: if align_backfill started this process, record how it ends
|
|
5
|
+
import { writeSync } from 'node:fs';
|
|
5
6
|
import envPaths from 'env-paths';
|
|
6
7
|
import { migrateConfigDirectory } from './lib/config.js';
|
|
7
|
-
import { legacyLocalDbDir, migrateLocalDb } from './lib/local-mode.js';
|
|
8
|
+
import { getLocalDbPath, legacyLocalDbDir, migrateLocalDb } from './lib/local-mode.js';
|
|
9
|
+
import { excludeGraphFromBackups } from './lib/backup-exclusion.js';
|
|
8
10
|
import { buildProgram } from './cli.js';
|
|
11
|
+
import { resolveDetectorVersion } from './detector/detector-version.js';
|
|
12
|
+
import { describeFatal } from './lib/fatal.js';
|
|
13
|
+
import { printRedactionNotice } from './lib/redaction-notice.js';
|
|
9
14
|
// Last-resort guard so no command ever dumps a raw Node stack trace at a user.
|
|
10
15
|
// Individual commands still handle their own expected errors; this only catches
|
|
11
16
|
// the unexpected (e.g. a native/db error escaping an async action).
|
|
12
17
|
function handleFatal(err) {
|
|
13
|
-
const
|
|
14
|
-
if (
|
|
15
|
-
console.error(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.error('Run with ALIGN_DEBUG=1 for the full stack trace, or report it at');
|
|
20
|
-
console.error('https://github.com/aligndottech/align-cli/issues');
|
|
21
|
-
}
|
|
22
|
-
process.exit(1);
|
|
18
|
+
const r = describeFatal(err, Boolean(process.env['ALIGN_DEBUG']));
|
|
19
|
+
if (r.stack)
|
|
20
|
+
console.error(r.stack);
|
|
21
|
+
for (const line of r.lines)
|
|
22
|
+
console.error(line);
|
|
23
|
+
process.exit(r.code);
|
|
23
24
|
}
|
|
24
25
|
process.on('uncaughtException', handleFatal);
|
|
25
26
|
process.on('unhandledRejection', handleFatal);
|
|
27
|
+
// A command that exits before its postAction hook still tells the person how many secrets it kept
|
|
28
|
+
// out of the local graph. Taking the notice resets it, so this never repeats one cli.ts printed.
|
|
29
|
+
// A synchronous write: an asynchronous stderr pipe (macOS) is not flushed once 'exit' runs.
|
|
30
|
+
process.on('exit', () => printRedactionNotice((line) => { try {
|
|
31
|
+
writeSync(2, `${line}\n`);
|
|
32
|
+
}
|
|
33
|
+
catch { /* stderr closed */ } }));
|
|
26
34
|
// One-time directory migrations (ALI-819, Copilot review on #231), run exactly once at
|
|
27
35
|
// real process startup - never inside createConfigStore()/getLocalDbPath() themselves,
|
|
28
36
|
// which stay pure so tests that mock `conf` don't also need to mock the filesystem.
|
|
@@ -32,11 +40,21 @@ process.on('unhandledRejection', handleFatal);
|
|
|
32
40
|
try {
|
|
33
41
|
migrateConfigDirectory(envPaths('align-cli', { suffix: 'nodejs' }).config, envPaths('align-cli', { suffix: '' }).config);
|
|
34
42
|
migrateLocalDb(legacyLocalDbDir(), envPaths('align-cli', { suffix: '' }).config);
|
|
43
|
+
// An existing local graph is excluded from Time Machine and cache-aware backups on its first run
|
|
44
|
+
// after an upgrade (once; a no-op without a graph). Best effort, never fatal (backup-exclusion.ts).
|
|
45
|
+
excludeGraphFromBackups(getLocalDbPath());
|
|
35
46
|
}
|
|
36
47
|
catch (e) {
|
|
37
48
|
if (process.env['ALIGN_DEBUG'])
|
|
38
49
|
console.error('align: startup migration failed (non-fatal):', e);
|
|
39
50
|
}
|
|
51
|
+
// An unknown ALIGN_DETECTOR is fatal before any command runs: a typo must never run the default silently.
|
|
52
|
+
try {
|
|
53
|
+
resolveDetectorVersion();
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
handleFatal(e);
|
|
57
|
+
}
|
|
40
58
|
// The command tree lives in cli.ts, built from src/commands/registry.ts (ALI-951), so the
|
|
41
59
|
// help, the doc generator and the tests read the same list this entry point parses.
|
|
42
60
|
buildProgram().parseAsync().catch(handleFatal);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,sBAAsB,CAAC,CAAC,kEAAkE;AACjG,OAAO,sBAAsB,CAAC,CAAC,6EAA6E;AAC5G,OAAO,iCAAiC,CAAC,CAAC,oEAAoE;AAC9G,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-dedup.d.ts","sourceRoot":"","sources":["../../src/lib/advisory-dedup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"advisory-dedup.d.ts","sourceRoot":"","sources":["../../src/lib/advisory-dedup.ts"],"names":[],"mappings":"AAuCA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,GAAG,CAAC,MAAM,CAAC,CAEnF;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CASvF"}
|
|
@@ -1,19 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { tmpdir } from 'node:os';
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
3
2
|
import path from 'node:path';
|
|
4
3
|
import { createHash } from 'node:crypto';
|
|
4
|
+
import { writePrivateFile } from './private-files.js';
|
|
5
|
+
import { privateTmpDir } from './advisory-verdict.js';
|
|
5
6
|
// The pre- and post-edit advisory hooks both fire for a single edit. To avoid
|
|
6
7
|
// showing the agent the same conflicting decisions twice, we remember which
|
|
7
8
|
// decision ids were surfaced recently (per project dir) and filter them out on the
|
|
8
9
|
// next run inside this window. Best-effort: dedup never blocks the hook.
|
|
9
10
|
const DEDUP_TTL_MS = 20_000;
|
|
11
|
+
// In the verified private temp folder (advisory-verdict.ts), never loose in the shared temp dir, where a
|
|
12
|
+
// predictable name could be planted by another account. Null when that folder is not safe to use.
|
|
10
13
|
function markerPath(cwd) {
|
|
14
|
+
const dir = privateTmpDir();
|
|
15
|
+
if (dir === null)
|
|
16
|
+
return null;
|
|
11
17
|
const hash = createHash('sha1').update(cwd).digest('hex').slice(0, 16);
|
|
12
|
-
return path.join(
|
|
18
|
+
return path.join(dir, `advisory-${hash}.json`);
|
|
13
19
|
}
|
|
14
20
|
function readMarker(cwd, now) {
|
|
15
21
|
try {
|
|
16
|
-
const
|
|
22
|
+
const file = markerPath(cwd);
|
|
23
|
+
if (file === null)
|
|
24
|
+
return null;
|
|
25
|
+
const m = JSON.parse(readFileSync(file, 'utf8'));
|
|
17
26
|
if (typeof m.ts !== 'number' || now - m.ts > DEDUP_TTL_MS)
|
|
18
27
|
return null;
|
|
19
28
|
return m;
|
|
@@ -32,10 +41,9 @@ export function markSurfaced(cwd, ids, now = Date.now()) {
|
|
|
32
41
|
try {
|
|
33
42
|
const merged = new Set([...(readMarker(cwd, now)?.ids ?? []), ...ids]);
|
|
34
43
|
const file = markerPath(cwd);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
writeFileSync(file, JSON.stringify({ ts: now, ids: [...merged] }), 'utf8');
|
|
44
|
+
if (file === null)
|
|
45
|
+
return;
|
|
46
|
+
writePrivateFile(file, JSON.stringify({ ts: now, ids: [...merged] }));
|
|
39
47
|
}
|
|
40
48
|
catch {
|
|
41
49
|
// Best-effort only - dedup is a nicety, never fail the hook on it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-dedup.js","sourceRoot":"","sources":["../../src/lib/advisory-dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"advisory-dedup.js","sourceRoot":"","sources":["../../src/lib/advisory-dedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,8EAA8E;AAC9E,4EAA4E;AAC5E,mFAAmF;AACnF,yEAAyE;AACzE,MAAM,YAAY,GAAG,MAAM,CAAC;AAO5B,yGAAyG;AACzG,kGAAkG;AAClG,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,IAAI,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,GAAW;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAW,CAAC;QAC3D,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,YAAY;YAAE,OAAO,IAAI,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACpE,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,mFAAmF;AACnF,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,GAAa,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC/E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,EAAmB,CAAC,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -56,6 +56,25 @@ export interface StoredVerdict {
|
|
|
56
56
|
conflicts: VerdictConflict[];
|
|
57
57
|
}
|
|
58
58
|
export declare function contentHashOf(text: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* A 0700 directory of our own, rather than tmpdir() itself.
|
|
61
|
+
*
|
|
62
|
+
* macOS gives each user a private tmpdir, but on Linux `os.tmpdir()` falls back to /tmp
|
|
63
|
+
* (mode 1777) whenever TMPDIR is unset, and on a shared build host that means two things:
|
|
64
|
+
* the payload file holds the user's proposed source, and this store feeds the text the
|
|
65
|
+
* agent is shown as the reason its edit was refused. Neither belongs in a directory other
|
|
66
|
+
* uids can read or pre-plant symlinks in.
|
|
67
|
+
*
|
|
68
|
+
* Returns null when the directory cannot be established safely, and every caller then
|
|
69
|
+
* degrades to "no store" rather than erroring - fail-open, as everywhere else here.
|
|
70
|
+
*
|
|
71
|
+
* The mode bits are POSIX-only; Windows honours just the read-only flag and reports 0o666.
|
|
72
|
+
* That costs nothing, because the threat is a SHARED tmp directory and Windows already gives
|
|
73
|
+
* each user a private %LOCALAPPDATA%\Temp - which is also why the uid falls back to a
|
|
74
|
+
* constant there rather than trying to synthesise one.
|
|
75
|
+
*/
|
|
76
|
+
/** `<tmp>/align-<uid>`: created 0700, refused when it is a link or not ours. Also holds the advisory dedup markers. */
|
|
77
|
+
export declare function privateTmpDir(): string | null;
|
|
59
78
|
/** Where the adjudication payload for one change is handed to the detached child. */
|
|
60
79
|
export declare function adjudicationPayloadPath(contentHash: string): string | null;
|
|
61
80
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advisory-verdict.d.ts","sourceRoot":"","sources":["../../src/lib/advisory-verdict.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"advisory-verdict.d.ts","sourceRoot":"","sources":["../../src/lib/advisory-verdict.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;GAgBG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,cAAc,QAAc,CAAC;AAC1C;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAAa,CAAC;AACzC,8FAA8F;AAC9F,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAY9C;oFACoF;AACpF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAcD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,uHAAuH;AACvH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAe7C;AAcD,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1E;AA6GD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAmB,GACvB,aAAa,GAAG,IAAI,CAStB;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,MAAmB,GACvB,IAAI,CAWN;AAED,2FAA2F;AAC3F,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAMT;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAEpG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAmB,GACvB,IAAI,CAON"}
|