@labacacia/nps-sdk 1.0.0-alpha.5 → 1.0.0-alpha.7

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.
Files changed (145) hide show
  1. package/CHANGELOG.cn.md +29 -5
  2. package/CHANGELOG.md +29 -5
  3. package/LICENSE +0 -0
  4. package/NOTICE +0 -0
  5. package/README.cn.md +8 -13
  6. package/README.md +8 -13
  7. package/dist/nip/index.d.ts +1 -0
  8. package/dist/nip/index.d.ts.map +1 -1
  9. package/dist/nip/index.js +2 -0
  10. package/dist/nip/index.js.map +1 -1
  11. package/dist/nip/reputation-client.d.ts +116 -0
  12. package/dist/nip/reputation-client.d.ts.map +1 -0
  13. package/dist/nip/reputation-client.js +261 -0
  14. package/dist/nip/reputation-client.js.map +1 -0
  15. package/dist/nip/x509/oids.d.ts +9 -10
  16. package/dist/nip/x509/oids.d.ts.map +1 -1
  17. package/dist/nip/x509/oids.js +3 -4
  18. package/dist/nip/x509/oids.js.map +1 -1
  19. package/dist/nwp/anchor-client.d.ts +109 -0
  20. package/dist/nwp/anchor-client.d.ts.map +1 -0
  21. package/dist/nwp/anchor-client.js +279 -0
  22. package/dist/nwp/anchor-client.js.map +1 -0
  23. package/dist/nwp/index.d.ts +1 -1
  24. package/dist/nwp/index.d.ts.map +1 -1
  25. package/dist/nwp/index.js +1 -1
  26. package/dist/nwp/index.js.map +1 -1
  27. package/doc/nps-sdk.core.cn.md +0 -0
  28. package/doc/nps-sdk.core.md +0 -0
  29. package/doc/nps-sdk.ncp.cn.md +0 -0
  30. package/doc/nps-sdk.ncp.md +0 -0
  31. package/doc/nps-sdk.ndp.cn.md +0 -0
  32. package/doc/nps-sdk.ndp.md +0 -0
  33. package/doc/nps-sdk.nop.cn.md +0 -0
  34. package/doc/nps-sdk.nop.md +0 -0
  35. package/doc/overview.cn.md +0 -0
  36. package/doc/overview.md +0 -0
  37. package/package.json +12 -1
  38. package/CONTRIBUTING.cn.md +0 -35
  39. package/CONTRIBUTING.md +0 -35
  40. package/dist/nwp/error-codes.d.ts +0 -42
  41. package/dist/nwp/error-codes.d.ts.map +0 -1
  42. package/dist/nwp/error-codes.js +0 -53
  43. package/dist/nwp/error-codes.js.map +0 -1
  44. package/nip-ca-server/Dockerfile +0 -27
  45. package/nip-ca-server/README.md +0 -45
  46. package/nip-ca-server/db/001_init.sql +0 -25
  47. package/nip-ca-server/docker-compose.yml +0 -29
  48. package/nip-ca-server/package.json +0 -23
  49. package/nip-ca-server/src/ca.ts +0 -155
  50. package/nip-ca-server/src/db.ts +0 -104
  51. package/nip-ca-server/src/index.ts +0 -157
  52. package/nip-ca-server/tsconfig.json +0 -13
  53. package/src/core/anchor-cache.ts +0 -129
  54. package/src/core/cache.ts +0 -93
  55. package/src/core/canonical-json.ts +0 -50
  56. package/src/core/codec.ts +0 -158
  57. package/src/core/codecs/index.ts +0 -5
  58. package/src/core/codecs/ncp-codec.ts +0 -170
  59. package/src/core/codecs/tier1-json-codec.ts +0 -33
  60. package/src/core/codecs/tier2-msgpack-codec.ts +0 -30
  61. package/src/core/crypto-provider.ts +0 -47
  62. package/src/core/exceptions.ts +0 -57
  63. package/src/core/frame-header.ts +0 -282
  64. package/src/core/frame-registry.ts +0 -91
  65. package/src/core/frames.ts +0 -184
  66. package/src/core/index.ts +0 -42
  67. package/src/core/registry.ts +0 -28
  68. package/src/core/status-codes.ts +0 -47
  69. package/src/index.ts +0 -10
  70. package/src/ncp/frames/anchor-frame.ts +0 -87
  71. package/src/ncp/frames/caps-frame.ts +0 -59
  72. package/src/ncp/frames/diff-frame.ts +0 -69
  73. package/src/ncp/frames/error-frame.ts +0 -26
  74. package/src/ncp/frames/hello-frame.ts +0 -50
  75. package/src/ncp/frames/stream-frame.ts +0 -35
  76. package/src/ncp/frames.ts +0 -251
  77. package/src/ncp/handshake.ts +0 -95
  78. package/src/ncp/index.ts +0 -13
  79. package/src/ncp/ncp-error-codes.ts +0 -36
  80. package/src/ncp/ncp-patch-format.ts +0 -16
  81. package/src/ncp/preamble.ts +0 -79
  82. package/src/ncp/registry.ts +0 -15
  83. package/src/ncp/stream-manager.ts +0 -212
  84. package/src/ndp/dns-txt.ts +0 -86
  85. package/src/ndp/frames.ts +0 -124
  86. package/src/ndp/index.ts +0 -8
  87. package/src/ndp/ndp-registry.ts +0 -116
  88. package/src/ndp/registry.ts +0 -12
  89. package/src/ndp/validator.ts +0 -64
  90. package/src/nip/acme/client.ts +0 -185
  91. package/src/nip/acme/index.ts +0 -8
  92. package/src/nip/acme/jws.ts +0 -109
  93. package/src/nip/acme/messages.ts +0 -85
  94. package/src/nip/acme/server.ts +0 -480
  95. package/src/nip/acme/wire.ts +0 -24
  96. package/src/nip/assurance-level.ts +0 -40
  97. package/src/nip/cert-format.ts +0 -9
  98. package/src/nip/error-codes.ts +0 -38
  99. package/src/nip/frames.ts +0 -138
  100. package/src/nip/identity.ts +0 -113
  101. package/src/nip/index.ts +0 -14
  102. package/src/nip/registry.ts +0 -12
  103. package/src/nip/verifier.ts +0 -122
  104. package/src/nip/x509/builder.ts +0 -91
  105. package/src/nip/x509/index.ts +0 -6
  106. package/src/nip/x509/oids.ts +0 -28
  107. package/src/nip/x509/verifier.ts +0 -214
  108. package/src/nop/client.ts +0 -103
  109. package/src/nop/frames.ts +0 -181
  110. package/src/nop/index.ts +0 -7
  111. package/src/nop/models.ts +0 -79
  112. package/src/nop/nop-types.ts +0 -208
  113. package/src/nop/registry.ts +0 -13
  114. package/src/nwp/client.ts +0 -114
  115. package/src/nwp/error-codes.ts +0 -62
  116. package/src/nwp/frames.ts +0 -116
  117. package/src/nwp/index.ts +0 -7
  118. package/src/nwp/registry.ts +0 -11
  119. package/src/setup.ts +0 -32
  120. package/tests/_rfc0002-keys.ts +0 -57
  121. package/tests/core/anchor-cache.test.ts +0 -242
  122. package/tests/core/codec.test.ts +0 -205
  123. package/tests/core/frame-registry.test.ts +0 -46
  124. package/tests/core.test.ts +0 -327
  125. package/tests/ncp/diff-binary-bitset.test.ts +0 -107
  126. package/tests/ncp/e2e-enc-reject.test.ts +0 -93
  127. package/tests/ncp/err-error-frame.test.ts +0 -152
  128. package/tests/ncp/frames.test.ts +0 -359
  129. package/tests/ncp/framing.test.ts +0 -233
  130. package/tests/ncp/hello-frame.test.ts +0 -122
  131. package/tests/ncp/inline-anchor.test.ts +0 -88
  132. package/tests/ncp/preamble.test.ts +0 -93
  133. package/tests/ncp/security.test.ts +0 -184
  134. package/tests/ncp/stream-window.test.ts +0 -167
  135. package/tests/ncp/stream.test.ts +0 -242
  136. package/tests/ncp/version-negotiation.test.ts +0 -123
  137. package/tests/ndp.test.ts +0 -377
  138. package/tests/nip-acme-agent01.test.ts +0 -192
  139. package/tests/nip-x509.test.ts +0 -280
  140. package/tests/nip.test.ts +0 -184
  141. package/tests/nop.test.ts +0 -344
  142. package/tests/nwp.test.ts +0 -237
  143. package/tsconfig.json +0 -20
  144. package/tsup.config.ts +0 -20
  145. package/vitest.config.ts +0 -10
