@mcpherson-ai/observa-local-node 0.1.3 → 0.1.4

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 CHANGED
@@ -8,11 +8,12 @@ deny, approve, block, retry, or change anything in your systems, and this
8
8
  build contains no code path that could.
9
9
 
10
10
  Observa Local Node is an **invite-only beta**. This package delivers bytes; it
11
- activates nothing by itself. Installation requires the signed installation
12
- manifest issued with your invite, and the installer verifies that manifest
13
- against keys shipped in this package before composing anything.
11
+ activates nothing by itself. Installation requires a signed installation
12
+ manifest issued for your invited workspace, and the installer verifies that
13
+ manifest's signature against the public key shipped in this package before
14
+ composing anything. Downloading this package grants no service access.
14
15
 
15
- - Product: Observa Local Node 0.1.3
16
+ - Product: Observa Local Node 0.1.4
16
17
  - Composition: `observa-local-node-n8n-generic-shadow-beta` (beta channel)
17
18
  - Runtime components bundled: 5 (installed for you; never
18
19
  used as separate packages)
@@ -20,19 +21,32 @@ against keys shipped in this package before composing anything.
20
21
  ## Install
21
22
 
22
23
  ```sh
23
- npm install -g @mcpherson-ai/observa-local-node@beta
24
+ npm install -g @mcpherson-ai/observa-local-node
24
25
  observa --version
25
- observa install --manifest <your-signed-manifest.json>
26
+ observa pair --base-url <HOSTED_BASE_URL> --code-stdin # paste your single-use pairing code, then Ctrl-D
27
+ observa install # retrieves the manifest issued for THIS installation,
28
+ # verifies its signature locally, then composes
26
29
  ```
27
30
 
28
- Install by the `beta` dist-tag: this is a beta channel and no
29
- `latest` release exists, so a bare package name would not resolve.
31
+ This version is the current public base on npm's `latest` dist-tag,
32
+ so the bare package name resolves to these bytes. Future in-progress releases
33
+ use the separate `beta` dist-tag until they are promoted.
34
+
35
+ Pairing is runtime-neutral: the pairing code proves your invite, binds this
36
+ machine to your workspace, and chooses nothing about what gets installed. The
37
+ approved composition was recorded for your workspace when you were invited;
38
+ `observa install` retrieves the signed installation manifest for exactly this
39
+ installation and refuses closed if anything about that authorization is
40
+ missing. If you were given a signed manifest file instead, use
41
+ `observa install --manifest <your-signed-manifest.json>` — the same verifier
42
+ runs either way, and nothing is installed before it passes.
30
43
 
31
44
  The approved component artifacts ship inside this package and are found
32
45
  automatically; every artifact is verified by manifest-pinned SHA-256 before a
33
46
  byte of it is staged. Observa installs into `~/.observa/installation`
34
- (override: `OBSERVA_HOME`) and touches nothing else. Installation is fully
35
- offline: the installer has no registry or network surface at all.
47
+ (override: `OBSERVA_HOME`) and touches nothing else. The installer's only
48
+ network exchange is with the hosted service you paired with, to retrieve the
49
+ manifest; it has no registry surface at all.
36
50
 
37
51
  ## Observe n8n automatically
38
52
 
@@ -52,15 +66,14 @@ before n8n starts. The hook observes ordinary workflows automatically — do
52
66
  not add an Observa node to a workflow. It reads execution metadata only and
53
67
  never reads item data, node parameters, credentials, or workflow static data.
54
68
 
55
- ## Hosted evidence delivery (if you received a pairing code)
56
-
57
- ```sh
58
- observa pair --base-url <HOSTED_BASE_URL> --code-stdin
59
- ```
69
+ ## Hosted evidence delivery
60
70
 
61
- Paste the single-use pairing code, then send end-of-input (Ctrl-D). The
62
- resulting connector credential is stored owner-only and never displayed.
63
- Without a pairing code, everything above still works fully locally.
71
+ Pairing (above) also configures hosted evidence delivery: the resulting
72
+ connector credential is stored owner-only and never displayed, and
73
+ `observa start` delivers SHADOW_ONLY evidence to the workspace you paired
74
+ with. If you installed from a hand-delivered signed manifest without pairing,
75
+ everything above still works fully locally; pair later with
76
+ `observa pair --base-url <HOSTED_BASE_URL> --code-stdin` to add delivery.
64
77
 
65
78
  ## Commands
66
79
 
@@ -95,7 +108,10 @@ Plus the `observa` CLI, `SHA256SUMS`, and
95
108
  - It never modifies, restarts or reconfigures your n8n or any other system.
96
109
  - It asks for no system credentials, and has no field anywhere in which one
97
110
  could be sent to us.
98
- - It runs no install scripts, has zero dependencies, and phones nothing home.
111
+ - It runs no install scripts and has zero dependencies. When explicitly paired,
112
+ it contacts only the configured Observa Hosted service for signed-manifest
113
+ retrieval and SHADOW_ONLY evidence delivery; it has no registry or third-party
114
+ telemetry surface.
99
115
 
100
116
  ## If something refuses
101
117
 
package/SHA256SUMS CHANGED
@@ -1,20 +1,21 @@
1
- 757c317514d4082617a6d8be6a726e744561fc992ec7d57873c3a1029726f869 README.md
1
+ e693cb77cc1d3dbe97c20ea5b78390c0d922814eea7b5ba736ab555c812eabed README.md
2
2
  daf644c3cc22f4b588af1f242dd02dd0946b6cfa869db1466da33dfb235871d0 artifacts/mcphersonai-observa-adapter-n8n-0.1.0.tgz
3
3
  7f326e4b744f8eeaef7d12d781d82a6f8cf8cea5327ed4c9b22c180bd0ab5e04 artifacts/mcphersonai-observa-domain-generic-0.1.0.tgz
4
4
  b6f2ccbbb0526aa08686c8725dd5d2e78aee58e607f15e380170c057a08881e8 artifacts/mcphersonai-observa-hosted-transport-0.1.0.tgz
5
5
  5f4bc40bf964255491a21c066d1578b9867b892689c609e4475c53210f7b6b72 artifacts/mcphersonai-observa-n8n-h1-binding-0.1.0.tgz
6
6
  00e96d00c9ed9d8d3ca98cde4b9e14c8eecc9adc360174afb7ca95f03db61e3c artifacts/mcphersonai-observa-node-0.1.0.tgz
7
7
  70c520a6c4a2478a60b98bdc2018328c01d1c797c9048f664b507b4ee570632e distribution/observa-cli/bin/observa-n8n-hosted.mjs
8
- b2f67dcbf449e858933b5a19775adc8107bd66b6fc3ba2134e36b16eb892287a distribution/observa-cli/bin/observa.mjs
8
+ cd1c630182f4bd7fa1dd4323410021ab51c6f6020cd25dfd27e80a7486c73789 distribution/observa-cli/bin/observa.mjs
9
9
  0caa044f718d6305d60d53a8fb76255b84c7d08ae70ecb7d285a8d1f37c7d3fd distribution/observa-cli/integrations/n8n/observa-external-hook.cjs
10
10
  e6f3353b323702df54e96210bd0f1363f89636d2c0b216057698b383ecf40c8c distribution/observa-cli/keys/observa-beta-1.public.json
11
11
  31c5bf2495a237be149ab3b1bb72a0707d13f342bb438de1604dc06fe7faf71b distribution/observa-cli/src/artifact.mjs
12
12
  6935ff8d65887154f6e4527cb99e49dae88252f3f423dcc8e38a7a96b261af85 distribution/observa-cli/src/config.mjs
13
13
  3ac787dccc3c6a09e7f800ba31e4e3f67fe21f160226a51ed36228d440503c7f distribution/observa-cli/src/errors.mjs
14
14
  8deccb19fca28ea4ebb84d2da43c346a216bf958444376a64b06a59336ec6138 distribution/observa-cli/src/hosted-delivery.mjs
15
- a89aeeeaa04f099949a40ea3b3cf678aa4114824042df661e1faa71d5b8ce97e distribution/observa-cli/src/index.mjs
15
+ 99a364df116df33fb9ade70b0d6e6ec3729b5bf56922d1daaf57700d44904852 distribution/observa-cli/src/index.mjs
16
16
  2bccc8ca0bfd37382f00d032fa6dedce7ca2b6819019ab5d4c97e8995e58d1bc distribution/observa-cli/src/install.mjs
