@albertomarturelo/sii-core 0.8.0 → 0.10.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/CHANGELOG.md +116 -0
- package/dist/adapters/fake/index.d.ts +14 -2
- package/dist/adapters/fake/index.d.ts.map +1 -1
- package/dist/adapters/fake/index.js +21 -1
- package/dist/adapters/fake/index.js.map +1 -1
- package/dist/adapters/node/keyring.d.ts +12 -0
- package/dist/adapters/node/keyring.d.ts.map +1 -0
- package/dist/adapters/node/keyring.js +58 -0
- package/dist/adapters/node/keyring.js.map +1 -0
- package/dist/adapters/node/portal.d.ts.map +1 -1
- package/dist/adapters/node/portal.js +11 -4
- package/dist/adapters/node/portal.js.map +1 -1
- package/dist/adapters/node/response.d.ts +12 -4
- package/dist/adapters/node/response.d.ts.map +1 -1
- package/dist/adapters/node/response.js +32 -7
- package/dist/adapters/node/response.js.map +1 -1
- package/dist/auth/auth.d.ts +42 -6
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +181 -33
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/session.d.ts +16 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +12 -0
- package/dist/auth/session.js.map +1 -1
- package/dist/auth/www2-login.d.ts +28 -0
- package/dist/auth/www2-login.d.ts.map +1 -0
- package/dist/auth/www2-login.js +101 -0
- package/dist/auth/www2-login.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/config.d.ts +18 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +18 -0
- package/dist/config/config.js.map +1 -1
- package/dist/errors/errors.d.ts +25 -0
- package/dist/errors/errors.d.ts.map +1 -1
- package/dist/errors/errors.js +25 -0
- package/dist/errors/errors.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +6 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +6 -1
- package/dist/node.js.map +1 -1
- package/dist/portal/carpeta-tributaria-regular.d.ts +30 -0
- package/dist/portal/carpeta-tributaria-regular.d.ts.map +1 -0
- package/dist/portal/carpeta-tributaria-regular.js +142 -0
- package/dist/portal/carpeta-tributaria-regular.js.map +1 -0
- package/dist/portal/www2-session.d.ts +13 -0
- package/dist/portal/www2-session.d.ts.map +1 -0
- package/dist/portal/www2-session.js +61 -0
- package/dist/portal/www2-session.js.map +1 -0
- package/dist/seams/index.d.ts +8 -1
- package/dist/seams/index.d.ts.map +1 -1
- package/dist/tasks/auth.d.ts +14 -6
- package/dist/tasks/auth.d.ts.map +1 -1
- package/dist/tasks/auth.js +13 -5
- package/dist/tasks/auth.js.map +1 -1
- package/dist/tasks/carpeta.d.ts +9 -0
- package/dist/tasks/carpeta.d.ts.map +1 -0
- package/dist/tasks/carpeta.js +49 -0
- package/dist/tasks/carpeta.js.map +1 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,122 @@ All notable changes to `@albertomarturelo/sii-core` are documented here. The for
|
|
|
4
4
|
loosely based on [Keep a Changelog](https://keepachangelog.com/); the package is
|
|
5
5
|
pre-1.0, so MINOR bumps may carry breaking changes (pin or use `~` downstream).
|
|
6
6
|
|
|
7
|
+
## 0.10.0 — 2026-09-12
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **The www2 APP SESSION — a second cookies-only layer (#116, ADR-026).** SII's newer apps
|
|
12
|
+
on `www2.sii.cl/app/*` (and their `/app/<name>-api/*` JSON facades) are **not** authorized
|
|
13
|
+
by the classic `.sii.cl` cookies this library has always captured — those reach www1, www3,
|
|
14
|
+
www4 and loa, but every `cte-api` call answers a bare `401`. The layer is minted by an
|
|
15
|
+
OAuth2 code flow at SII's own `oauthsii-v1` page, so `login(runtime, { www2: true })` runs
|
|
16
|
+
it as a second **headed** login: the user types the Clave into SII's page (reCAPTCHA
|
|
17
|
+
Enterprise gates it — there is no headless variant, by decision), and only cookies are kept.
|
|
18
|
+
The classic jar is snapshotted **before** that step, because the OAuth page deletes the
|
|
19
|
+
classic cookies from the browser context on mount, and merged with the www2 cookies
|
|
20
|
+
(`name+domain+path`) into the same session file. Verified live 2026-09-12.
|
|
21
|
+
- **`portal/www2-session.ts` — the shared app-session read.** `readWww2Session(session, url)`
|
|
22
|
+
replays the SPA's own liveness call (`GET /app/session/status`) and returns its `userId`,
|
|
23
|
+
which keys every `/app/<name>-api/*` path **verbatim** (the canonical RUT, observed). Every
|
|
24
|
+
www2 facade reads it first; a new www2 app reuses it instead of inventing a warm-up.
|
|
25
|
+
- **`Www2SessionError`** — a `NotAuthenticatedError` subclass, **distinct from
|
|
26
|
+
`SessionExpiredError`**: the classic Mi SII session may be perfectly alive while the www2
|
|
27
|
+
layer is missing, and the fix is a login (`sii auth login --www2`), never a retry.
|
|
28
|
+
- **Carpeta Tributaria — the live `instituciones` catalog (#110).** `carpetaInstituciones`
|
|
29
|
+
returns SII's own list of destination institutions (the `enfinCodigo` the Regular carpeta's
|
|
30
|
+
`/generar` demands): a bare JSON array validated with zod at the boundary, rows projected
|
|
31
|
+
alias-tolerantly, all **8 observed keys** curated (`codigo`, `descripcion`, `abreviacion`,
|
|
32
|
+
`tipo`, the institution's canonicalised `rut`, `vigenteDesde`, `vigenteHasta`). **No catalog
|
|
33
|
+
is hardcoded** — the codes drift, and a hardcoded one had already gone stale. `codigo` stays
|
|
34
|
+
a **string compared verbatim**: live, zero-padded (`"016"`) and unpadded (`"1005"`) codes
|
|
35
|
+
coexist. `resolveInstitucion` validates a caller's choice against the live list and names the
|
|
36
|
+
valid codes on a miss, before any `/generar` round trip. Session-keyed; 67 rows live 2026-09-12.
|
|
37
|
+
- **`UnexpectedResponseError` (#111/#112)** — an authenticated `requestJson` whose body is
|
|
38
|
+
neither JSON nor the login wall now raises this instead of a misleading "session expired".
|
|
39
|
+
It carries the endpoint, status, content-type and the first ~80 chars of the body verbatim,
|
|
40
|
+
so a SII quirk is distinguishable from a dead session without a second round trip. Observed
|
|
41
|
+
on the cte-api `obtenerValorParametro`, which answers `200 text/plain` to a LIVE session.
|
|
42
|
+
- **`assertOperatingSelf(runtime, mkError)`** (`auth/session.ts`) — the session-keyed guard
|
|
43
|
+
that rejects a representing operate pointer before a session is opened, now shared: the
|
|
44
|
+
surface supplies its own typed error and wording. `f29` and `bte` keep their private copies
|
|
45
|
+
until their next touch.
|
|
46
|
+
- **`HOSTS.portalApp`** (`www2.sii.cl`) plus the app page and session-close constants.
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **Additive fields on returned objects** (no consumer break): `AuthStatusLocal` gains
|
|
51
|
+
`www2: { authenticated, expiresAt }`, decided locally from the layer's stored cookie expiry;
|
|
52
|
+
`statusRefresh` now returns `AuthIdentityRefresh` (the identity plus the layer read **live**);
|
|
53
|
+
`AuthLogoutResult` gains `www2Closed`. `login` takes an optional second argument
|
|
54
|
+
(`LoginOptions`). `logout` best-effort closes the www2 session before the classic one.
|
|
55
|
+
- **The login receipt records the outcome, not the probe.** The warm-session check no longer
|
|
56
|
+
audits: with `--www2` on a warm classic session that lacks the layer, the probe hits and the
|
|
57
|
+
browser still opens, so the log used to carry a false `already_authenticated` receipt
|
|
58
|
+
alongside the real `browser_login` one (ADR-004: the log records what happened).
|
|
59
|
+
|
|
60
|
+
### Fixed
|
|
61
|
+
|
|
62
|
+
- **The www2 layer's expiry is read from any `X-SII-STATE-*` cookie, not a fixed name.** The
|
|
63
|
+
state cookie's suffix **varies** — a spike saw `X-SII-STATE-CT`, the first real login
|
|
64
|
+
`X-SII-STATE-CL`, alongside the literal `X-SII-STATE-TYPE`. Keying on one name returned
|
|
65
|
+
`null`, so the layer reported no expiry. The maximum expiry across them is used, so a
|
|
66
|
+
session-scoped `-TYPE` cannot mask the dated one.
|
|
67
|
+
|
|
68
|
+
## 0.9.0 — 2026-09-09
|
|
69
|
+
|
|
70
|
+
### Breaking (type-level only)
|
|
71
|
+
|
|
72
|
+
- **`Runtime.secrets` is now a `SecretReader`** (`Pick<SecretStore, 'get'>`), no longer a
|
|
73
|
+
full `SecretStore`. A consumer that *supplies* one is unaffected — a `SecretStore` is
|
|
74
|
+
assignable to a `SecretReader`. A consumer that *called* `runtime.secrets.set(…)` or
|
|
75
|
+
`.delete(…)` from a task no longer compiles, which is the point: storing the Clave is
|
|
76
|
+
the user's own act with their own tool, so no task can write to the keyring even by
|
|
77
|
+
mistake (ADR-025). `secrets` was never wired by any default runtime before this release,
|
|
78
|
+
so no shipped code path changes.
|
|
79
|
+
- **`AuthLoginResult.reason` gains `'keyring_login'`.** An exhaustive `switch` over the
|
|
80
|
+
union needs the new arm.
|
|
81
|
+
|
|
82
|
+
### Added
|
|
83
|
+
|
|
84
|
+
- **`keyringLogin` — the Clave from the OS keyring, for an explicit login only (#101,
|
|
85
|
+
#105, ADR-025).** Resolves the `SecretStore` backend ADR-006 left open. Exported from
|
|
86
|
+
the **CLI-only `@albertomarturelo/sii-core/cli` subpath**, never the main barrel — a test
|
|
87
|
+
pins that neither Clave-handling task (`consoleLogin`, `keyringLogin`) is reachable from
|
|
88
|
+
`@albertomarturelo/sii-core`, which is all the MCP server imports. Looks the entry up under
|
|
89
|
+
service `sii` with the RUT as username, tried canonical → dotted → body-only (the keyring
|
|
90
|
+
is populated by hand, so the code adapts to the human); SII always receives the canonical
|
|
91
|
+
RUT. Mod-11 runs **before** the keyring is touched. Then it is `consoleLogin`'s flow:
|
|
92
|
+
**ONE attempt, never retried** (a stale entry must not become a lockout, ADR-004), a
|
|
93
|
+
cookies-only session, the Clave discarded with the frame. **No automatic re-login** — a
|
|
94
|
+
task that meets `SessionExpiredError` still says "ejecuta `sii auth login`"; the
|
|
95
|
+
alternative was considered and rejected in ADR-025 as the shape that turns one stale entry
|
|
96
|
+
into a locked account.
|
|
97
|
+
- **Read last.** The credentials reach the shared `credentialLoginFlow` as a thunk, so the
|
|
98
|
+
keyring is consulted only after the live-session probe misses — an already-authenticated
|
|
99
|
+
user never triggers a keyring-unlock prompt for a value nobody will use. `consoleLogin`
|
|
100
|
+
passes a resolved thunk; its behaviour is unchanged.
|
|
101
|
+
- **`KeyringSecretStore`** (`./node` subpath) over **`@napi-rs/keyring` `2.0.0`, pinned
|
|
102
|
+
exactly** — Secret Service on Linux, Keychain on macOS, a prebuilt N-API binding imported
|
|
103
|
+
LAZILY so composing a runtime loads no native module. It is **not a `createNodeRuntime`
|
|
104
|
+
default**: the MCP server builds from that same function, so a default would have handed
|
|
105
|
+
it a live keyring reader. The CLI's composition root wires it explicitly; `createNodeRuntime().secrets`
|
|
106
|
+
is asserted `undefined`. A failed native import raises its own actionable error (naming
|
|
107
|
+
`--console`) instead of collapsing into "no entry", which would have sent the user off to
|
|
108
|
+
re-store a Clave they already stored; entry-level failures (missing, locked, no Secret
|
|
109
|
+
Service) still read as `null`, so no wording about an entry leaks.
|
|
110
|
+
- **`testing.InMemorySecretStore`** — the keyring stand-in, so a test never reads the real
|
|
111
|
+
one. **`CredentialNotFoundError`** now carries the exact `secret-tool` (Linux) and
|
|
112
|
+
`security add-generic-password` (macOS) invocations that store the entry.
|
|
113
|
+
|
|
114
|
+
### Notes
|
|
115
|
+
|
|
116
|
+
- The audit receipt for a keyring login records `reason: 'keyring_login'` and the RUT —
|
|
117
|
+
never the Clave (tested against the serialised receipt). The persisted session is
|
|
118
|
+
cookies-only, exactly `{rut, cookies, savedAt}` (tested).
|
|
119
|
+
- `SecretReader` is referenced by the public `Runtime` type but not yet re-exported from
|
|
120
|
+
the main barrel; a consumer typing an override by name should import `SecretStore`, which
|
|
121
|
+
is assignable. Worth exporting in a follow-up.
|
|
122
|
+
|
|
7
123
|
## 0.8.0 — 2026-09-09
|
|
8
124
|
|
|
9
125
|
### Added
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AuditEntry, AuditSink, BinaryRequest, BinaryResponse, Clock, CredentialLoginOptions, FormRequest, InteractiveLoginOptions, JsonRequest, FileSink, KeyValueStore, PortalDriver, PortalSession, PublicRequest, PublicResponse, TextRequest } from '../../seams/index.js';
|
|
1
|
+
import type { AuditEntry, AuditSink, BinaryRequest, BinaryResponse, Clock, CredentialLoginOptions, FormRequest, InteractiveLoginOptions, JsonRequest, FileSink, KeyValueStore, PortalDriver, PortalSession, PublicRequest, PublicResponse, SecretStore, TextRequest } from '../../seams/index.js';
|
|
2
2
|
export declare class FixedClock implements Clock {
|
|
3
3
|
private current;
|
|
4
4
|
/** Each `sleep(ms)` is recorded (not awaited) so a test can assert pacing without
|
|
@@ -38,7 +38,9 @@ export interface FakeSessionScript {
|
|
|
38
38
|
requestBinary?: (url: string, options?: BinaryRequest) => BinaryResponse | Uint8Array;
|
|
39
39
|
/** Cookie name → value map for `cookie(url, name)`. */
|
|
40
40
|
cookies?: Record<string, string>;
|
|
41
|
-
storageState
|
|
41
|
+
/** The cookies-only state `storageState()` returns; a FUNCTION is called on every read, so a
|
|
42
|
+
* test can script a jar that GAINS cookies mid-session (the `--www2` step, ADR-026). */
|
|
43
|
+
storageState?: unknown | (() => unknown);
|
|
42
44
|
}
|
|
43
45
|
export declare class FakePortalSession implements PortalSession {
|
|
44
46
|
private readonly script;
|
|
@@ -121,4 +123,14 @@ export declare class InMemoryFileSink implements FileSink {
|
|
|
121
123
|
readonly files: Map<string, Uint8Array<ArrayBufferLike>>;
|
|
122
124
|
write(dir: string, name: string, bytes: Uint8Array): Promise<string>;
|
|
123
125
|
}
|
|
126
|
+
/** In-memory SecretStore: the keyring stand-in, so a test never reads the real one
|
|
127
|
+
* (ADR-003 / ADR-025). `entries` is keyed by account exactly as the keyring's username. */
|
|
128
|
+
export declare class InMemorySecretStore implements SecretStore {
|
|
129
|
+
readonly entries: Map<string, string>;
|
|
130
|
+
constructor(entries?: Map<string, string>);
|
|
131
|
+
readonly reads: string[];
|
|
132
|
+
get(account: string): Promise<string | null>;
|
|
133
|
+
set(account: string, secret: string): Promise<void>;
|
|
134
|
+
delete(account: string): Promise<void>;
|
|
135
|
+
}
|
|
124
136
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,cAAc,EACd,KAAK,EACL,sBAAsB,EACtB,WAAW,EACX,uBAAuB,EACvB,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,UAAW,YAAW,KAAK;IAI1B,OAAO,CAAC,OAAO;IAH3B;4BACwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;gBACV,OAAO,EAAE,IAAI;IACjC,GAAG,IAAI,IAAI;IAGX,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI;IAGlB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjC;AAED,qBAAa,kBAAmB,YAAW,SAAS;IAClD,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAM;IACpC,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAGhC;AAED,qBAAa,qBAAsB,YAAW,aAAa;IACzD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAC5C,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAIvC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAG9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC;AAED,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3C,6EAA6E;IAC7E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC;IAC9D;0FACsF;IACtF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,cAAc,GAAG,MAAM,CAAC;IAC9E;iGAC6F;IAC7F,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,cAAc,GAAG,MAAM,CAAC;IAC9E;;0EAEsE;IACtE,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,cAAc,GAAG,UAAU,CAAC;IACtF,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -89,7 +89,8 @@ export class FakePortalSession {
|
|
|
89
89
|
return this.script.cookies?.[name] ?? null;
|
|
90
90
|
}
|
|
91
91
|
async storageState() {
|
|
92
|
-
|
|
92
|
+
const s = this.script.storageState;
|
|
93
|
+
return (typeof s === 'function' ? s() : s) ?? { cookies: [] };
|
|
93
94
|
}
|
|
94
95
|
async close() {
|
|
95
96
|
this.closed = true;
|
|
@@ -157,4 +158,23 @@ export class InMemoryFileSink {
|
|
|
157
158
|
return path;
|
|
158
159
|
}
|
|
159
160
|
}
|
|
161
|
+
/** In-memory SecretStore: the keyring stand-in, so a test never reads the real one
|
|
162
|
+
* (ADR-003 / ADR-025). `entries` is keyed by account exactly as the keyring's username. */
|
|
163
|
+
export class InMemorySecretStore {
|
|
164
|
+
entries;
|
|
165
|
+
constructor(entries = new Map()) {
|
|
166
|
+
this.entries = entries;
|
|
167
|
+
}
|
|
168
|
+
reads = [];
|
|
169
|
+
async get(account) {
|
|
170
|
+
this.reads.push(account);
|
|
171
|
+
return this.entries.get(account) ?? null;
|
|
172
|
+
}
|
|
173
|
+
async set(account, secret) {
|
|
174
|
+
this.entries.set(account, secret);
|
|
175
|
+
}
|
|
176
|
+
async delete(account) {
|
|
177
|
+
this.entries.delete(account);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
160
180
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SecretStore } from '../../seams/index.js';
|
|
2
|
+
/** Reads the Clave from the OS keyring. Never used by the MCP surface (ADR-025):
|
|
3
|
+
* only the CLI-only `keyringLogin` task consumes it. */
|
|
4
|
+
export declare class KeyringSecretStore implements SecretStore {
|
|
5
|
+
private readonly service;
|
|
6
|
+
constructor(service?: string);
|
|
7
|
+
private entry;
|
|
8
|
+
get(account: string): Promise<string | null>;
|
|
9
|
+
set(account: string, secret: string): Promise<void>;
|
|
10
|
+
delete(account: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=keyring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/keyring.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASxD;yDACyD;AACzD,qBAAa,kBAAmB,YAAW,WAAW;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,MAAwB;YAEhD,KAAK;IAiBb,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc5C,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO7C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// OS keyring `SecretStore` (ADR-025) — the Clave at rest lives HERE and nowhere else
|
|
2
|
+
// (ADR-006). Backed by `@napi-rs/keyring`, which talks to the platform store directly:
|
|
3
|
+
// the freedesktop Secret Service on Linux (gnome-keyring / kwallet), the Keychain on
|
|
4
|
+
// macOS. It is general-purpose infrastructure, not SII code (ADR-004).
|
|
5
|
+
//
|
|
6
|
+
// The binding is a native module, so it is imported LAZILY: composing a runtime — or
|
|
7
|
+
// running the MCP server, which never reads a secret — must not load it (ADR-016).
|
|
8
|
+
import { KEYRING_SERVICE } from '../../config/index.js';
|
|
9
|
+
import { SiiError } from '../../errors/index.js';
|
|
10
|
+
/** Reads the Clave from the OS keyring. Never used by the MCP surface (ADR-025):
|
|
11
|
+
* only the CLI-only `keyringLogin` task consumes it. */
|
|
12
|
+
export class KeyringSecretStore {
|
|
13
|
+
service;
|
|
14
|
+
constructor(service = KEYRING_SERVICE) {
|
|
15
|
+
this.service = service;
|
|
16
|
+
}
|
|
17
|
+
async entry(account) {
|
|
18
|
+
// A plain dynamic import is the whole lazy-load — the module registry is the cache.
|
|
19
|
+
// A FAILURE HERE IS NOT "no entry": the native binding is missing or unsupported on
|
|
20
|
+
// this platform, and reporting that as an empty keyring would send the user off to
|
|
21
|
+
// re-store a Clave they already stored (review of #101).
|
|
22
|
+
let mod;
|
|
23
|
+
try {
|
|
24
|
+
mod = (await import('@napi-rs/keyring'));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
throw new SiiError('El binding del llavero (@napi-rs/keyring) no está disponible en esta plataforma. ' +
|
|
28
|
+
`Usa \`sii auth login --console\`. Detalle: ${err instanceof Error ? err.message : String(err)}`);
|
|
29
|
+
}
|
|
30
|
+
return new mod.Entry(this.service, account);
|
|
31
|
+
}
|
|
32
|
+
async get(account) {
|
|
33
|
+
// A missing entry, a locked keyring and an absent Secret Service all mean the same
|
|
34
|
+
// to the caller: no credential here. The caller turns that into its own actionable
|
|
35
|
+
// message (which service/username it looked for) — swallowing the platform's own
|
|
36
|
+
// wording keeps a secret-store error from leaking anything about the entry. A
|
|
37
|
+
// missing BINDING is different and propagates (see `entry`).
|
|
38
|
+
const entry = await this.entry(account);
|
|
39
|
+
try {
|
|
40
|
+
return entry.getPassword();
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async set(account, secret) {
|
|
47
|
+
(await this.entry(account)).setPassword(secret);
|
|
48
|
+
}
|
|
49
|
+
async delete(account) {
|
|
50
|
+
try {
|
|
51
|
+
(await this.entry(account)).deletePassword();
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// already gone / no store — deleting nothing is success
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=keyring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyring.js","sourceRoot":"","sources":["../../../src/adapters/node/keyring.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,uFAAuF;AACvF,qFAAqF;AACrF,uEAAuE;AACvE,EAAE;AACF,qFAAqF;AACrF,mFAAmF;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAUjD;yDACyD;AACzD,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,UAAkB,eAAe;QAAjC,YAAO,GAAP,OAAO,CAA0B;IAAG,CAAC;IAE1D,KAAK,CAAC,KAAK,CAAC,OAAe;QACjC,oFAAoF;QACpF,oFAAoF;QACpF,mFAAmF;QACnF,yDAAyD;QACzD,IAAI,GAAkB,CAAC;QACvB,IAAI,CAAC;YACH,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAA6B,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,QAAQ,CAChB,mFAAmF;gBACjF,8CAA8C,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACnG,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,mFAAmF;QACnF,mFAAmF;QACnF,iFAAiF;QACjF,8EAA8E;QAC9E,6DAA6D;QAC7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,MAAc;QACvC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,IAAI,CAAC;YACH,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/portal.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,sBAAsB,EAEtB,uBAAuB,EAEvB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EAEf,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/portal.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,sBAAsB,EAEtB,uBAAuB,EAEvB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAiL9B,qBAAa,sBAAuB,YAAW,YAAY;IACnD,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuB1E,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IAuCxE,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBtD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;CA0BvF"}
|
|
@@ -70,15 +70,22 @@ class PlaywrightPortalSession {
|
|
|
70
70
|
...(options.headers ? { headers: options.headers } : {}),
|
|
71
71
|
...(options.body !== undefined ? { data: JSON.stringify(options.body) } : {}),
|
|
72
72
|
});
|
|
73
|
+
// Read the body as text ONCE (Playwright's response.json() is JSON.parse over the
|
|
74
|
+
// same text) so a parse failure can carry a verbatim snippet into the error.
|
|
75
|
+
const text = await response.text();
|
|
73
76
|
try {
|
|
74
|
-
return
|
|
77
|
+
return JSON.parse(text);
|
|
75
78
|
}
|
|
76
79
|
catch {
|
|
77
|
-
// A non-JSON body from an authenticated SDI POST means the dead session was
|
|
80
|
+
// A non-JSON body from an authenticated SDI POST usually means the dead session was
|
|
78
81
|
// bounced to SII's login wall — surface an actionable SessionExpiredError, not a
|
|
79
|
-
// parse error. No extra round-trip: this first SDI POST IS the liveness test.
|
|
82
|
+
// parse error. No extra round-trip: this first SDI POST IS the liveness test. But
|
|
83
|
+
// NOT every non-JSON body is a wall: a live session on the wrong endpoint gets a
|
|
84
|
+
// 200 `text/plain` bare URL (cte-api obtenerValorParametro, observed 2026-09-11) —
|
|
85
|
+
// that is an UnexpectedResponseError naming the endpoint + body, never a raw-string
|
|
86
|
+
// result (the seam resolves parsed JSON only).
|
|
80
87
|
// Classification is a pure helper so it is unit-tested (nonJsonResponseError).
|
|
81
|
-
throw nonJsonResponseError(response.url(), response.headers()['content-type'] ?? '', response.status());
|
|
88
|
+
throw nonJsonResponseError(response.url(), response.headers()['content-type'] ?? '', response.status(), text);
|
|
82
89
|
}
|
|
83
90
|
}
|
|
84
91
|
async requestForm(url, options = {}) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../../src/adapters/node/portal.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAepF;;;;;+DAK+D;AAC/D,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,KAAK,sBAAsB,IAAI,IAAI,KAAK,kBAAkB,CAAC;QAChF,IAAI,QAAQ,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CACb,8EAA8E;gBAC5E,kEAAkE;gBAClE,oCAAoC,CACvC,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;kDAKkD;AAClD,KAAK,UAAU,cAAc,CAAC,IAAU;IACtC,MAAM,QAAQ,GACZ,yFAAyF;QACzF,wFAAwF,CAAC;IAC3F,IAAI,CAAC;QACH,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAC/B,kDAAkD,CACnD,CAAW,CAAC;QACb,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,uBAAuB;IAER;IACA;IACA;IAHnB,YACmB,OAAgB,EAChB,OAAuB,EACvB,IAAU;QAFV,YAAO,GAAP,OAAO,CAAS;QAChB,YAAO,GAAP,OAAO,CAAgB;QACvB,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,qEAAqE;QACrE,0DAA0D;QAC1D,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAI,UAAkB;QAClC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAM,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,UAAuB,EAAE;QACtD,+EAA+E;QAC/E,kFAAkF;QAClF,uEAAuE;QACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YACrD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;YAChC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC,CAAC;QACH,IAAI,CAAC;YACH,OAAO,
|
|
1
|
+
{"version":3,"file":"portal.js","sourceRoot":"","sources":["../../../src/adapters/node/portal.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,18 @@
|
|
|
2
2
|
* SDI POST get bounced to SII's login wall (HTML) instead of JSON; detect it the same
|
|
3
3
|
* URL-based way the rest of the auth flow does — landing on `LOGIN_HOST`, with an
|
|
4
4
|
* HTML content-type fallback for a same-host wall (ADR-009) — and return an ACTIONABLE
|
|
5
|
-
* `SessionExpiredError`. Anything else is a genuinely unexpected response →
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
5
|
+
* `SessionExpiredError`. Anything else is a genuinely unexpected response →
|
|
6
|
+
* `UnexpectedResponseError` naming the endpoint, status, content-type and the first
|
|
7
|
+
* chars of the body verbatim. Observed at
|
|
8
|
+
* https://www2.sii.cl/app/cte-api-carpetatributaria/{rut}/recurso/v2/carpeta-tributaria/obtenerValorParametro
|
|
9
|
+
* on 2026-09-11 (GH-111): a live session gets HTTP 200 `text/plain;charset=utf-8` with
|
|
10
|
+
* the bare URL of the "modificar email" SPA — the wrong endpoint, NOT a login wall, and
|
|
11
|
+
* the old message (status + content-type only) hid exactly the body that says so. A json-labelled
|
|
12
|
+
* non-JSON body gets the same treatment, spelled out (the content-type lied). Neither
|
|
13
|
+
* is something `requestJson` may return (the seam resolves parsed JSON only — ADR-003;
|
|
14
|
+
* a facade's zod envelope is where a bare string would fail, ADR-011). Pure, so it is
|
|
15
|
+
* unit-tested without launching Playwright. */
|
|
16
|
+
export declare function nonJsonResponseError(finalUrl: string, contentType: string, status: number, body?: string): Error;
|
|
9
17
|
/** Login-wall detection for an authenticated FORM POST (ADR-017). Unlike `requestJson`,
|
|
10
18
|
* an HTML body is EXPECTED (the `TMBECN_*` emit CGIs render HTML), so the content-type
|
|
11
19
|
* heuristic can't apply — a dead session is detected purely by the response landing on
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/response.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;gDAcgD;AAChD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,SAAK,GACR,KAAK,CAgBP;AAQD;;;;kDAIkD;AAClD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAIjE;AAED;;;;qFAIqF;AACrF,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAYxE"}
|
|
@@ -1,19 +1,44 @@
|
|
|
1
1
|
import { LOGIN_HOST } from '../../config/index.js';
|
|
2
|
-
import { SessionExpiredError } from '../../errors/index.js';
|
|
2
|
+
import { SessionExpiredError, UnexpectedResponseError } from '../../errors/index.js';
|
|
3
|
+
/** How much of a non-JSON body the error carries. Enough to recognise the quirk (a bare
|
|
4
|
+
* URL, an HTML fragment, a SII notice) without dumping a whole page into a message that
|
|
5
|
+
* reaches the terminal or an MCP client (the audit log never records error messages —
|
|
6
|
+
* a failed task audits ids/periods only). */
|
|
7
|
+
const BODY_SNIPPET_CHARS = 80;
|
|
3
8
|
/** Classify a non-JSON SDI response. A dead/expired session makes an authenticated
|
|
4
9
|
* SDI POST get bounced to SII's login wall (HTML) instead of JSON; detect it the same
|
|
5
10
|
* URL-based way the rest of the auth flow does — landing on `LOGIN_HOST`, with an
|
|
6
11
|
* HTML content-type fallback for a same-host wall (ADR-009) — and return an ACTIONABLE
|
|
7
|
-
* `SessionExpiredError`. Anything else is a genuinely unexpected response →
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
|
|
12
|
+
* `SessionExpiredError`. Anything else is a genuinely unexpected response →
|
|
13
|
+
* `UnexpectedResponseError` naming the endpoint, status, content-type and the first
|
|
14
|
+
* chars of the body verbatim. Observed at
|
|
15
|
+
* https://www2.sii.cl/app/cte-api-carpetatributaria/{rut}/recurso/v2/carpeta-tributaria/obtenerValorParametro
|
|
16
|
+
* on 2026-09-11 (GH-111): a live session gets HTTP 200 `text/plain;charset=utf-8` with
|
|
17
|
+
* the bare URL of the "modificar email" SPA — the wrong endpoint, NOT a login wall, and
|
|
18
|
+
* the old message (status + content-type only) hid exactly the body that says so. A json-labelled
|
|
19
|
+
* non-JSON body gets the same treatment, spelled out (the content-type lied). Neither
|
|
20
|
+
* is something `requestJson` may return (the seam resolves parsed JSON only — ADR-003;
|
|
21
|
+
* a facade's zod envelope is where a bare string would fail, ADR-011). Pure, so it is
|
|
22
|
+
* unit-tested without launching Playwright. */
|
|
23
|
+
export function nonJsonResponseError(finalUrl, contentType, status, body = '') {
|
|
11
24
|
const ct = contentType.toLowerCase();
|
|
12
|
-
const
|
|
25
|
+
const url = new URL(finalUrl);
|
|
26
|
+
const bouncedToLogin = url.hostname === LOGIN_HOST;
|
|
13
27
|
if (bouncedToLogin || ct.includes('text/html')) {
|
|
14
28
|
return new SessionExpiredError('La sesión expiró. Ejecuta `sii auth login`.');
|
|
15
29
|
}
|
|
16
|
-
|
|
30
|
+
const snippet = bodySnippet(body);
|
|
31
|
+
const claimsJson = ct.includes('json');
|
|
32
|
+
const what = claimsJson
|
|
33
|
+
? `SII declaró content-type ${ct} pero el cuerpo no es JSON`
|
|
34
|
+
: `Respuesta no-JSON de SII (${ct || 'sin content-type'})`;
|
|
35
|
+
return new UnexpectedResponseError(`${what} — HTTP ${status} en ${url.host}${url.pathname}` +
|
|
36
|
+
(snippet ? `: "${snippet}"` : ' (cuerpo vacío)'));
|
|
37
|
+
}
|
|
38
|
+
/** The first chars of a body, whitespace-collapsed, for an error message. */
|
|
39
|
+
function bodySnippet(body) {
|
|
40
|
+
const flat = body.replace(/\s+/g, ' ').trim();
|
|
41
|
+
return flat.length > BODY_SNIPPET_CHARS ? `${flat.slice(0, BODY_SNIPPET_CHARS)}…` : flat;
|
|
17
42
|
}
|
|
18
43
|
/** Login-wall detection for an authenticated FORM POST (ADR-017). Unlike `requestJson`,
|
|
19
44
|
* an HTML body is EXPECTED (the `TMBECN_*` emit CGIs render HTML), so the content-type
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/adapters/node/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/adapters/node/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErF;;;8CAG8C;AAC9C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B;;;;;;;;;;;;;;gDAcgD;AAChD,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,WAAmB,EACnB,MAAc,EACd,IAAI,GAAG,EAAE;IAET,MAAM,EAAE,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,KAAK,UAAU,CAAC;IACnD,IAAI,cAAc,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,OAAO,IAAI,mBAAmB,CAAC,6CAA6C,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,4BAA4B,EAAE,4BAA4B;QAC5D,CAAC,CAAC,6BAA6B,EAAE,IAAI,kBAAkB,GAAG,CAAC;IAC7D,OAAO,IAAI,uBAAuB,CAChC,GAAG,IAAI,WAAW,MAAM,OAAO,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE;QACtD,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED;;;;kDAIkD;AAClD,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,KAAK,UAAU;QAC9C,CAAC,CAAC,IAAI,mBAAmB,CAAC,6CAA6C,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED;;;;qFAIqF;AACrF,MAAM,UAAU,SAAS,CAAC,WAAsC;IAC9D,MAAM,KAAK,GAAG,kBAAkB;SAC7B,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,EAAE,IAAI,EAAE;SACP,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3B,IAAI,CAAC;QACH,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,uDAAuD;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/dist/auth/auth.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Rut } from '../rut/index.js';
|
|
1
2
|
import type { AccountType } from '../identity/index.js';
|
|
2
3
|
import type { Runtime } from '../seams/index.js';
|
|
3
4
|
export interface AuthIdentity {
|
|
@@ -5,6 +6,10 @@ export interface AuthIdentity {
|
|
|
5
6
|
readonly nombre: string | null;
|
|
6
7
|
readonly accountType: AccountType;
|
|
7
8
|
}
|
|
9
|
+
/** `statusRefresh`: the live identity plus the www2 layer read LIVE (`/app/session/status`). */
|
|
10
|
+
export interface AuthIdentityRefresh extends AuthIdentity {
|
|
11
|
+
readonly www2: AuthWww2Status;
|
|
12
|
+
}
|
|
8
13
|
/** `whoami` — the AUTHENTICATED principal's own identity + contact. Session-keyed:
|
|
9
14
|
* it reads the login principal's `DatosCntrNow`, NOT the operate pointer (operate
|
|
10
15
|
* changes which RUT you ACT as, never who you ARE). PII by nature. */
|
|
@@ -15,27 +20,46 @@ export interface AuthWhoami {
|
|
|
15
20
|
readonly nombre: string | null;
|
|
16
21
|
readonly email: string | null;
|
|
17
22
|
}
|
|
23
|
+
/** The www2 APP-SESSION layer as reported by status (ADR-026). LOCAL: `authenticated` means the
|
|
24
|
+
* layer was minted and its cookie has not expired by the clock — not a server-side claim. */
|
|
25
|
+
export interface AuthWww2Status {
|
|
26
|
+
readonly authenticated: boolean;
|
|
27
|
+
readonly expiresAt: string | null;
|
|
28
|
+
}
|
|
18
29
|
export interface AuthStatusLocal {
|
|
19
30
|
/** LOCAL-only: a cookie jar exists on disk. NOT a server-side liveness claim. */
|
|
20
31
|
readonly authenticated: boolean;
|
|
21
32
|
readonly rut: string | null;
|
|
22
33
|
readonly sessionSource: 'cached' | 'none';
|
|
34
|
+
readonly www2: AuthWww2Status;
|
|
23
35
|
}
|
|
24
36
|
export interface AuthLoginResult {
|
|
25
37
|
readonly authenticated: true;
|
|
26
38
|
readonly rut: string;
|
|
27
|
-
readonly reason: 'browser_login' | 'console_login' | 'already_authenticated';
|
|
39
|
+
readonly reason: 'browser_login' | 'console_login' | 'keyring_login' | 'already_authenticated';
|
|
40
|
+
/** Set when `--www2` was requested: the www2 layer's state after this call (ADR-026). */
|
|
41
|
+
readonly www2?: AuthWww2Status;
|
|
28
42
|
}
|
|
29
43
|
export interface AuthLogoutResult {
|
|
30
44
|
readonly loggedOut: boolean;
|
|
31
45
|
readonly serverClosed: boolean;
|
|
46
|
+
/** Best-effort close of the www2 app session, when one was stored (ADR-026). */
|
|
47
|
+
readonly www2Closed: boolean;
|
|
48
|
+
}
|
|
49
|
+
/** Pure local read — NO portal call (sii-py "local-only" labelling). `now` decides whether the
|
|
50
|
+
* stored www2 layer is still within its cookie's own expiry. */
|
|
51
|
+
export declare function localStatus(store: Runtime['store'], now: Date): Promise<AuthStatusLocal>;
|
|
52
|
+
export interface LoginOptions {
|
|
53
|
+
/** Also mint the www2 APP-SESSION layer (ADR-026): after the classic login, the same headed
|
|
54
|
+
* browser opens the www2 app page and the user completes SII's OAuth login there. */
|
|
55
|
+
readonly www2?: boolean;
|
|
32
56
|
}
|
|
33
|
-
/** Pure local read — NO portal call (sii-py "local-only" labelling). */
|
|
34
|
-
export declare function localStatus(store: Runtime['store']): Promise<AuthStatusLocal>;
|
|
35
57
|
/** Browser cookies-only login (ADR-006). Only this + `consoleLogin` mint a session
|
|
36
58
|
* (ADR-019 lineage). Idempotent: a live cached session returns
|
|
37
|
-
* `already_authenticated` without opening a window.
|
|
38
|
-
|
|
59
|
+
* `already_authenticated` without opening a window. With `www2`, both layers must be live
|
|
60
|
+
* for that shortcut; otherwise the headed flow runs in full (classic login, then the www2
|
|
61
|
+
* step in the same browser — the classic page is what carries the user into SII). */
|
|
62
|
+
export declare function login(runtime: Runtime, options?: LoginOptions): Promise<AuthLoginResult>;
|
|
39
63
|
/** CLI-only console login (ADR-010): the Clave is typed into the TERMINAL, used
|
|
40
64
|
* once to fill SII's real form headless, and never persisted — only cookies are
|
|
41
65
|
* stored, exactly like the browser path. ONE attempt, never retried (ADR-004).
|
|
@@ -44,12 +68,24 @@ export declare function consoleLogin(runtime: Runtime, credentials: {
|
|
|
44
68
|
rut: string;
|
|
45
69
|
clave: string;
|
|
46
70
|
}): Promise<AuthLoginResult>;
|
|
71
|
+
/** The RUT renderings a human plausibly stored the entry under, in lookup order. The
|
|
72
|
+
* keyring is populated BY HAND (`secret-tool`, Seahorse, Keychain Access), so the code
|
|
73
|
+
* adapts to the human rather than the reverse (ADR-025). `Rut.parse` already upper-cases
|
|
74
|
+
* a `k`, so the canonical form covers that variant. */
|
|
75
|
+
export declare function keyringAccounts(rut: Rut): string[];
|
|
76
|
+
/** CLI-only keyring login (ADR-025): the Clave comes from the OS keyring instead of the
|
|
77
|
+
* terminal, and everything else matches `consoleLogin` — ONE attempt, cookies-only
|
|
78
|
+
* session, Clave never persisted by us nor audited. Nothing calls this implicitly: an
|
|
79
|
+
* expired session still requires the user to run the verb again (ADR-019 lineage). */
|
|
80
|
+
export declare function keyringLogin(runtime: Runtime, args: {
|
|
81
|
+
rut: string;
|
|
82
|
+
}): Promise<AuthLoginResult>;
|
|
47
83
|
/** Server-side close (best-effort) + wipe local session + operate context. */
|
|
48
84
|
export declare function logout(runtime: Runtime): Promise<AuthLogoutResult>;
|
|
49
85
|
/** Curated identity readback from the portal. Requires a live session (no implicit
|
|
50
86
|
* login) — acquired via `withSession`; here an expired jar is an explicit
|
|
51
87
|
* NotAuthenticated (URL-based detection), since the whole job is the readback. */
|
|
52
|
-
export declare function statusRefresh(runtime: Runtime): Promise<
|
|
88
|
+
export declare function statusRefresh(runtime: Runtime): Promise<AuthIdentityRefresh>;
|
|
53
89
|
/** whoami — the session PRINCIPAL's own razón social/nombre + email, read live from
|
|
54
90
|
* the portal (like `statusRefresh`, plus the email). Session-keyed: ignores the
|
|
55
91
|
* operate pointer (no `--rut`). The audit records ONLY that a whoami read happened
|
package/dist/auth/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth/auth.ts"],"names":[],"mappings":"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"}
|