@@ -3,11 +3,10 @@
3
3
  /**
4
4
  * OID constants for NPS X.509 certificates per NPS-RFC-0002 §4.
5
5
  *
6
- * The 1.3.6.1.4.1.99999 arc is provisional pending IANA Private Enterprise
7
- * Number assignment (RFC-0002 §10 OQ-2). All implementations MUST update
8
- * these constants when the official PEN is granted.
6
+ * The 1.3.6.1.4.1.65715 arc is the LabAcacia IANA-assigned Private Enterprise
7
+ * Number (PEN 65715, NPS-CR-0004, 2026-05-08).
9
8
  */
10
- export const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.99999";
9
+ export const LAB_ACACIA_PEN_ARC = "1.3.6.1.4.1.65715";
11
10
  export const EKU_ARC = `${LAB_ACACIA_PEN_ARC}.1`;
12
11
  export const EXTENSION_ARC = `${LAB_ACACIA_PEN_ARC}.2`;
13
12
  // ── EKUs (NPS-RFC-0002 §4.1) ─────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"oids.js","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,OAAO,GAAc,GAAG,kBAAkB,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAQ,GAAG,kBAAkB,IAAI,CAAC;AAE5D,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAU,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAW,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,OAAO,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,aAAa,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC"}
1
+ {"version":3,"file":"oids.js","sourceRoot":"","sources":["../../../src/nip/x509/oids.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACtD,MAAM,CAAC,MAAM,OAAO,GAAc,GAAG,kBAAkB,IAAI,CAAC;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAQ,GAAG,kBAAkB,IAAI,CAAC;AAE5D,gFAAgF;AAChF,MAAM,CAAC,MAAM,kBAAkB,GAAU,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAW,GAAG,OAAO,IAAI,CAAC;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,OAAO,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,aAAa,IAAI,CAAC;AAExD,gFAAgF;AAChF,MAAM,CAAC,MAAM,OAAO,GAAG,aAAa,CAAC;AAErC,gFAAgF;AAChF,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC"}
@@ -0,0 +1,109 @@
1
+ export interface MemberInfo {
2
+ nid: string;
3
+ node_roles: string[];
4
+ activation_mode: string;
5
+ child_anchor?: boolean;
6
+ member_count?: number;
7
+ tags?: string[];
8
+ joined_at?: string;
9
+ last_seen?: string;
10
+ capabilities?: unknown;
11
+ metrics?: unknown;
12
+ }
13
+ export interface TopologySnapshot {
14
+ version: number;
15
+ anchor_nid: string;
16
+ cluster_size: number;
17
+ members: MemberInfo[];
18
+ truncated?: boolean;
19
+ }
20
+ export interface TopologyFilter {
21
+ tags_any?: string[];
22
+ tags_all?: string[];
23
+ node_roles?: string[];
24
+ }
25
+ export interface MemberChanges {
26
+ node_roles?: string[];
27
+ activation_mode?: string;
28
+ tags?: string[];
29
+ member_count?: number;
30
+ last_seen?: string;
31
+ capabilities?: unknown;
32
+ metrics?: unknown;
33
+ }
34
+ /** Discriminated union for topology stream events (NPS-2 §12.2). */
35
+ export type TopologyEvent = {
36
+ kind: "member_joined";
37
+ version: number;
38
+ member: MemberInfo;
39
+ } | {
40
+ kind: "member_left";
41
+ version: number;
42
+ nid: string;
43
+ } | {
44
+ kind: "member_updated";
45
+ version: number;
46
+ nid: string;
47
+ changes: MemberChanges;
48
+ } | {
49
+ kind: "anchor_state";
50
+ version: number;
51
+ field: string;
52
+ details?: unknown;
53
+ } | {
54
+ kind: "resync_required";
55
+ version: 0;
56
+ reason: string;
57
+ };
58
+ /**
59
+ * Surfaces an Anchor-side topology error to the caller. `nwpErrorCode` matches
60
+ * one of the NWP-TOPOLOGY-* codes; `npsStatus` is the NPS status code.
61
+ */
62
+ export declare class AnchorTopologyError extends Error {
63
+ readonly nwpErrorCode: string;
64
+ readonly npsStatus: string;
65
+ constructor(nwpErrorCode: string, npsStatus: string, message?: string);
66
+ }
67
+ /**
68
+ * Typed client for an Anchor Node's reserved query endpoints.
69
+ *
70
+ * ```ts
71
+ * const client = new AnchorNodeClient("http://anchor.local:8080", "/anchor");
72
+ *
73
+ * const snap = await client.getSnapshot({ scope: "cluster" });
74
+ * for await (const ev of client.subscribe({ sinceVersion: snap.version })) {
75
+ * console.log(ev);
76
+ * }
77
+ * ```
78
+ */
79
+ export declare class AnchorNodeClient {
80
+ private readonly baseUrl;
81
+ private readonly pathPrefix;
82
+ constructor(baseUrl: string, pathPrefix?: string);
83
+ /**
84
+ * Fetch the current cluster topology (NPS-2 §12.1).
85
+ *
86
+ * POSTs a `topology.snapshot` query and returns the first `data` element of
87
+ * the response CapsFrame.
88
+ */
89
+ getSnapshot(options?: {
90
+ scope?: "cluster" | "member";
91
+ include?: string[];
92
+ depth?: number;
93
+ targetNid?: string;
94
+ }): Promise<TopologySnapshot>;
95
+ /**
96
+ * Subscribe to live topology changes (NPS-2 §12.2).
97
+ *
98
+ * The first NDJSON line (subscription ack) is automatically skipped. Each
99
+ * subsequent line is parsed into a `TopologyEvent`. The generator stops after
100
+ * a `resync_required` event — callers MUST issue a fresh `getSnapshot` before
101
+ * resubscribing.
102
+ */
103
+ subscribe(options?: {
104
+ filter?: TopologyFilter;
105
+ sinceVersion?: number;
106
+ scope?: "cluster" | "member";
107
+ }): AsyncGenerator<TopologyEvent>;
108
+ }
109
+ //# sourceMappingURL=anchor-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-client.d.ts","sourceRoot":"","sources":["../../src/nwp/anchor-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ // Copyright 2026 INNO LOTUS PTY LTD
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * AnchorNodeClient — typed HTTP client for an Anchor Node's reserved query
5
+ * types (NPS-2 §12 — `topology.snapshot` and `topology.stream`).
6
+ *
7
+ * Uses `fetch` only; no extra dependencies.
8
+ */
9
+ // ── Wire constants ────────────────────────────────────────────────────────────
10
+ const SCOPE_CLUSTER = "cluster";
11
+ const SCOPE_MEMBER = "member";
12
+ const TYPE_SNAPSHOT = "topology.snapshot";
13
+ const TYPE_STREAM = "topology.stream";
14
+ const EVENT_MEMBER_JOINED = "member_joined";
15
+ const EVENT_MEMBER_LEFT = "member_left";
16
+ const EVENT_MEMBER_UPDATED = "member_updated";
17
+ const EVENT_ANCHOR_STATE = "anchor_state";
18
+ const EVENT_RESYNC_REQUIRED = "resync_required";
19
+ /**
20
+ * Surfaces an Anchor-side topology error to the caller. `nwpErrorCode` matches
21
+ * one of the NWP-TOPOLOGY-* codes; `npsStatus` is the NPS status code.
22
+ */
23
+ export class AnchorTopologyError extends Error {
24
+ nwpErrorCode;
25
+ npsStatus;
26
+ constructor(nwpErrorCode, npsStatus, message) {
27
+ super(message);
28
+ this.nwpErrorCode = nwpErrorCode;
29
+ this.npsStatus = npsStatus;
30
+ this.name = "AnchorTopologyError";
31
+ }
32
+ }
33
+ // ── AnchorNodeClient ──────────────────────────────────────────────────────────
34
+ /**
35
+ * Typed client for an Anchor Node's reserved query endpoints.
36
+ *
37
+ * ```ts
38
+ * const client = new AnchorNodeClient("http://anchor.local:8080", "/anchor");
39
+ *
40
+ * const snap = await client.getSnapshot({ scope: "cluster" });
41
+ * for await (const ev of client.subscribe({ sinceVersion: snap.version })) {
42
+ * console.log(ev);
43
+ * }
44
+ * ```
45
+ */
46
+ export class AnchorNodeClient {
47
+ baseUrl;
48
+ pathPrefix;
49
+ constructor(baseUrl, pathPrefix = "") {
50
+ // Normalise trailing slashes once.
51
+ this.baseUrl = baseUrl.replace(/\/$/, "");
52
+ this.pathPrefix = pathPrefix.replace(/\/$/, "");
53
+ }
54
+ // ── topology.snapshot ──────────────────────────────────────────────────────
55
+ /**
56
+ * Fetch the current cluster topology (NPS-2 §12.1).
57
+ *
58
+ * POSTs a `topology.snapshot` query and returns the first `data` element of
59
+ * the response CapsFrame.
60
+ */
61
+ async getSnapshot(options) {
62
+ const scope = options?.scope ?? "cluster";
63
+ const include = options?.include ?? ["members"];
64
+ const depth = options?.depth;
65
+ const targetNid = options?.targetNid;
66
+ const topology = {
67
+ scope: scope === "cluster" ? SCOPE_CLUSTER : SCOPE_MEMBER,
68
+ include,
69
+ };
70
+ if (depth !== undefined)
71
+ topology["depth"] = depth;
72
+ if (targetNid !== undefined)
73
+ topology["target_nid"] = targetNid;
74
+ const body = { type: TYPE_SNAPSHOT, topology };
75
+ const url = `${this.baseUrl}${this.pathPrefix}/query`;
76
+ const res = await fetch(url, {
77
+ method: "POST",
78
+ headers: { "Content-Type": "application/json", "Accept": "application/json" },
79
+ body: JSON.stringify(body),
80
+ });
81
+ if (!res.ok) {
82
+ throw await buildFetchError("topology.snapshot", res);
83
+ }
84
+ const caps = await res.json();
85
+ const rows = caps.data;
86
+ if (!Array.isArray(rows) || rows.length !== 1) {
87
+ throw new Error(`topology.snapshot expected exactly 1 data row; got ${Array.isArray(rows) ? rows.length : "non-array"}.`);
88
+ }
89
+ return rows[0];
90
+ }
91
+ // ── topology.stream ────────────────────────────────────────────────────────
92
+ /**
93
+ * Subscribe to live topology changes (NPS-2 §12.2).
94
+ *
95
+ * The first NDJSON line (subscription ack) is automatically skipped. Each
96
+ * subsequent line is parsed into a `TopologyEvent`. The generator stops after
97
+ * a `resync_required` event — callers MUST issue a fresh `getSnapshot` before
98
+ * resubscribing.
99
+ */
100
+ async *subscribe(options) {
101
+ const scope = options?.scope ?? "cluster";
102
+ const filter = options?.filter;
103
+ const sinceVersion = options?.sinceVersion;
104
+ const topology = {
105
+ scope: scope === "cluster" ? SCOPE_CLUSTER : SCOPE_MEMBER,
106
+ };
107
+ if (filter !== undefined)
108
+ topology["filter"] = filter;
109
+ if (sinceVersion !== undefined)
110
+ topology["since_version"] = sinceVersion;
111
+ const body = {
112
+ type: TYPE_STREAM,
113
+ action: "subscribe",
114
+ stream_id: crypto.randomUUID(),
115
+ topology,
116
+ };
117
+ const url = `${this.baseUrl}${this.pathPrefix}/subscribe`;
118
+ const res = await fetch(url, {
119
+ method: "POST",
120
+ headers: {
121
+ "Content-Type": "application/json",
122
+ "Accept": "application/x-ndjson",
123
+ },
124
+ body: JSON.stringify(body),
125
+ });
126
+ if (!res.ok) {
127
+ throw await buildFetchError("topology.stream", res);
128
+ }
129
+ if (res.body === null)
130
+ return;
131
+ let ackSkipped = false;
132
+ for await (const line of readNdjsonLines(res.body)) {
133
+ // Skip the first non-empty line (subscription ack).
134
+ if (!ackSkipped) {
135
+ ackSkipped = true;
136
+ continue;
137
+ }
138
+ // Mid-stream protocol error: { status, error } with no event_type.
139
+ const maybeErr = tryParseStreamError(line);
140
+ if (maybeErr !== null)
141
+ throw maybeErr;
142
+ const ev = parseTopologyEvent(line);
143
+ if (ev === null)
144
+ continue;
145
+ yield ev;
146
+ if (ev.kind === EVENT_RESYNC_REQUIRED)
147
+ return;
148
+ }
149
+ }
150
+ }
151
+ // ── NDJSON line reader ────────────────────────────────────────────────────────
152
+ /**
153
+ * Reads a `ReadableStream<Uint8Array>` and yields complete, non-empty lines.
154
+ * Lines are split on `\n`; trailing `\r` is stripped.
155
+ */
156
+ async function* readNdjsonLines(body) {
157
+ const decoder = new TextDecoder();
158
+ let buffer = "";
159
+ const reader = body.getReader();
160
+ try {
161
+ while (true) {
162
+ const { done, value } = await reader.read();
163
+ if (done)
164
+ break;
165
+ buffer += decoder.decode(value, { stream: true });
166
+ let newlineIdx;
167
+ while ((newlineIdx = buffer.indexOf("\n")) !== -1) {
168
+ const raw = buffer.slice(0, newlineIdx);
169
+ buffer = buffer.slice(newlineIdx + 1);
170
+ const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
171
+ if (line.length > 0)
172
+ yield line;
173
+ }
174
+ }
175
+ // Flush decoder.
176
+ buffer += decoder.decode();
177
+ const remaining = buffer.endsWith("\r") ? buffer.slice(0, -1) : buffer;
178
+ if (remaining.length > 0)
179
+ yield remaining;
180
+ }
181
+ finally {
182
+ reader.releaseLock();
183
+ }
184
+ }
185
+ // ── Parsing helpers ───────────────────────────────────────────────────────────
186
+ /** Returns an `AnchorTopologyError` if the line is an error frame, else null. */
187
+ function tryParseStreamError(line) {
188
+ try {
189
+ const obj = JSON.parse(line);
190
+ if (typeof obj !== "object" || obj === null)
191
+ return null;
192
+ if ("event_type" in obj)
193
+ return null; // It's a regular event line.
194
+ if (typeof obj["error"] !== "string")
195
+ return null;
196
+ if (typeof obj["status"] !== "string")
197
+ return null;
198
+ const msg = typeof obj["message"] === "string" ? obj["message"] : undefined;
199
+ return new AnchorTopologyError(obj["error"], obj["status"], msg);
200
+ }
201
+ catch {
202
+ return null;
203
+ }
204
+ }
205
+ /** Parses one NDJSON event line into a `TopologyEvent`, or null if unrecognised. */
206
+ function parseTopologyEvent(line) {
207
+ let obj;
208
+ try {
209
+ obj = JSON.parse(line);
210
+ }
211
+ catch {
212
+ return null;
213
+ }
214
+ if (typeof obj !== "object" || obj === null)
215
+ return null;
216
+ const eventType = obj["event_type"];
217
+ if (typeof eventType !== "string")
218
+ return null;
219
+ const version = typeof obj["seq"] === "number" ? obj["seq"] : 0;
220
+ const payload = (obj["payload"] ?? {});
221
+ switch (eventType) {
222
+ case EVENT_MEMBER_JOINED:
223
+ return {
224
+ kind: "member_joined",
225
+ version,
226
+ member: payload,
227
+ };
228
+ case EVENT_MEMBER_LEFT:
229
+ return {
230
+ kind: "member_left",
231
+ version,
232
+ nid: typeof payload["nid"] === "string" ? payload["nid"] : "",
233
+ };
234
+ case EVENT_MEMBER_UPDATED:
235
+ return {
236
+ kind: "member_updated",
237
+ version,
238
+ nid: typeof payload["nid"] === "string" ? payload["nid"] : "",
239
+ changes: (payload["changes"] ?? {}),
240
+ };
241
+ case EVENT_ANCHOR_STATE:
242
+ return {
243
+ kind: "anchor_state",
244
+ version,
245
+ field: typeof payload["field"] === "string" ? payload["field"] : "",
246
+ details: payload["details"],
247
+ };
248
+ case EVENT_RESYNC_REQUIRED:
249
+ return {
250
+ kind: "resync_required",
251
+ version: 0,
252
+ reason: typeof payload["reason"] === "string" ? payload["reason"] : "unknown",
253
+ };
254
+ default:
255
+ return null;
256
+ }
257
+ }
258
+ /** Builds an `AnchorTopologyError` from a non-ok HTTP response. */
259
+ async function buildFetchError(operation, res) {
260
+ let body;
261
+ try {
262
+ body = await res.text();
263
+ }
264
+ catch {
265
+ body = "";
266
+ }
267
+ try {
268
+ const obj = JSON.parse(body);
269
+ if (typeof obj === "object" && obj !== null &&
270
+ typeof obj["error"] === "string" &&
271
+ typeof obj["status"] === "string") {
272
+ const msg = typeof obj["message"] === "string" ? obj["message"] : body;
273
+ return new AnchorTopologyError(obj["error"], obj["status"], msg);
274
+ }
275
+ }
276
+ catch { /* fall through */ }
277
+ return new AnchorTopologyError("UNKNOWN", `HTTP-${res.status}`, `${operation} returned ${res.status}: ${body}`);
278
+ }
279
+ //# sourceMappingURL=anchor-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-client.js","sourceRoot":"","sources":["../../src/nwp/anchor-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export * from "./frames.js";
2
2
  export * from "./registry.js";
3
3
  export * from "./client.js";
4
- export * as NwpErrorCodes from "./error-codes.js";
4
+ export * from "./anchor-client.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
package/dist/nwp/index.js CHANGED
@@ -3,5 +3,5 @@
3
3
  export * from "./frames.js";
4
4
  export * from "./registry.js";
5
5
  export * from "./client.js";
6
- export * as NwpErrorCodes from "./error-codes.js";
6
+ export * from "./anchor-client.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nwp/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,sCAAsC;AAEtC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/doc/overview.md CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@labacacia/nps-sdk",
3
- "version": "1.0.0-alpha.5",
3
+ "version": "1.0.0-alpha.7",
4
4
  "description": "TypeScript SDK for the Neural Protocol Suite (NPS) — NCP, NWP, NIP, NDP, NOP",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -37,10 +37,21 @@
37
37
  },