17
17
  0dffd6446a9428fc9f3e45e468988a9b13cfc99a5ad3179a1f1b01029bc5cfbc distribution/observa-cli/src/lock.mjs
18
+ 84932e42f80991c65a2874aaff4a248e387da2868c20a088eb86cc0bbedf0dcc distribution/observa-cli/src/manifest-fetch.mjs
18
19
  eccce81a4bd746805d31ee3a270dfd34083a40746293b1307f58288d0d8d79d0 distribution/observa-cli/src/manifest-schema.mjs
19
20
  94dd7980032fe70636ef96e089cd96aba2ac1307a369ae7ed52aa3c04267f91b distribution/observa-cli/src/manifest-verify.mjs
20
21
  6ae519f0e59dccd14a6bc6655c65846b1b9084bf28f720b9a5c24bba563d05a0 distribution/observa-cli/src/n8n-hook.mjs
@@ -23,9 +24,9 @@ ce2acc3d335467e7af2531a5950a34c3ed3dacdddb41601df20ff278efe7da63 distribution/o
23
24
  01fc22e4fc893f58d5eef11d726b4044fe2f1ad7430d9acb322e964b60d246e1 distribution/observa-cli/src/service.mjs
24
25
  07258afc26ec033d471af3a4bca60c1f2c74d898d55d295baa52a5eceaaf2073 distribution/observa-cli/src/state.mjs
25
26
  09dfc6c6e8668c8be4089c0bb6f85c49afdd54479489860c56b03198f011d03e distribution/observa-cli/src/status.mjs
26
- 5077b323eef9aab9fcb71aae5dd3b5e8ca15ea9b71a489068c2df109da77c2f2 distribution/observa-cli/src/vocabulary.mjs
27
- 5c7b7ae62dd01649983b6635b9b1f0549bbc2199502b384efbef19dd538f2cb6 npm-distribution-provenance.json
28
- 2022669eda7348bcccbbfc69025cadf99df0f5a97c7b8a756499bbbf53d3cd26 package.json
27
+ cc23f5c6e5de932afffab846d8491ceeca61fd6640717c42121e198bf66a2651 distribution/observa-cli/src/vocabulary.mjs
28
+ f7af2ea1b18443dfef5262a74dcbe6bc026b563e270e51a701cc5d34ec8ffc28 npm-distribution-provenance.json
29
+ a2be6dc2b8b2fa56792180ec6a2f35a00d0a199defc3af67686931e3348fc49a package.json
29
30
  d3e88b83d1226878130e9fbfbd33fd29634d4cb0c49b4d6a2b6dbc9ebbdb63e1 runtime-adapters/n8n/src/strict-json.mjs
30
31
  b28e8f6a53fe945ff1e2610a1f9d333aa9fa62ffe375e253aeadaed74a5eb72d sdk/contracts/canonical.mjs
31
32
  78aa76d66bf8606c2bcfe5e50004139fe8c2168fc3a9b653534fc41f2471a4e9 sdk/contracts/entry-boundary.mjs
@@ -31,6 +31,7 @@ import { pairHosted } from "../src/pair.mjs";
31
31
  import {
32
32
  pairingRecoveryAvailable, rePairHosted, unpairHosted,
33
33
  } from "../src/re-pair.mjs";
34
+ import { issuedManifestAvailable, retrieveIssuedManifest } from "../src/manifest-fetch.mjs";
34
35
  import { readState } from "../src/state.mjs";
35
36
  import { prepareN8nHook } from "../src/n8n-hook.mjs";
36
37
  import { CLI_ARTIFACT_ID, CLI_AUTHORITY, CLI_VERSION } from "../src/vocabulary.mjs";
