@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 +35 -19
- package/SHA256SUMS +7 -6
- package/distribution/observa-cli/bin/observa.mjs +52 -10
- package/distribution/observa-cli/src/index.mjs +3 -0
- package/distribution/observa-cli/src/manifest-fetch.mjs +159 -0
- package/distribution/observa-cli/src/vocabulary.mjs +4 -1
- package/npm-distribution-provenance.json +1 -1
- package/package.json +6 -2
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
|
|
12
|
-
manifest issued
|
|
13
|
-
against
|
|
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.
|
|
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
|
|
24
|
+
npm install -g @mcpherson-ai/observa-local-node
|
|
24
25
|
observa --version
|
|
25
|
-
observa
|
|
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
|
-
|
|
29
|
-
|
|
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.
|
|
35
|
-
|
|
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
|
|
56
|
-
|
|
57
|
-
```sh
|
|
58
|
-
observa pair --base-url <HOSTED_BASE_URL> --code-stdin
|
|
59
|
-
```
|
|
69
|
+
## Hosted evidence delivery
|
|
60
70
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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("
|
|
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
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
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
|
+
"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": "
|
|
30
|
+
"tag": "latest",
|
|
27
31
|
"provenance": false
|
|
28
32
|
},
|
|
29
33
|
"observa": {
|