38
38
  "scripts": {
39
39
  "build": "tsc",
40
+ "prepack": "npm run build && node scripts/verify-pack.mjs",
40
41
  "test": "vitest run",
41
42
  "test:watch": "vitest",
42
43
  "typecheck": "tsc --noEmit"
43
44
  },
45
+ "files": [
46
+ "dist/",
47
+ "doc/",
48
+ "README.md",
49
+ "README.cn.md",
50
+ "CHANGELOG.md",
51
+ "CHANGELOG.cn.md",
52
+ "LICENSE",
53
+ "NOTICE"
54
+ ],
44
55
  "repository": {
45
56
  "type": "git",
46
57
  "url": "https://github.com/labacacia/NPS-sdk-ts.git"
@@ -1,35 +0,0 @@
1
- [English Version](./CONTRIBUTING.md) | 中文版
2
-
3
- # 为 NPS 贡献代码
4
-
5
- 感谢你有兴趣为 Neural Protocol Suite 做出贡献。
6
-
7
- ## Issue 前缀
8
-
9
- | 前缀 | 用途 |
10
- |------|------|
11
- | `spec:` | 规范问题与设计讨论 |
12
- | `impl:` | 实现 Bug 与修复 |
13
- | `sdk:` | SDK 相关(Python / TypeScript 等) |
14
- | `docs:` | 文档改进 |
15
-
16
- ## 工作流
17
-
18
- 1. 任何非平凡的变更先开 Issue
19
- 2. Fork 仓库并创建分支:`feature/your-feature` 或 `fix/your-fix`
20
- 3. 提交 Pull Request 并关联对应的 Issue
21
-
22
- ## 规范变更
23
-
24
- 对 `spec/` 目录下文件的变更必须先开讨论 Issue 才能接受 PR。
25
- 涉及线缆格式或帧结构的规范变更必须同时做版本号升级。
26
-
27
- ## 代码风格
28
-
29
- - **C# / .NET**:遵循 Microsoft 标准 C# 约定,开启 Nullable
30
- - **Python**:PEP 8,必须带类型标注
31
- - **TypeScript**:开启严格模式
32
-
33
- ## 许可证
34
-
35
- 一旦提交贡献,你即同意贡献内容按 Apache 2.0 许可证授权。
package/CONTRIBUTING.md DELETED
@@ -1,35 +0,0 @@
1
- English | [中文版](./CONTRIBUTING.cn.md)
2
-
3
- # Contributing to NPS
4
-
5
- Thank you for your interest in contributing to the Neural Protocol Suite.
6
-
7
- ## Issue Prefixes
8
-
9
- | Prefix | Usage |
10
- |--------|-------|
11
- | `spec:` | Specification questions and design discussions |
12
- | `impl:` | Implementation bugs and fixes |
13
- | `sdk:` | SDK (Python / TypeScript) related |
14
- | `docs:` | Documentation improvements |
15
-
16
- ## Workflow
17
-
18
- 1. Open an Issue first for any non-trivial change
19
- 2. Fork the repo and create a branch: `feature/your-feature` or `fix/your-fix`
20
- 3. Submit a Pull Request referencing the Issue
21
-
22
- ## Spec Changes
23
-
24
- Changes to files under `spec/` require a discussion Issue before a PR is accepted.
25
- Spec changes that affect wire format or frame structure require a version bump.
26
-
27
- ## Code Style
28
-
29
- - **C# / .NET**: Follow standard Microsoft C# conventions, nullable enabled
30
- - **Python**: PEP 8, type hints required
31
- - **TypeScript**: Strict mode enabled
32
-
33
- ## License
34
-
35
- By contributing, you agree your contributions will be licensed under Apache 2.0.
@@ -1,42 +0,0 @@
1
- /** NWP error code wire constants — mirror of `spec/error-codes.md` NWP section. */
2
- export declare const AUTH_NID_SCOPE_VIOLATION = "NWP-AUTH-NID-SCOPE-VIOLATION";
3
- export declare const AUTH_NID_EXPIRED = "NWP-AUTH-NID-EXPIRED";
4
- export declare const AUTH_NID_REVOKED = "NWP-AUTH-NID-REVOKED";
5
- export declare const AUTH_NID_UNTRUSTED_ISSUER = "NWP-AUTH-NID-UNTRUSTED-ISSUER";
6
- export declare const AUTH_NID_CAPABILITY_MISSING = "NWP-AUTH-NID-CAPABILITY-MISSING";
7
- export declare const AUTH_ASSURANCE_TOO_LOW = "NWP-AUTH-ASSURANCE-TOO-LOW";
8
- export declare const AUTH_REPUTATION_BLOCKED = "NWP-AUTH-REPUTATION-BLOCKED";
9
- export declare const QUERY_FILTER_INVALID = "NWP-QUERY-FILTER-INVALID";
10
- export declare const QUERY_FIELD_UNKNOWN = "NWP-QUERY-FIELD-UNKNOWN";
11
- export declare const QUERY_CURSOR_INVALID = "NWP-QUERY-CURSOR-INVALID";
12
- export declare const QUERY_REGEX_UNSAFE = "NWP-QUERY-REGEX-UNSAFE";
13
- export declare const QUERY_VECTOR_UNSUPPORTED = "NWP-QUERY-VECTOR-UNSUPPORTED";
14
- export declare const QUERY_AGGREGATE_UNSUPPORTED = "NWP-QUERY-AGGREGATE-UNSUPPORTED";
15
- export declare const QUERY_AGGREGATE_INVALID = "NWP-QUERY-AGGREGATE-INVALID";
16
- export declare const QUERY_STREAM_UNSUPPORTED = "NWP-QUERY-STREAM-UNSUPPORTED";
17
- export declare const ACTION_NOT_FOUND = "NWP-ACTION-NOT-FOUND";
18
- export declare const ACTION_PARAMS_INVALID = "NWP-ACTION-PARAMS-INVALID";
19
- export declare const ACTION_IDEMPOTENCY_CONFLICT = "NWP-ACTION-IDEMPOTENCY-CONFLICT";
20
- export declare const TASK_NOT_FOUND = "NWP-TASK-NOT-FOUND";
21
- export declare const TASK_ALREADY_CANCELLED = "NWP-TASK-ALREADY-CANCELLED";
22
- export declare const TASK_ALREADY_COMPLETED = "NWP-TASK-ALREADY-COMPLETED";
23
- export declare const TASK_ALREADY_FAILED = "NWP-TASK-ALREADY-FAILED";
24
- export declare const SUBSCRIBE_STREAM_NOT_FOUND = "NWP-SUBSCRIBE-STREAM-NOT-FOUND";
25
- export declare const SUBSCRIBE_LIMIT_EXCEEDED = "NWP-SUBSCRIBE-LIMIT-EXCEEDED";
26
- export declare const SUBSCRIBE_FILTER_UNSUPPORTED = "NWP-SUBSCRIBE-FILTER-UNSUPPORTED";
27
- export declare const SUBSCRIBE_INTERRUPTED = "NWP-SUBSCRIBE-INTERRUPTED";
28
- export declare const SUBSCRIBE_SEQ_TOO_OLD = "NWP-SUBSCRIBE-SEQ-TOO-OLD";
29
- export declare const BUDGET_EXCEEDED = "NWP-BUDGET-EXCEEDED";
30
- export declare const DEPTH_EXCEEDED = "NWP-DEPTH-EXCEEDED";
31
- export declare const GRAPH_CYCLE = "NWP-GRAPH-CYCLE";
32
- export declare const NODE_UNAVAILABLE = "NWP-NODE-UNAVAILABLE";
33
- export declare const RATE_LIMIT_EXCEEDED = "NWP-RATE-LIMIT-EXCEEDED";
34
- export declare const MANIFEST_VERSION_UNSUPPORTED = "NWP-MANIFEST-VERSION-UNSUPPORTED";
35
- export declare const MANIFEST_NODE_TYPE_REMOVED = "NWP-MANIFEST-NODE-TYPE-REMOVED";
36
- export declare const MANIFEST_NODE_TYPE_UNKNOWN = "NWP-MANIFEST-NODE-TYPE-UNKNOWN";
37
- export declare const TOPOLOGY_UNAUTHORIZED = "NWP-TOPOLOGY-UNAUTHORIZED";
38
- export declare const TOPOLOGY_UNSUPPORTED_SCOPE = "NWP-TOPOLOGY-UNSUPPORTED-SCOPE";
39
- export declare const TOPOLOGY_DEPTH_UNSUPPORTED = "NWP-TOPOLOGY-DEPTH-UNSUPPORTED";
40
- export declare const TOPOLOGY_FILTER_UNSUPPORTED = "NWP-TOPOLOGY-FILTER-UNSUPPORTED";
41
- export declare const RESERVED_TYPE_UNSUPPORTED = "NWP-RESERVED-TYPE-UNSUPPORTED";
42
- //# sourceMappingURL=error-codes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-codes.d.ts","sourceRoot":"","sources":["../../src/nwp/error-codes.ts"],"names":[],"mappings":"AAGA,mFAAmF;AAGnF,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAC1E,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,yBAAyB,kCAAoC,CAAC;AAC3E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAC7E,eAAO,MAAM,sBAAsB,+BAAoC,CAAC;AACxE,eAAO,MAAM,uBAAuB,gCAAoC,CAAC;AAGzE,eAAO,MAAM,oBAAoB,6BAAoC,CAAC;AACtE,eAAO,MAAM,mBAAmB,4BAAoC,CAAC;AACrE,eAAO,MAAM,oBAAoB,6BAAoC,CAAC;AACtE,eAAO,MAAM,kBAAkB,2BAAoC,CAAC;AACpE,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAC1E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAC7E,eAAO,MAAM,uBAAuB,gCAAoC,CAAC;AACzE,eAAO,MAAM,wBAAwB,iCAAoC,CAAC;AAG1E,eAAO,MAAM,gBAAgB,yBAAoC,CAAC;AAClE,eAAO,MAAM,qBAAqB,8BAAoC,CAAC;AACvE,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAG7E,eAAO,MAAM,cAAc,uBAA+B,CAAC;AAC3D,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,mBAAmB,4BAA+B,CAAC;AAGhE,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAC7E,eAAO,MAAM,wBAAwB,iCAAqC,CAAC;AAC3E,eAAO,MAAM,4BAA4B,qCAAqC,CAAC;AAC/E,eAAO,MAAM,qBAAqB,8BAAqC,CAAC;AACxE,eAAO,MAAM,qBAAqB,8BAAqC,CAAC;AAGxE,eAAO,MAAM,eAAe,wBAA6B,CAAC;AAC1D,eAAO,MAAM,cAAc,uBAA6B,CAAC;AACzD,eAAO,MAAM,WAAW,oBAA6B,CAAC;AACtD,eAAO,MAAM,gBAAgB,yBAA6B,CAAC;AAC3D,eAAO,MAAM,mBAAmB,4BAA6B,CAAC;AAG9D,eAAO,MAAM,4BAA4B,qCAAqC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAC7E,eAAO,MAAM,0BAA0B,mCAAqC,CAAC;AAG7E,eAAO,MAAM,qBAAqB,8BAAoC,CAAC;AACvE,eAAO,MAAM,0BAA0B,mCAAoC,CAAC;AAC5E,eAAO,MAAM,0BAA0B,mCAAoC,CAAC;AAC5E,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAG7E,eAAO,MAAM,yBAAyB,kCAAkC,CAAC"}