@@ -92,8 +93,10 @@ function usage() {
92
93
  out("");
93
94
  out("usage: observa <install|status|diagnose|start|stop|update|rollback|uninstall|config|pair|unpair|n8n-setup|version>");
94
95
  out("");
95
- out(" install --manifest <signed.json> [--artifacts <dir>] [--expect-installation <id>]");
96
- out(" update --manifest <signed.json> [--artifacts <dir>]");
96
+ out(" install [--manifest <signed.json>] [--artifacts <dir>] [--expect-installation <id>]");
97
+ out(" without --manifest: after `observa pair`, retrieves the manifest Hosted issued");
98
+ out(" for this installation and verifies its signature locally before composing");
99
+ out(" update [--manifest <signed.json>] [--artifacts <dir>]");
97
100
  out(" rollback");
98
101
  out(" status | diagnose | start | stop | version");
99
102
  out(" uninstall --yes [--purge-config]");
@@ -182,21 +185,60 @@ async function main() {
182
185
  switch (command) {
183
186
  case "install":
184
187
  case "update": {
185
- if (typeof flags.manifest !== "string") throw new CliRefusal("MANIFEST_FLAG_REQUIRED");
186
188
  if (command === "update" && readState(home) === null) {
187
189
  throw new CliRefusal("NOT_INSTALLED", "update requires an existing installation");
188
190
  }
189
- const result = installFromManifestFile({
190
- home,
191
- manifestFile: resolve(flags.manifest),
192
- artifactDir: flags.artifacts ? resolve(flags.artifacts) : packagedArtifactsDir(),
193
- trustedKeys: trustedKeys(),
194
- expectedInstallationId: flags["expect-installation"] ?? null,
195
- });
191
+ // Two ways to obtain the signed manifest, ONE way to verify it.
192
+ // --manifest <file> the explicit path: offline, manual, recovery,
193
+ // and founder-issued manifests.
194
+ // (no flag) the paired path: after `observa pair`, retrieve
195
+ // the manifest Hosted already issued for THIS
196
+ // installation. The bytes land in an owner-only
197
+ // temporary file and go through exactly the same
198
+ // verifier the explicit path uses; the paired
199
+ // installation id is the binding the install
200
+ // must satisfy. Transport is not trust.
201
+ let manifestFile;
202
+ let issued = null;
203
+ let expectedInstallationId = flags["expect-installation"] ?? null;
204
+ if (typeof flags.manifest === "string") {
205
+ manifestFile = resolve(flags.manifest);
206
+ } else {
207
+ if (!issuedManifestAvailable(home)) {
208
+ throw new CliRefusal("MANIFEST_FLAG_REQUIRED",
209
+ "pass --manifest <signed.json>, or run `observa pair` first so the issued manifest can be retrieved");
210
+ }
211
+ issued = await retrieveIssuedManifest({ home });
212
+ manifestFile = issued.manifestFile;
213
+ if (expectedInstallationId !== null && expectedInstallationId !== issued.installationId) {
214
+ issued.discard();
215
+ throw new CliRefusal("MANIFEST_INSTALLATION_BINDING_MISMATCH",
216
+ "--expect-installation differs from the paired installation");
217
+ }
218
+ expectedInstallationId = issued.installationId;
219
+ }
220
+ let result;
221
+ try {
222
+ result = installFromManifestFile({
223
+ home,
224
+ manifestFile,
225
+ artifactDir: flags.artifacts ? resolve(flags.artifacts) : packagedArtifactsDir(),
226
+ trustedKeys: trustedKeys(),
227
+ expectedInstallationId,
228
+ });
229
+ } finally {
230
+ // The install transaction copied the verified text into the
231
+ // installation's own manifests directory; the retrieval file is
232
+ // scratch either way.
233
+ if (issued !== null) issued.discard();
234
+ }
196
235
  banner();
197
236
  out("");
198
237
  out(`${result.transition} ok`);
199
238
  out(`manifest ${result.manifest.manifest_id}`);
239
+ if (issued !== null) {
240
+ out(`source hosted issuance (${issued.hostedBaseUrl}); signature verified locally`);
241
+ }
200
242
  out(`mode ${result.manifest.mode}`);
201
243
  out(`components ${result.manifest.components.length}`);
202
244
  out("status installed");
@@ -37,3 +37,6 @@ export {
37
37
  } from "./config.mjs";
38
38
  export { serviceIsRunning, startService, stopService } from "./service.mjs";
39
39
  export { collectStatus, runDiagnose } from "./status.mjs";
40
+ export {
41
+ MANIFEST_ROUTE, issuedManifestAvailable, retrieveIssuedManifest,
42
+ } from "./manifest-fetch.mjs";
@@ -0,0 +1,159 @@
1
+ // Retrieve the signed installation manifest Hosted already issued for THIS
2
+ // paired installation — the automated replacement for a founder emailing a
3
+ // JSON file.
4
+ //
5
+ // What this module is: a bounded HTTP exchange over the pairing that
6
+ // `observa pair` already stored (base URL, mgd1 credential, installation id),
7
+ // returning raw manifest TEXT into an owner-only temporary file. What it is
8
+ // NOT: a verifier, an installer, or a trust decision. The returned file goes
9
+ // through EXACTLY the same path as a hand-delivered manifest —
10
+ // `installFromManifestFile` → strict parse → closed schema → Ed25519 verify
11
+ // against the public key shipped in this package → tenant/installation
12
+ // binding → artifact digests. Nothing here is believed because the server
13
+ // said it; the server only saved the tester a download.
14
+ //
15
+ // The installation secret (the mgd1 suffix, exactly what `observa pair
16
+ // re-pair` already presents as Bearer) exists in process memory for the one
17
+ // request; it has no path into output, errors, or the file written.
18
+ //
19
+ // AUTHORITY: NONE. Retrieval yields bytes to verify, not permission.
20
+ import { createHash, randomUUID } from "node:crypto";
21
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
22
+ import { join } from "node:path";
23
+ import { parseStrictJson } from "../../../runtime-adapters/n8n/src/strict-json.mjs";
24
+ import { refuseCli } from "./errors.mjs";
25
+ import { readLocalConfig } from "./config.mjs";
26
+ import { HOSTED_BASE_URL_PATTERN } from "./pair.mjs";
27
+ import { MANIFEST_ID_PATTERN } from "./manifest-schema.mjs";
28
+ import { MAX_SIGNED_DOCUMENT_BYTES } from "./vocabulary.mjs";
29
+
30
+ export const MANIFEST_ROUTE = "/observa/hosted-service/v1/manifest";
31
+
32
+ const MGD1_TOKEN_PATTERN = /^mgd1_([a-f0-9]{32})\.([A-Za-z0-9_-]{43})$/;
33
+ const WIRE_SAFE_ID_PATTERN = /^[A-Za-z0-9._:-]{1,96}$/;
34
+ const SHA256_PATTERN = /^[0-9a-f]{64}$/;
35
+ const DEFAULT_TIMEOUT_MS = 15_000;
36
+ // The manifest itself is bounded by the verifier's own document limit; the
37
+ // JSON wrapper around it adds a little.
38
+ const MAX_RESPONSE_BYTES = MAX_SIGNED_DOCUMENT_BYTES + 8 * 1024;
39
+
40
+ /** True when `observa pair` has stored everything retrieval needs. */
41
+ export function issuedManifestAvailable(home) {
42
+ let config;
43
+ try {
44
+ config = readLocalConfig(home);
45
+ } catch {
46
+ return false;
47
+ }
48
+ return HOSTED_BASE_URL_PATTERN.test(config.hosted_base_url ?? "")
49
+ && MGD1_TOKEN_PATTERN.test(config.hosted_connector_token ?? "")
50
+ && WIRE_SAFE_ID_PATTERN.test(config.hosted_installation_id ?? "");
51
+ }
52
+
53
+ function pairedIdentity(home) {
54
+ const config = readLocalConfig(home);
55
+ if (!HOSTED_BASE_URL_PATTERN.test(config.hosted_base_url ?? "")
56
+ || !MGD1_TOKEN_PATTERN.test(config.hosted_connector_token ?? "")
57
+ || !WIRE_SAFE_ID_PATTERN.test(config.hosted_installation_id ?? "")) {
58
+ refuseCli("MANIFEST_FETCH_NOT_PAIRED", "run `observa pair` first, or pass --manifest");
59
+ }
60
+ const token = MGD1_TOKEN_PATTERN.exec(config.hosted_connector_token);
61
+ return Object.freeze({
62
+ baseUrl: config.hosted_base_url,
63
+ installationId: config.hosted_installation_id,
64
+ installationSecret: token[2],
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Retrieve the issued manifest for the paired installation into an
70
+ * owner-only temporary file under `<home>/manifests/`. Returns the file path
71
+ * and the paired installation id (the ONLY identity the caller may bind the
72
+ * install to). The caller removes the file after the install transaction.
73
+ *
74
+ * Every refusal is a closed CLI code. Server body text never travels into a
75
+ * thrown error verbatim.
76
+ */
77
+ export async function retrieveIssuedManifest({
78
+ home, fetchImpl = globalThis.fetch, timeoutMs = DEFAULT_TIMEOUT_MS,
79
+ }) {
80
+ const paired = pairedIdentity(home);
81
+
82
+ let response;
83
+ const controller = new AbortController();
84
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
85
+ try {
86
+ response = await fetchImpl(`${paired.baseUrl}${MANIFEST_ROUTE}`, {
87
+ method: "POST",
88
+ headers: {
89
+ authorization: `Bearer ${paired.installationSecret}`,
90
+ "content-type": "application/json",
91
+ },
92
+ body: JSON.stringify({ installation_id: paired.installationId }),
93
+ signal: controller.signal,
94
+ });
95
+ } catch (error) {
96
+ refuseCli("MANIFEST_FETCH_UNREACHABLE",
97
+ error?.name === "AbortError" ? "timed out" : "connection failed");
98
+ } finally {
99
+ clearTimeout(timer);
100
+ }
101
+
102
+ let parsed = null;
103
+ try {
104
+ const text = await response.text();
105
+ if (Buffer.byteLength(text, "utf8") > MAX_RESPONSE_BYTES) {
106
+ refuseCli("MANIFEST_FETCH_RESPONSE_MALFORMED", "oversized");
107
+ }
108
+ parsed = parseStrictJson(text);
109
+ } catch (error) {
110
+ if (error?.code?.startsWith?.("MANIFEST_FETCH_")) throw error;
111
+ refuseCli("MANIFEST_FETCH_RESPONSE_MALFORMED");
112
+ }
113
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
114
+ refuseCli("MANIFEST_FETCH_RESPONSE_MALFORMED");
115
+ }
116
+ if (parsed.ok !== true) {
117
+ // One bounded reason code from the server's closed vocabulary; the rest
118
+ // of the body is discarded.
119
+ const reason = typeof parsed.reason === "string" && /^[a-z_]{1,64}$/.test(parsed.reason)
120
+ ? parsed.reason : "manifest_refused";
121
+ refuseCli("MANIFEST_FETCH_REFUSED", reason);
122
+ }
123
+ // The server must be talking about THIS installation. A manifest for any
124
+ // other identity would be refused by the verifier's binding check anyway;
125
+ // refusing here keeps the failure local and named.
126
+ if (parsed.installation_id !== paired.installationId) {
127
+ refuseCli("MANIFEST_FETCH_INSTALLATION_MISMATCH");
128
+ }
129
+ const text = parsed.signed_manifest_text;
130
+ if (typeof text !== "string" || text.length === 0
131
+ || Buffer.byteLength(text, "utf8") > MAX_SIGNED_DOCUMENT_BYTES) {
132
+ refuseCli("MANIFEST_FETCH_RESPONSE_MALFORMED", "manifest text");
133
+ }
134
+ // Transport-integrity cross-check only (the digest is the server's own
135
+ // claim about its own bytes). Trust comes from the signature, later.
136
+ const digest = createHash("sha256").update(text, "utf8").digest("hex");
137
+ if (typeof parsed.manifest_sha256 !== "string" || !SHA256_PATTERN.test(parsed.manifest_sha256)
138
+ || parsed.manifest_sha256 !== digest) {
139
+ refuseCli("MANIFEST_FETCH_RESPONSE_MALFORMED", "digest");
140
+ }
141
+ const manifestId = typeof parsed.manifest_id === "string" && MANIFEST_ID_PATTERN.test(parsed.manifest_id)
142
+ ? parsed.manifest_id : null;
143
+
144
+ const dir = join(home, "manifests");
145
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
146
+ const file = join(dir, `.issued-${process.pid}-${randomUUID()}.signed.json`);
147
+ writeFileSync(file, text, { mode: 0o600, flag: "wx" });
148
+ return Object.freeze({
149
+ manifestFile: file,
150
+ installationId: paired.installationId,
151
+ hostedBaseUrl: paired.baseUrl,
152
+ manifestId,
153
+ reissued: parsed.reissued === true,
154
+ /** Remove the temporary file (best effort; the install already copied it). */
155
+ discard() {
156
+ rmSync(file, { force: true });
157
+ },
158
+ });
159
+ }
@@ -5,7 +5,10 @@
5
5
  // the authority scan in the test suite holds that closed.
6
6
 
7
7
  export const CLI_ARTIFACT_ID = "observa-cli";
8
- export const CLI_VERSION = "0.1.3";
8
+ // 0.1.3 is the immutable published, manual-manifest-only release. Automatic
9
+ // manifest retrieval first ships in 0.1.4; these changed bytes must never be
10
+ // packaged under the historical 0.1.3 identity.
11
+ export const CLI_VERSION = "0.1.4";
9
12
  export const CLI_AUTHORITY = "NONE";
10
13
  export const CLI_POLICY_AUTHORITY = "NONE";
11
14
  export const CLI_VERIFICATION_AUTHORITY = "NONE";
@@ -1 +1 @@
1
- {"authority":{"governance_authority":"V7 (frozen) remains sole governance authority","installer_policy_authority":"NONE","installer_verification_authority":"NONE","npm_distribution_authority":"NONE"},"catalog_digest":"2d053df59e9acb1c8200ee5130e939920c9b6eb257af91f9656f86744521073b","catalog_generated_from_head":"a6c811cf5d3018a0f8b09af4592ec34649ce6aa0","cli_files":[{"git_blob":"9d306766ddb8f7d44dea49435fe4d3e08b740692","mode":"0644","path":"distribution/observa-cli/bin/observa-n8n-hosted.mjs","sha256":"70c520a6c4a2478a60b98bdc2018328c01d1c797c9048f664b507b4ee570632e"},{"git_blob":"d69a32fa5d699a33609503b3d882775504275976","mode":"0644","path":"distribution/observa-cli/bin/observa.mjs","sha256":"b2f67dcbf449e858933b5a19775adc8107bd66b6fc3ba2134e36b16eb892287a"},{"git_blob":"51f82379566f7ec1968f0fa44c70f2efa09e9230","mode":"0644","path":"distribution/observa-cli/integrations/n8n/observa-external-hook.cjs","sha256":"0caa044f718d6305d60d53a8fb76255b84c7d08ae70ecb7d285a8d1f37c7d3fd"},{"git_blob":"4f3d3658702916e155912240b31f9fa963c9e62b","mode":"0644","path":"distribution/observa-cli/keys/observa-beta-1.public.json","sha256":"e6f3353b323702df54e96210bd0f1363f89636d2c0b216057698b383ecf40c8c"},{"git_blob":"a515812743475a659f7372919159973cf4c7bc41","mode":"0644","path":"distribution/observa-cli/src/artifact.mjs","sha256":"31c5bf2495a237be149ab3b1bb72a0707d13f342bb438de1604dc06fe7faf71b"},{"git_blob":"fde8e88a13b35da13e02e22e195a80b816c0df88","mode":"0644","path":"distribution/observa-cli/src/config.mjs","sha256":"6935ff8d65887154f6e4527cb99e49dae88252f3f423dcc8e38a7a96b261af85"},{"git_blob":"8e35256ac3bc02fcebf6a79518fcaf7bf68f94ba","mode":"0644","path":"distribution/observa-cli/src/errors.mjs","sha256":"3ac787dccc3c6a09e7f800ba31e4e3f67fe21f160226a51ed36228d440503c7f"},{"git_blob":"7eca3575e16a8eb9cca4afd766df6b65341e7806","mode":"0644","path":"distribution/observa-cli/src/hosted-delivery.mjs","sha256":"8deccb19fca28ea4ebb84d2da43c346a216bf958444376a64b06a59336ec6138"},{"git_blob":"879bf71507eac6f56657f2f290fb103fc81911a7","mode":"0644","path":"distribution/observa-cli/src/index.mjs","sha256":"a89aeeeaa04f099949a40ea3b3cf678aa4114824042df661e1faa71d5b8ce97e"},{"git_blob":"f8fa583c57508f3aebe9964cc8bbbfe2be16c955","mode":"0644","path":"distribution/observa-cli/src/install.mjs","sha256":"2bccc8ca0bfd37382f00d032fa6dedce7ca2b6819019ab5d4c97e8995e58d1bc"},{"git_blob":"1c83ab09b41990dd7553bd9bd95d0757af4ea8db","mode":"0644","path":"distribution/observa-cli/src/lock.mjs","sha256":"0dffd6446a9428fc9f3e45e468988a9b13cfc99a5ad3179a1f1b01029bc5cfbc"},{"git_blob":"1f53fa37d4174bbd3840e80be3db5aa7ecfb760a","mode":"0644","path":"distribution/observa-cli/src/manifest-schema.mjs","sha256":"eccce81a4bd746805d31ee3a270dfd34083a40746293b1307f58288d0d8d79d0"},{"git_blob":"3657a1369a73b68954e248145ed1b38d1ecac69a","mode":"0644","path":"distribution/observa-cli/src/manifest-verify.mjs","sha256":"94dd7980032fe70636ef96e089cd96aba2ac1307a369ae7ed52aa3c04267f91b"},{"git_blob":"06d80e0dcb42db6bbce6758d58f941b782ee76f4","mode":"0644","path":"distribution/observa-cli/src/n8n-hook.mjs","sha256":"6ae519f0e59dccd14a6bc6655c65846b1b9084bf28f720b9a5c24bba563d05a0"},{"git_blob":"bcf8d30926565ae118aea3ac2adcce0420aa5371","mode":"0644","path":"distribution/observa-cli/src/pair.mjs","sha256":"ce2acc3d335467e7af2531a5950a34c3ed3dacdddb41601df20ff278efe7da63"},{"git_blob":"5f747b38dd5cf7d5b33659399fc684d73184a5b9","mode":"0644","path":"distribution/observa-cli/src/re-pair.mjs","sha256":"3ccc90a750ae941d9dffd7f8e19be9c0cc404016ee3f442fe5a8ee43abcf9664"},{"git_blob":"04df25dd55dc4bad932a736fb8201e6894dbfe1d","mode":"0644","path":"distribution/observa-cli/src/service.mjs","sha256":"01fc22e4fc893f58d5eef11d726b4044fe2f1ad7430d9acb322e964b60d246e1"},{"git_blob":"784a93ab8d037951fcf716e3afb11c6bac36189c","mode":"0644","path":"distribution/observa-cli/src/state.mjs","sha256":"07258afc26ec033d471af3a4bca60c1f2c74d898d55d295baa52a5eceaaf2073"},{"git_blob":"a46341fd73c2e657ec04065b569057df0857798c","mode":"0644","path":"distribution/observa-cli/src/status.mjs","sha256":"09dfc6c6e8668c8be4089c0bb6f85c49afdd54479489860c56b03198f011d03e"},{"git_blob":"f376d51a08765ce7d1d27945e6e2ed707ac112b2","mode":"0644","path":"distribution/observa-cli/src/vocabulary.mjs","sha256":"5077b323eef9aab9fcb71aae5dd3b5e8ca15ea9b71a489068c2df109da77c2f2"},{"git_blob":"851da53215dd32eaf2e7f0ebeaac6a9ec34d5b58","mode":"0644","path":"runtime-adapters/n8n/src/strict-json.mjs","sha256":"d3e88b83d1226878130e9fbfbd33fd29634d4cb0c49b4d6a2b6dbc9ebbdb63e1","source_commit":"39918d5ea57604375e27ce44b6303aaade9cb81a"},{"git_blob":"f0734ab1704ea0dfd306ca253b5f14772b47e7b3","mode":"0644","path":"sdk/contracts/canonical.mjs","sha256":"b28e8f6a53fe945ff1e2610a1f9d333aa9fa62ffe375e253aeadaed74a5eb72d","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"5cf63fb8ecd6d23037c5c93c6d484dc31f57ffd4","mode":"0644","path":"sdk/contracts/entry-boundary.mjs","sha256":"78aa76d66bf8606c2bcfe5e50004139fe8c2168fc3a9b653534fc41f2471a4e9","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"91463a257273ec73d66a25f46dc2348a85d0f452","mode":"0644","path":"sdk/contracts/errors.mjs","sha256":"d5aa1bbe72f3fa4ba9edf47ad7dc2113df3877fa852251221c8c0abee60545d7","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"07eb2a73377dd13b7fe61ae437c9706bd092674d","mode":"0644","path":"sdk/contracts/stable-primitives.mjs","sha256":"88da8b531a26fc8d1b7d68f622e1e135b0addbf75057fd161b773cb449044c87","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"}],"cli_source":{"git_path":"distribution/observa-cli","tree":"f24591a0600055630847eda5a0f4c448abb8b1de"},"components":[{"artifact_filename":"mcphersonai-observa-node-0.1.0.tgz","artifact_sha256":"00e96d00c9ed9d8d3ca98cde4b9e14c8eecc9adc360174afb7ca95f03db61e3c","component_id":"observa-node-h1","content_digest":"ee13b4ca5e9cef4b544dd60c8085c645788d89e614b8fd742890564b64850171","package_name":"@mcphersonai/observa-node","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-node-0.1.0.tgz","role":"verification","source_subtrees":[{"commit":"26e968240b7cb3c560064551213ca756ae89a2ca","git_path":"sdk/contracts","tree":"0a1e1b09b76772a0e8e1b265bfc577aef52259b5"},{"commit":"26e968240b7cb3c560064551213ca756ae89a2ca","git_path":"verification-node","tree":"9e1014c710826aee41ce75808b0079fc754318b3"}]},{"artifact_filename":"mcphersonai-observa-adapter-n8n-0.1.0.tgz","artifact_sha256":"daf644c3cc22f4b588af1f242dd02dd0946b6cfa869db1466da33dfb235871d0","component_id":"observa-adapter-n8n","content_digest":"8b0c33d62cd8a39cc962b03cae80e82ee08ef2daafeb676a5810da6427c1f63c","package_name":"@mcphersonai/observa-adapter-n8n","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-adapter-n8n-0.1.0.tgz","role":"runtime-adapter","source_subtrees":[{"commit":"39918d5ea57604375e27ce44b6303aaade9cb81a","git_path":"runtime-adapters/n8n","tree":"a68bb0b5c062589effe907eb666ee45e0f484551"}]},{"artifact_filename":"mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","artifact_sha256":"5f4bc40bf964255491a21c066d1578b9867b892689c609e4475c53210f7b6b72","component_id":"observa-n8n-h1-binding","content_digest":"d6fb3d97e9ca6d5f06feaa1abc12e0cc9ca904c8b4a00c304dbcadc6f315fec0","package_name":"@mcphersonai/observa-n8n-h1-binding","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","role":"integration-binding","source_subtrees":[{"commit":"cb389b929e9f97fbfb47957615aaf58556db8ea8","git_path":"integrations/n8n-h1","tree":"569247d6084d6e343c4d177d10e7024864be425e"}]},{"artifact_filename":"mcphersonai-observa-domain-generic-0.1.0.tgz","artifact_sha256":"7f326e4b744f8eeaef7d12d781d82a6f8cf8cea5327ed4c9b22c180bd0ab5e04","component_id":"observa-domain-generic","content_digest":"9a839ee4ba687d6a7b531e1a2c318a52b91d4beea250d9d360e04df180a3944c","package_name":"@mcphersonai/observa-domain-generic","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-domain-generic-0.1.0.tgz","role":"domain-contract","source_subtrees":[{"commit":"f73c53a26c9b77e151b4fffe89b657ae31ddd2cb","git_path":"domains/generic","tree":"92a014bb77e41812bc55a79a8a72837ec6d74537"}]},{"artifact_filename":"mcphersonai-observa-hosted-transport-0.1.0.tgz","artifact_sha256":"b6f2ccbbb0526aa08686c8725dd5d2e78aee58e607f15e380170c057a08881e8","component_id":"observa-hosted-transport-client","content_digest":"ca3b9cb0246a9f722138bd446ef1bfb7df42b1981065feb2a551cd42c534f007","package_name":"@mcphersonai/observa-hosted-transport","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-hosted-transport-0.1.0.tgz","role":"transport-client","source_subtrees":[{"commit":"199dd6a87209de625915bad7cf63a359d6d2ff05","git_path":"transport/hosted","tree":"b01763f89bc1fa238fe238e1f47a471b94fb933c"}]}],"dist_tag":"beta","distribution":{"access":"public","dist_tag":"beta","prepared_only":true,"provenance_attestation":"UNAVAILABLE_PRIVATE_SOURCE","published":false,"registry":"https://registry.npmjs.org/","trusted_publishing":"PREPARED_NOT_ACTIVATED"},"files":[{"mode":"0644","path":"README.md","sha256":"757c317514d4082617a6d8be6a726e744561fc992ec7d57873c3a1029726f869","size_bytes":4458},{"mode":"0644","path":"artifacts/mcphersonai-observa-adapter-n8n-0.1.0.tgz","sha256":"daf644c3cc22f4b588af1f242dd02dd0946b6cfa869db1466da33dfb235871d0","size_bytes":72591},{"mode":"0644","path":"artifacts/mcphersonai-observa-domain-generic-0.1.0.tgz","sha256":"7f326e4b744f8eeaef7d12d781d82a6f8cf8cea5327ed4c9b22c180bd0ab5e04","size_bytes":7558},{"mode":"0644","path":"artifacts/mcphersonai-observa-hosted-transport-0.1.0.tgz","sha256":"b6f2ccbbb0526aa08686c8725dd5d2e78aee58e607f15e380170c057a08881e8","size_bytes":14008},{"mode":"0644","path":"artifacts/mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","sha256":"5f4bc40bf964255491a21c066d1578b9867b892689c609e4475c53210f7b6b72","size_bytes":10441},{"mode":"0644","path":"artifacts/mcphersonai-observa-node-0.1.0.tgz","sha256":"00e96d00c9ed9d8d3ca98cde4b9e14c8eecc9adc360174afb7ca95f03db61e3c","size_bytes":106145},{"mode":"0644","path":"distribution/observa-cli/bin/observa-n8n-hosted.mjs","sha256":"70c520a6c4a2478a60b98bdc2018328c01d1c797c9048f664b507b4ee570632e","size_bytes":5170},{"mode":"0644","path":"distribution/observa-cli/bin/observa.mjs","sha256":"b2f67dcbf449e858933b5a19775adc8107bd66b6fc3ba2134e36b16eb892287a","size_bytes":13217},{"mode":"0644","path":"distribution/observa-cli/integrations/n8n/observa-external-hook.cjs","sha256":"0caa044f718d6305d60d53a8fb76255b84c7d08ae70ecb7d285a8d1f37c7d3fd","size_bytes":5374},{"mode":"0644","path":"distribution/observa-cli/keys/observa-beta-1.public.json","sha256":"e6f3353b323702df54e96210bd0f1363f89636d2c0b216057698b383ecf40c8c","size_bytes":224},{"mode":"0644","path":"distribution/observa-cli/src/artifact.mjs","sha256":"31c5bf2495a237be149ab3b1bb72a0707d13f342bb438de1604dc06fe7faf71b","size_bytes":5890},{"mode":"0644","path":"distribution/observa-cli/src/config.mjs","sha256":"6935ff8d65887154f6e4527cb99e49dae88252f3f423dcc8e38a7a96b261af85","size_bytes":6279},{"mode":"0644","path":"distribution/observa-cli/src/errors.mjs","sha256":"3ac787dccc3c6a09e7f800ba31e4e3f67fe21f160226a51ed36228d440503c7f","size_bytes":738},{"mode":"0644","path":"distribution/observa-cli/src/hosted-delivery.mjs","sha256":"8deccb19fca28ea4ebb84d2da43c346a216bf958444376a64b06a59336ec6138","size_bytes":6433},{"mode":"0644","path":"distribution/observa-cli/src/index.mjs","sha256":"a89aeeeaa04f099949a40ea3b3cf678aa4114824042df661e1faa71d5b8ce97e","size_bytes":1445},{"mode":"0644","path":"distribution/observa-cli/src/install.mjs","sha256":"2bccc8ca0bfd37382f00d032fa6dedce7ca2b6819019ab5d4c97e8995e58d1bc","size_bytes":18270},{"mode":"0644","path":"distribution/observa-cli/src/lock.mjs","sha256":"0dffd6446a9428fc9f3e45e468988a9b13cfc99a5ad3179a1f1b01029bc5cfbc","size_bytes":2070},{"mode":"0644","path":"distribution/observa-cli/src/manifest-schema.mjs","sha256":"eccce81a4bd746805d31ee3a270dfd34083a40746293b1307f58288d0d8d79d0","size_bytes":10092},{"mode":"0644","path":"distribution/observa-cli/src/manifest-verify.mjs","sha256":"94dd7980032fe70636ef96e089cd96aba2ac1307a369ae7ed52aa3c04267f91b","size_bytes":5034},{"mode":"0644","path":"distribution/observa-cli/src/n8n-hook.mjs","sha256":"6ae519f0e59dccd14a6bc6655c65846b1b9084bf28f720b9a5c24bba563d05a0","size_bytes":2916},{"mode":"0644","path":"distribution/observa-cli/src/pair.mjs","sha256":"ce2acc3d335467e7af2531a5950a34c3ed3dacdddb41601df20ff278efe7da63","size_bytes":6266},{"mode":"0644","path":"distribution/observa-cli/src/re-pair.mjs","sha256":"3ccc90a750ae941d9dffd7f8e19be9c0cc404016ee3f442fe5a8ee43abcf9664","size_bytes":6349},{"mode":"0644","path":"distribution/observa-cli/src/service.mjs","sha256":"01fc22e4fc893f58d5eef11d726b4044fe2f1ad7430d9acb322e964b60d246e1","size_bytes":9623},{"mode":"0644","path":"distribution/observa-cli/src/state.mjs","sha256":"07258afc26ec033d471af3a4bca60c1f2c74d898d55d295baa52a5eceaaf2073","size_bytes":3573},{"mode":"0644","path":"distribution/observa-cli/src/status.mjs","sha256":"09dfc6c6e8668c8be4089c0bb6f85c49afdd54479489860c56b03198f011d03e","size_bytes":7928},{"mode":"0644","path":"distribution/observa-cli/src/vocabulary.mjs","sha256":"5077b323eef9aab9fcb71aae5dd3b5e8ca15ea9b71a489068c2df109da77c2f2","size_bytes":2236},{"mode":"0644","path":"package.json","sha256":"2022669eda7348bcccbbfc69025cadf99df0f5a97c7b8a756499bbbf53d3cd26","size_bytes":979},{"mode":"0644","path":"runtime-adapters/n8n/src/strict-json.mjs","sha256":"d3e88b83d1226878130e9fbfbd33fd29634d4cb0c49b4d6a2b6dbc9ebbdb63e1","size_bytes":5590},{"mode":"0644","path":"sdk/contracts/canonical.mjs","sha256":"b28e8f6a53fe945ff1e2610a1f9d333aa9fa62ffe375e253aeadaed74a5eb72d","size_bytes":14109},{"mode":"0644","path":"sdk/contracts/entry-boundary.mjs","sha256":"78aa76d66bf8606c2bcfe5e50004139fe8c2168fc3a9b653534fc41f2471a4e9","size_bytes":22747},{"mode":"0644","path":"sdk/contracts/errors.mjs","sha256":"d5aa1bbe72f3fa4ba9edf47ad7dc2113df3877fa852251221c8c0abee60545d7","size_bytes":13626},{"mode":"0644","path":"sdk/contracts/stable-primitives.mjs","sha256":"88da8b531a26fc8d1b7d68f622e1e135b0addbf75057fd161b773cb449044c87","size_bytes":5753}],"installation_flow":"npm delivers bytes only; installation requires a signed installation manifest verified by the shipped CLI against the shipped trusted public keys","min_cli_version":"0.1.2","mode":"SHADOW_ONLY","package_name":"@mcpherson-ai/observa-local-node","package_version":"0.1.3","product":"Observa Local Node","profile_id":"observa-local-node-n8n-generic-shadow-beta","record_digest":"62024672c8db9dd8ebfd21f3b51a75d317575d31ae6cc8d3407ad7665db29e4e","release_channel":"beta","schema":"observa.release.npm-distribution","schema_version":1}
1
+ {"authority":{"governance_authority":"V7 (frozen) remains sole governance authority","installer_policy_authority":"NONE","installer_verification_authority":"NONE","npm_distribution_authority":"NONE"},"catalog_digest":"2d053df59e9acb1c8200ee5130e939920c9b6eb257af91f9656f86744521073b","catalog_generated_from_head":"a6c811cf5d3018a0f8b09af4592ec34649ce6aa0","cli_files":[{"git_blob":"9d306766ddb8f7d44dea49435fe4d3e08b740692","mode":"0644","path":"distribution/observa-cli/bin/observa-n8n-hosted.mjs","sha256":"70c520a6c4a2478a60b98bdc2018328c01d1c797c9048f664b507b4ee570632e"},{"git_blob":"f74521c8217d8e51df2f505296d5107799db171b","mode":"0644","path":"distribution/observa-cli/bin/observa.mjs","sha256":"cd1c630182f4bd7fa1dd4323410021ab51c6f6020cd25dfd27e80a7486c73789"},{"git_blob":"51f82379566f7ec1968f0fa44c70f2efa09e9230","mode":"0644","path":"distribution/observa-cli/integrations/n8n/observa-external-hook.cjs","sha256":"0caa044f718d6305d60d53a8fb76255b84c7d08ae70ecb7d285a8d1f37c7d3fd"},{"git_blob":"4f3d3658702916e155912240b31f9fa963c9e62b","mode":"0644","path":"distribution/observa-cli/keys/observa-beta-1.public.json","sha256":"e6f3353b323702df54e96210bd0f1363f89636d2c0b216057698b383ecf40c8c"},{"git_blob":"a515812743475a659f7372919159973cf4c7bc41","mode":"0644","path":"distribution/observa-cli/src/artifact.mjs","sha256":"31c5bf2495a237be149ab3b1bb72a0707d13f342bb438de1604dc06fe7faf71b"},{"git_blob":"fde8e88a13b35da13e02e22e195a80b816c0df88","mode":"0644","path":"distribution/observa-cli/src/config.mjs","sha256":"6935ff8d65887154f6e4527cb99e49dae88252f3f423dcc8e38a7a96b261af85"},{"git_blob":"8e35256ac3bc02fcebf6a79518fcaf7bf68f94ba","mode":"0644","path":"distribution/observa-cli/src/errors.mjs","sha256":"3ac787dccc3c6a09e7f800ba31e4e3f67fe21f160226a51ed36228d440503c7f"},{"git_blob":"7eca3575e16a8eb9cca4afd766df6b65341e7806","mode":"0644","path":"distribution/observa-cli/src/hosted-delivery.mjs","sha256":"8deccb19fca28ea4ebb84d2da43c346a216bf958444376a64b06a59336ec6138"},{"git_blob":"673c1ba389a042207011129e89cd7173407349ed","mode":"0644","path":"distribution/observa-cli/src/index.mjs","sha256":"99a364df116df33fb9ade70b0d6e6ec3729b5bf56922d1daaf57700d44904852"},{"git_blob":"f8fa583c57508f3aebe9964cc8bbbfe2be16c955","mode":"0644","path":"distribution/observa-cli/src/install.mjs","sha256":"2bccc8ca0bfd37382f00d032fa6dedce7ca2b6819019ab5d4c97e8995e58d1bc"},{"git_blob":"1c83ab09b41990dd7553bd9bd95d0757af4ea8db","mode":"0644","path":"distribution/observa-cli/src/lock.mjs","sha256":"0dffd6446a9428fc9f3e45e468988a9b13cfc99a5ad3179a1f1b01029bc5cfbc"},{"git_blob":"a9fb37efb705e106a8e23050f9447d8c49506458","mode":"0644","path":"distribution/observa-cli/src/manifest-fetch.mjs","sha256":"84932e42f80991c65a2874aaff4a248e387da2868c20a088eb86cc0bbedf0dcc"},{"git_blob":"1f53fa37d4174bbd3840e80be3db5aa7ecfb760a","mode":"0644","path":"distribution/observa-cli/src/manifest-schema.mjs","sha256":"eccce81a4bd746805d31ee3a270dfd34083a40746293b1307f58288d0d8d79d0"},{"git_blob":"3657a1369a73b68954e248145ed1b38d1ecac69a","mode":"0644","path":"distribution/observa-cli/src/manifest-verify.mjs","sha256":"94dd7980032fe70636ef96e089cd96aba2ac1307a369ae7ed52aa3c04267f91b"},{"git_blob":"06d80e0dcb42db6bbce6758d58f941b782ee76f4","mode":"0644","path":"distribution/observa-cli/src/n8n-hook.mjs","sha256":"6ae519f0e59dccd14a6bc6655c65846b1b9084bf28f720b9a5c24bba563d05a0"},{"git_blob":"bcf8d30926565ae118aea3ac2adcce0420aa5371","mode":"0644","path":"distribution/observa-cli/src/pair.mjs","sha256":"ce2acc3d335467e7af2531a5950a34c3ed3dacdddb41601df20ff278efe7da63"},{"git_blob":"5f747b38dd5cf7d5b33659399fc684d73184a5b9","mode":"0644","path":"distribution/observa-cli/src/re-pair.mjs","sha256":"3ccc90a750ae941d9dffd7f8e19be9c0cc404016ee3f442fe5a8ee43abcf9664"},{"git_blob":"04df25dd55dc4bad932a736fb8201e6894dbfe1d","mode":"0644","path":"distribution/observa-cli/src/service.mjs","sha256":"01fc22e4fc893f58d5eef11d726b4044fe2f1ad7430d9acb322e964b60d246e1"},{"git_blob":"784a93ab8d037951fcf716e3afb11c6bac36189c","mode":"0644","path":"distribution/observa-cli/src/state.mjs","sha256":"07258afc26ec033d471af3a4bca60c1f2c74d898d55d295baa52a5eceaaf2073"},{"git_blob":"a46341fd73c2e657ec04065b569057df0857798c","mode":"0644","path":"distribution/observa-cli/src/status.mjs","sha256":"09dfc6c6e8668c8be4089c0bb6f85c49afdd54479489860c56b03198f011d03e"},{"git_blob":"19fb418b47d6841fc3ceff9340fdde460834f14d","mode":"0644","path":"distribution/observa-cli/src/vocabulary.mjs","sha256":"cc23f5c6e5de932afffab846d8491ceeca61fd6640717c42121e198bf66a2651"},{"git_blob":"851da53215dd32eaf2e7f0ebeaac6a9ec34d5b58","mode":"0644","path":"runtime-adapters/n8n/src/strict-json.mjs","sha256":"d3e88b83d1226878130e9fbfbd33fd29634d4cb0c49b4d6a2b6dbc9ebbdb63e1","source_commit":"39918d5ea57604375e27ce44b6303aaade9cb81a"},{"git_blob":"f0734ab1704ea0dfd306ca253b5f14772b47e7b3","mode":"0644","path":"sdk/contracts/canonical.mjs","sha256":"b28e8f6a53fe945ff1e2610a1f9d333aa9fa62ffe375e253aeadaed74a5eb72d","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"5cf63fb8ecd6d23037c5c93c6d484dc31f57ffd4","mode":"0644","path":"sdk/contracts/entry-boundary.mjs","sha256":"78aa76d66bf8606c2bcfe5e50004139fe8c2168fc3a9b653534fc41f2471a4e9","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"91463a257273ec73d66a25f46dc2348a85d0f452","mode":"0644","path":"sdk/contracts/errors.mjs","sha256":"d5aa1bbe72f3fa4ba9edf47ad7dc2113df3877fa852251221c8c0abee60545d7","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"},{"git_blob":"07eb2a73377dd13b7fe61ae437c9706bd092674d","mode":"0644","path":"sdk/contracts/stable-primitives.mjs","sha256":"88da8b531a26fc8d1b7d68f622e1e135b0addbf75057fd161b773cb449044c87","source_commit":"26e968240b7cb3c560064551213ca756ae89a2ca"}],"cli_source":{"git_path":"distribution/observa-cli","tree":"8d01dd71da1cc62222dfa81e7b87791c72f0da7f"},"components":[{"artifact_filename":"mcphersonai-observa-node-0.1.0.tgz","artifact_sha256":"00e96d00c9ed9d8d3ca98cde4b9e14c8eecc9adc360174afb7ca95f03db61e3c","component_id":"observa-node-h1","content_digest":"ee13b4ca5e9cef4b544dd60c8085c645788d89e614b8fd742890564b64850171","package_name":"@mcphersonai/observa-node","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-node-0.1.0.tgz","role":"verification","source_subtrees":[{"commit":"26e968240b7cb3c560064551213ca756ae89a2ca","git_path":"sdk/contracts","tree":"0a1e1b09b76772a0e8e1b265bfc577aef52259b5"},{"commit":"26e968240b7cb3c560064551213ca756ae89a2ca","git_path":"verification-node","tree":"9e1014c710826aee41ce75808b0079fc754318b3"}]},{"artifact_filename":"mcphersonai-observa-adapter-n8n-0.1.0.tgz","artifact_sha256":"daf644c3cc22f4b588af1f242dd02dd0946b6cfa869db1466da33dfb235871d0","component_id":"observa-adapter-n8n","content_digest":"8b0c33d62cd8a39cc962b03cae80e82ee08ef2daafeb676a5810da6427c1f63c","package_name":"@mcphersonai/observa-adapter-n8n","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-adapter-n8n-0.1.0.tgz","role":"runtime-adapter","source_subtrees":[{"commit":"39918d5ea57604375e27ce44b6303aaade9cb81a","git_path":"runtime-adapters/n8n","tree":"a68bb0b5c062589effe907eb666ee45e0f484551"}]},{"artifact_filename":"mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","artifact_sha256":"5f4bc40bf964255491a21c066d1578b9867b892689c609e4475c53210f7b6b72","component_id":"observa-n8n-h1-binding","content_digest":"d6fb3d97e9ca6d5f06feaa1abc12e0cc9ca904c8b4a00c304dbcadc6f315fec0","package_name":"@mcphersonai/observa-n8n-h1-binding","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","role":"integration-binding","source_subtrees":[{"commit":"cb389b929e9f97fbfb47957615aaf58556db8ea8","git_path":"integrations/n8n-h1","tree":"569247d6084d6e343c4d177d10e7024864be425e"}]},{"artifact_filename":"mcphersonai-observa-domain-generic-0.1.0.tgz","artifact_sha256":"7f326e4b744f8eeaef7d12d781d82a6f8cf8cea5327ed4c9b22c180bd0ab5e04","component_id":"observa-domain-generic","content_digest":"9a839ee4ba687d6a7b531e1a2c318a52b91d4beea250d9d360e04df180a3944c","package_name":"@mcphersonai/observa-domain-generic","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-domain-generic-0.1.0.tgz","role":"domain-contract","source_subtrees":[{"commit":"f73c53a26c9b77e151b4fffe89b657ae31ddd2cb","git_path":"domains/generic","tree":"92a014bb77e41812bc55a79a8a72837ec6d74537"}]},{"artifact_filename":"mcphersonai-observa-hosted-transport-0.1.0.tgz","artifact_sha256":"b6f2ccbbb0526aa08686c8725dd5d2e78aee58e607f15e380170c057a08881e8","component_id":"observa-hosted-transport-client","content_digest":"ca3b9cb0246a9f722138bd446ef1bfb7df42b1981065feb2a551cd42c534f007","package_name":"@mcphersonai/observa-hosted-transport","package_version":"0.1.0","path":"artifacts/mcphersonai-observa-hosted-transport-0.1.0.tgz","role":"transport-client","source_subtrees":[{"commit":"199dd6a87209de625915bad7cf63a359d6d2ff05","git_path":"transport/hosted","tree":"b01763f89bc1fa238fe238e1f47a471b94fb933c"}]}],"dist_tag":"latest","distribution":{"access":"public","dist_tag":"latest","prepared_only":true,"provenance_attestation":"UNAVAILABLE_PRIVATE_SOURCE","published":false,"registry":"https://registry.npmjs.org/","trusted_publishing":"PREPARED_NOT_ACTIVATED"},"files":[{"mode":"0644","path":"README.md","sha256":"e693cb77cc1d3dbe97c20ea5b78390c0d922814eea7b5ba736ab555c812eabed","size_bytes":5810},{"mode":"0644","path":"artifacts/mcphersonai-observa-adapter-n8n-0.1.0.tgz","sha256":"daf644c3cc22f4b588af1f242dd02dd0946b6cfa869db1466da33dfb235871d0","size_bytes":72591},{"mode":"0644","path":"artifacts/mcphersonai-observa-domain-generic-0.1.0.tgz","sha256":"7f326e4b744f8eeaef7d12d781d82a6f8cf8cea5327ed4c9b22c180bd0ab5e04","size_bytes":7558},{"mode":"0644","path":"artifacts/mcphersonai-observa-hosted-transport-0.1.0.tgz","sha256":"b6f2ccbbb0526aa08686c8725dd5d2e78aee58e607f15e380170c057a08881e8","size_bytes":14008},{"mode":"0644","path":"artifacts/mcphersonai-observa-n8n-h1-binding-0.1.0.tgz","sha256":"5f4bc40bf964255491a21c066d1578b9867b892689c609e4475c53210f7b6b72","size_bytes":10441},{"mode":"0644","path":"artifacts/mcphersonai-observa-node-0.1.0.tgz","sha256":"00e96d00c9ed9d8d3ca98cde4b9e14c8eecc9adc360174afb7ca95f03db61e3c","size_bytes":106145},{"mode":"0644","path":"distribution/observa-cli/bin/observa-n8n-hosted.mjs","sha256":"70c520a6c4a2478a60b98bdc2018328c01d1c797c9048f664b507b4ee570632e","size_bytes":5170},{"mode":"0644","path":"distribution/observa-cli/bin/observa.mjs","sha256":"cd1c630182f4bd7fa1dd4323410021ab51c6f6020cd25dfd27e80a7486c73789","size_bytes":15419},{"mode":"0644","path":"distribution/observa-cli/integrations/n8n/observa-external-hook.cjs","sha256":"0caa044f718d6305d60d53a8fb76255b84c7d08ae70ecb7d285a8d1f37c7d3fd","size_bytes":5374},{"mode":"0644","path":"distribution/observa-cli/keys/observa-beta-1.public.json","sha256":"e6f3353b323702df54e96210bd0f1363f89636d2c0b216057698b383ecf40c8c","size_bytes":224},{"mode":"0644","path":"distribution/observa-cli/src/artifact.mjs","sha256":"31c5bf2495a237be149ab3b1bb72a0707d13f342bb438de1604dc06fe7faf71b","size_bytes":5890},{"mode":"0644","path":"distribution/observa-cli/src/config.mjs","sha256":"6935ff8d65887154f6e4527cb99e49dae88252f3f423dcc8e38a7a96b261af85","size_bytes":6279},{"mode":"0644","path":"distribution/observa-cli/src/errors.mjs","sha256":"3ac787dccc3c6a09e7f800ba31e4e3f67fe21f160226a51ed36228d440503c7f","size_bytes":738},{"mode":"0644","path":"distribution/observa-cli/src/hosted-delivery.mjs","sha256":"8deccb19fca28ea4ebb84d2da43c346a216bf958444376a64b06a59336ec6138","size_bytes":6433},{"mode":"0644","path":"distribution/observa-cli/src/index.mjs","sha256":"99a364df116df33fb9ade70b0d6e6ec3729b5bf56922d1daaf57700d44904852","size_bytes":1552},{"mode":"0644","path":"distribution/observa-cli/src/install.mjs","sha256":"2bccc8ca0bfd37382f00d032fa6dedce7ca2b6819019ab5d4c97e8995e58d1bc","size_bytes":18270},{"mode":"0644","path":"distribution/observa-cli/src/lock.mjs","sha256":"0dffd6446a9428fc9f3e45e468988a9b13cfc99a5ad3179a1f1b01029bc5cfbc","size_bytes":2070},{"mode":"0644","path":"distribution/observa-cli/src/manifest-fetch.mjs","sha256":"84932e42f80991c65a2874aaff4a248e387da2868c20a088eb86cc0bbedf0dcc","size_bytes":6881},{"mode":"0644","path":"distribution/observa-cli/src/manifest-schema.mjs","sha256":"eccce81a4bd746805d31ee3a270dfd34083a40746293b1307f58288d0d8d79d0","size_bytes":10092},{"mode":"0644","path":"distribution/observa-cli/src/manifest-verify.mjs","sha256":"94dd7980032fe70636ef96e089cd96aba2ac1307a369ae7ed52aa3c04267f91b","size_bytes":5034},{"mode":"0644","path":"distribution/observa-cli/src/n8n-hook.mjs","sha256":"6ae519f0e59dccd14a6bc6655c65846b1b9084bf28f720b9a5c24bba563d05a0","size_bytes":2916},{"mode":"0644","path":"distribution/observa-cli/src/pair.mjs","sha256":"ce2acc3d335467e7af2531a5950a34c3ed3dacdddb41601df20ff278efe7da63","size_bytes":6266},{"mode":"0644","path":"distribution/observa-cli/src/re-pair.mjs","sha256":"3ccc90a750ae941d9dffd7f8e19be9c0cc404016ee3f442fe5a8ee43abcf9664","size_bytes":6349},{"mode":"0644","path":"distribution/observa-cli/src/service.mjs","sha256":"01fc22e4fc893f58d5eef11d726b4044fe2f1ad7430d9acb322e964b60d246e1","size_bytes":9623},{"mode":"0644","path":"distribution/observa-cli/src/state.mjs","sha256":"07258afc26ec033d471af3a4bca60c1f2c74d898d55d295baa52a5eceaaf2073","size_bytes":3573},{"mode":"0644","path":"distribution/observa-cli/src/status.mjs","sha256":"09dfc6c6e8668c8be4089c0bb6f85c49afdd54479489860c56b03198f011d03e","size_bytes":7928},{"mode":"0644","path":"distribution/observa-cli/src/vocabulary.mjs","sha256":"cc23f5c6e5de932afffab846d8491ceeca61fd6640717c42121e198bf66a2651","size_bytes":2440},{"mode":"0644","path":"package.json","sha256":"a2be6dc2b8b2fa56792180ec6a2f35a00d0a199defc3af67686931e3348fc49a","size_bytes":1094},{"mode":"0644","path":"runtime-adapters/n8n/src/strict-json.mjs","sha256":"d3e88b83d1226878130e9fbfbd33fd29634d4cb0c49b4d6a2b6dbc9ebbdb63e1","size_bytes":5590},{"mode":"0644","path":"sdk/contracts/canonical.mjs","sha256":"b28e8f6a53fe945ff1e2610a1f9d333aa9fa62ffe375e253aeadaed74a5eb72d","size_bytes":14109},{"mode":"0644","path":"sdk/contracts/entry-boundary.mjs","sha256":"78aa76d66bf8606c2bcfe5e50004139fe8c2168fc3a9b653534fc41f2471a4e9","size_bytes":22747},{"mode":"0644","path":"sdk/contracts/errors.mjs","sha256":"d5aa1bbe72f3fa4ba9edf47ad7dc2113df3877fa852251221c8c0abee60545d7","size_bytes":13626},{"mode":"0644","path":"sdk/contracts/stable-primitives.mjs","sha256":"88da8b531a26fc8d1b7d68f622e1e135b0addbf75057fd161b773cb449044c87","size_bytes":5753}],"installation_flow":"npm delivers bytes only; installation requires a signed installation manifest verified by the shipped CLI against the shipped trusted public keys","min_cli_version":"0.1.2","mode":"SHADOW_ONLY","package_name":"@mcpherson-ai/observa-local-node","package_version":"0.1.4","product":"Observa Local Node","profile_id":"observa-local-node-n8n-generic-shadow-beta","record_digest":"d459cab1f65c8fdd45a79dca7a9e21e3c543009e0f45cad7fb99223a1ed4c51c","release_channel":"beta","schema":"observa.release.npm-distribution","schema_version":1}
package/package.json CHANGED
@@ -1,8 +1,12 @@
1
1
  {
2
2
  "name": "@mcpherson-ai/observa-local-node",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Observa Local Node — SHADOW-mode runtime observation and verification for supported workflow runtimes. Installer/orchestrator CLI plus the exact approved component artifacts it composes. Authority NONE; enforcement OFF; invite-only beta.",
5
5
  "license": "UNLICENSED",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/McphersonAI/observa-local-node.git"
9
+ },
6
10
  "type": "module",
7
11
  "engines": {
8
12
  "node": ">=22"
@@ -23,7 +27,7 @@
23
27
  "publishConfig": {
24
28
  "access": "public",
25
29
  "registry": "https://registry.npmjs.org/",
26
- "tag": "beta",
30
+ "tag": "latest",
27
31
  "provenance": false
28
32
  },
29
33
  "observa": {