camstack 1.2.97 → 1.2.98

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-CbBk_3GJ.mjs
14525
+ // ../types/dist/sleep-BQJlnUOJ.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-MKOPVONP.js";
4
+ } from "./chunk-GW5K6RH3.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-PPFRDC5W.js");
41
+ await import("./launcher-VHGRUBGI.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-PPFRDC5W.js");
86
+ await import("./launcher-VHGRUBGI.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-BRZ4GUUB.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-EV3TAGEL.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-MKOPVONP.js";
8
+ } from "./chunk-GW5K6RH3.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,
@@ -107513,9 +107513,9 @@ var require_event_category_BaEgqJNv = __commonJS({
107513
107513
  }
107514
107514
  });
107515
107515
 
107516
- // ../types/dist/sleep-BtIF8lWc.js
107517
- var require_sleep_BtIF8lWc = __commonJS({
107518
- "../types/dist/sleep-BtIF8lWc.js"(exports) {
107516
+ // ../types/dist/sleep-BCUreN6s.js
107517
+ var require_sleep_BCUreN6s = __commonJS({
107518
+ "../types/dist/sleep-BCUreN6s.js"(exports) {
107519
107519
  "use strict";
107520
107520
  var require_event_category = require_event_category_BaEgqJNv();
107521
107521
  var zod = require_zod();
@@ -108507,6 +108507,7 @@ var require_sleep_BtIF8lWc = __commonJS({
108507
108507
  }
108508
108508
  };
108509
108509
  var DATAPLANE_SECRET_HEADER = "x-camstack-dataplane-secret";
108510
+ var SHARE_VIEW_KINDS = ["grid-view", "events-view"];
108510
108511
  var CamProfileSchema = zod.z.enum([
108511
108512
  "high",
108512
108513
  "mid",
@@ -110875,6 +110876,12 @@ var require_sleep_BtIF8lWc = __commonJS({
110875
110876
  return ReadinessTimeoutError;
110876
110877
  }
110877
110878
  });
110879
+ Object.defineProperty(exports, "SHARE_VIEW_KINDS", {
110880
+ enumerable: true,
110881
+ get: function() {
110882
+ return SHARE_VIEW_KINDS;
110883
+ }
110884
+ });
110878
110885
  Object.defineProperty(exports, "StreamSourceEntrySchema", {
110879
110886
  enumerable: true,
110880
110887
  get: function() {
@@ -111196,7 +111203,7 @@ var require_addon = __commonJS({
111196
111203
  "use strict";
111197
111204
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
111198
111205
  var require_event_category = require_event_category_BaEgqJNv();
111199
- var require_sleep = require_sleep_BtIF8lWc();
111206
+ var require_sleep = require_sleep_BCUreN6s();
111200
111207
  var require_err_msg = require_err_msg_COpsHMw2();
111201
111208
  var CAP_INPUT_DEFAULTS = Object.freeze({
111202
111209
  "addons": { "getLogs": { "limit": 100 } },
@@ -118080,9 +118087,9 @@ var require_dist2 = __commonJS({
118080
118087
  }
118081
118088
  });
118082
118089
 
118083
- // ../system/dist/manifest-system-deps-CdIVy85V.js
118084
- var require_manifest_system_deps_CdIVy85V = __commonJS({
118085
- "../system/dist/manifest-system-deps-CdIVy85V.js"(exports) {
118090
+ // ../system/dist/manifest-system-deps-DvY1bY_n.js
118091
+ var require_manifest_system_deps_DvY1bY_n = __commonJS({
118092
+ "../system/dist/manifest-system-deps-DvY1bY_n.js"(exports) {
118086
118093
  "use strict";
118087
118094
  var require_chunk = require_chunk_Cek0wNdY();
118088
118095
  require_hub_cap_forward_DmHNjbB0();
@@ -118730,7 +118737,8 @@ var require_manifest_system_deps_CdIVy85V = __commonJS({
118730
118737
  prefix,
118731
118738
  access: entry.access,
118732
118739
  baseUrl,
118733
- secret
118740
+ secret,
118741
+ ...entry.share !== void 0 ? { share: entry.share } : {}
118734
118742
  }));
118735
118743
  args.sink?.set(args.addonId, endpoints);
118736
118744
  };
@@ -118740,7 +118748,8 @@ var require_manifest_system_deps_CdIVy85V = __commonJS({
118740
118748
  await ensureServer();
118741
118749
  served.set(prefix, {
118742
118750
  access: options.access,
118743
- handler: options.handler
118751
+ handler: options.handler,
118752
+ ...options.share !== void 0 ? { share: options.share } : {}
118744
118753
  });
118745
118754
  publish();
118746
118755
  args.logger.info("data-plane endpoint served", { meta: {
@@ -130180,7 +130189,7 @@ var require_dist3 = __commonJS({
130180
130189
  var require_builtins_winston_logging_index = require_winston_logging();
130181
130190
  var require_file_data_plane = require_file_data_plane_DO8KbxCe();
130182
130191
  var require_tls$1 = require_tls_BxQlomxd();
130183
- var require_manifest_system_deps = require_manifest_system_deps_CdIVy85V();
130192
+ var require_manifest_system_deps = require_manifest_system_deps_DvY1bY_n();
130184
130193
  var require_resource_monitor = require_resource_monitor_CdnzxBLP();
130185
130194
  var require_custom_action_registry = require_custom_action_registry_jY0NOZK8();
130186
130195
  var zod = require_zod();
@@ -211270,7 +211279,7 @@ var require_dist4 = __commonJS({
211270
211279
  "use strict";
211271
211280
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
211272
211281
  var require_event_category = require_event_category_BaEgqJNv();
211273
- var require_sleep = require_sleep_BtIF8lWc();
211282
+ var require_sleep = require_sleep_BCUreN6s();
211274
211283
  var require_canonical_hash = require_canonical_hash_DNV8S5ET();
211275
211284
  var require_enums2 = require_enums();
211276
211285
  var require_err_msg = require_err_msg_COpsHMw2();
@@ -240214,7 +240223,15 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
240214
240223
  if (!Class) throw new Error(`no device class registered for type "${saved.type}"`);
240215
240224
  if (saved.parentDeviceId !== null && !restored.has(saved.parentDeviceId)) throw new Error(`parent device ${saved.parentDeviceId} not restored`);
240216
240225
  await this.healSavedConfig(saved, savedDevices);
240217
- await this.ctx.kernel.devices.create(saved.stableId, Class, {}, saved.parentDeviceId);
240226
+ try {
240227
+ await this.ctx.kernel.devices.create(saved.stableId, Class, {}, saved.parentDeviceId);
240228
+ } catch (err) {
240229
+ if (!(await this.ctx.kernel.devices.getAll()).some((device2) => device2.stableId === saved.stableId)) throw err;
240230
+ this.ctx.logger.debug("Restore row came to life during its own dial \u2014 kept", { tags: {
240231
+ deviceId: saved.id,
240232
+ stableId: saved.stableId
240233
+ } });
240234
+ }
240218
240235
  restored.add(saved.id);
240219
240236
  };
240220
240237
  const topLevel = savedDevices.filter((saved) => saved.parentDeviceId === null);
@@ -255389,6 +255406,7 @@ ${recipe.triggers.map((t, i) => emitTrigger(t, i)).join("\n\n")}
255389
255406
  exports.SCOPE_PRESETS = SCOPE_PRESETS;
255390
255407
  exports.SENSOR_FEATURES = SENSOR_FEATURES;
255391
255408
  exports.SENSOR_MAP = SENSOR_MAP;
255409
+ exports.SHARE_VIEW_KINDS = require_sleep.SHARE_VIEW_KINDS;
255392
255410
  exports.SOURCE_CAPS = SOURCE_CAPS;
255393
255411
  exports.SOURCE_CAP_ACTIVE_FIELD = SOURCE_CAP_ACTIVE_FIELD;
255394
255412
  exports.SOURCE_CAP_CHANGED_AT_FIELD = SOURCE_CAP_CHANGED_AT_FIELD;
@@ -415493,6 +415511,7 @@ var require_share_token_service = __commonJS({
415493
415511
  })();
415494
415512
  Object.defineProperty(exports, "__esModule", { value: true });
415495
415513
  exports.ShareTokenService = exports.ShareTokenRecordSchema = exports.ShareTokenScopeSchema = exports.SHARE_TOKEN_MAX_DEVICES = exports.SHARE_TOKEN_TTL_DEFAULT_SEC = exports.SHARE_TOKEN_TTL_MAX_SEC = exports.SHARE_TOKEN_TTL_MIN_SEC = exports.SHARE_TOKEN_PREFIX = void 0;
415514
+ var types_1 = require_dist4();
415496
415515
  var crypto2 = __importStar(__require("crypto"));
415497
415516
  var zod_1 = require_zod();
415498
415517
  var SHARE_TOKENS_COLLECTION = "share_view_tokens";
@@ -415506,7 +415525,7 @@ var require_share_token_service = __commonJS({
415506
415525
  exports.SHARE_TOKEN_TTL_DEFAULT_SEC = 7 * 24 * 60 * 60;
415507
415526
  exports.SHARE_TOKEN_MAX_DEVICES = 64;
415508
415527
  exports.ShareTokenScopeSchema = zod_1.z.object({
415509
- kind: zod_1.z.enum(["grid-view", "events-view"]),
415528
+ kind: zod_1.z.enum(types_1.SHARE_VIEW_KINDS),
415510
415529
  deviceIds: zod_1.z.array(zod_1.z.number().int().nonnegative()).min(1).max(exports.SHARE_TOKEN_MAX_DEVICES)
415511
415530
  });
415512
415531
  exports.ShareTokenRecordSchema = zod_1.z.object({
@@ -420202,6 +420221,44 @@ var require_addon_route_jwt_gate = __commonJS({
420202
420221
  }
420203
420222
  });
420204
420223
 
420224
+ // ../../server/backend/dist/auth/addon-route-share-gate.js
420225
+ var require_addon_route_share_gate = __commonJS({
420226
+ "../../server/backend/dist/auth/addon-route-share-gate.js"(exports) {
420227
+ "use strict";
420228
+ Object.defineProperty(exports, "__esModule", { value: true });
420229
+ exports.SHARE_DEVICES_HEADER = exports.SHARE_KIND_HEADER = void 0;
420230
+ exports.gateAddonShareToken = gateAddonShareToken;
420231
+ exports.stripShareHeaders = stripShareHeaders;
420232
+ exports.SHARE_KIND_HEADER = "x-camstack-share-kind";
420233
+ exports.SHARE_DEVICES_HEADER = "x-camstack-share-devices";
420234
+ function gateAddonShareToken(input) {
420235
+ if (input.record === null)
420236
+ return { ok: false, status: 401, error: "Invalid token" };
420237
+ const kind = input.record.scope.kind;
420238
+ if (!(input.endpoint.share ?? []).includes(kind)) {
420239
+ return { ok: false, status: 403, error: "Share token not accepted here" };
420240
+ }
420241
+ return {
420242
+ ok: true,
420243
+ headers: {
420244
+ [exports.SHARE_KIND_HEADER]: kind,
420245
+ [exports.SHARE_DEVICES_HEADER]: input.record.scope.deviceIds.join(",")
420246
+ }
420247
+ };
420248
+ }
420249
+ function stripShareHeaders(headers) {
420250
+ const out = {};
420251
+ for (const [key, value] of Object.entries(headers)) {
420252
+ const lower = key.toLowerCase();
420253
+ if (lower === exports.SHARE_KIND_HEADER || lower === exports.SHARE_DEVICES_HEADER)
420254
+ continue;
420255
+ out[key] = value;
420256
+ }
420257
+ return out;
420258
+ }
420259
+ }
420260
+ });
420261
+
420205
420262
  // ../../server/backend/dist/core/config/config.schema.js
420206
420263
  var require_config_schema = __commonJS({
420207
420264
  "../../server/backend/dist/core/config/config.schema.js"(exports) {
@@ -421239,6 +421296,7 @@ var require_addon_registry_service = __commonJS({
421239
421296
  exports.AddonRegistryService = void 0;
421240
421297
  exports.shouldEvictMissingOnDisk = shouldEvictMissingOnDisk;
421241
421298
  exports.addonUpdatePayload = addonUpdatePayload;
421299
+ exports.parseDataPlaneEndpoints = parseDataPlaneEndpoints;
421242
421300
  exports.shouldEmitProviderRegisteredReady = shouldEmitProviderRegisteredReady;
421243
421301
  var node_crypto_1 = __require("crypto");
421244
421302
  var fs = __importStar(__require("fs"));
@@ -421357,9 +421415,30 @@ var require_addon_registry_service = __commonJS({
421357
421415
  if (typeof prefix !== "string" || typeof baseUrl !== "string" || typeof secret !== "string") {
421358
421416
  throw new Error("data-planes: endpoint descriptor missing prefix/baseUrl/secret");
421359
421417
  }
421360
- return { prefix, access: asRouteAccess(Reflect.get(entry, "access")), baseUrl, secret };
421418
+ const share = parseDataPlaneShare(Reflect.get(entry, "share"));
421419
+ return {
421420
+ prefix,
421421
+ access: asRouteAccess(Reflect.get(entry, "access")),
421422
+ baseUrl,
421423
+ secret,
421424
+ ...share !== void 0 ? { share } : {}
421425
+ };
421361
421426
  });
421362
421427
  }
421428
+ function parseDataPlaneShare(value) {
421429
+ if (value === void 0)
421430
+ return void 0;
421431
+ if (!Array.isArray(value))
421432
+ throw new Error("data-planes: `share` is not an array");
421433
+ return value.map((kind) => {
421434
+ if (!isShareViewKind(kind))
421435
+ throw new Error(`data-planes: unknown share kind ${String(kind)}`);
421436
+ return kind;
421437
+ });
421438
+ }
421439
+ function isShareViewKind(value) {
421440
+ return typeof value === "string" && types_1.SHARE_VIEW_KINDS.includes(value);
421441
+ }
421363
421442
  function shouldEmitProviderRegisteredReady(capability) {
421364
421443
  return capability !== "platform-probe";
421365
421444
  }
@@ -428219,6 +428298,7 @@ var require_main4 = __commonJS({
428219
428298
  var trpc_error_device_tags_1 = require_trpc_error_device_tags();
428220
428299
  var ws_request_census_1 = require_ws_request_census();
428221
428300
  var addon_route_jwt_gate_js_1 = require_addon_route_jwt_gate();
428301
+ var addon_route_share_gate_js_1 = require_addon_route_share_gate();
428222
428302
  var session_cookie_js_1 = require_session_cookie();
428223
428303
  var boot_config_1 = require_boot_config();
428224
428304
  var integration_id_backfill_1 = require_integration_id_backfill();
@@ -428770,6 +428850,7 @@ var require_main4 = __commonJS({
428770
428850
  const dpMatch = dataPlaneRegistry.match(addonId, subPath);
428771
428851
  if (dpMatch) {
428772
428852
  const access = dpMatch.endpoint.access;
428853
+ let shareHeaders = null;
428773
428854
  if (access !== "public") {
428774
428855
  const authHeader = request.headers.authorization;
428775
428856
  const cookieToken = request.cookies?.[session_cookie_js_1.SESSION_COOKIE];
@@ -428777,7 +428858,13 @@ var require_main4 = __commonJS({
428777
428858
  return reply.status(401).send({ error: "Unauthorized" });
428778
428859
  }
428779
428860
  const token2 = authHeader ? authHeader.replace("Bearer ", "") : cookieToken;
428780
- if (token2.startsWith("cst_")) {
428861
+ if (token2.startsWith("csv_")) {
428862
+ const record = await shareTokenService.validate(token2);
428863
+ const gate = (0, addon_route_share_gate_js_1.gateAddonShareToken)({ record, endpoint: dpMatch.endpoint });
428864
+ if (!gate.ok)
428865
+ return reply.status(gate.status).send({ error: gate.error });
428866
+ shareHeaders = gate.headers;
428867
+ } else if (token2.startsWith("cst_")) {
428781
428868
  const userMgmt = capabilityRegistry?.getSingleton("user-management");
428782
428869
  if (!userMgmt)
428783
428870
  return reply.status(503).send({ error: "User management not available" });
@@ -428802,6 +428889,12 @@ var require_main4 = __commonJS({
428802
428889
  const qIdx = request.url.indexOf("?");
428803
428890
  const queryString = qIdx >= 0 ? request.url.slice(qIdx) : "";
428804
428891
  const upstreamPath = `/${subPath}${queryString}`;
428892
+ for (const name of Object.keys(request.raw.headers)) {
428893
+ if (name.toLowerCase() === addon_route_share_gate_js_1.SHARE_KIND_HEADER || name.toLowerCase() === addon_route_share_gate_js_1.SHARE_DEVICES_HEADER)
428894
+ delete request.raw.headers[name];
428895
+ }
428896
+ if (shareHeaders !== null)
428897
+ Object.assign(request.raw.headers, shareHeaders);
428805
428898
  reply.hijack();
428806
428899
  const replayBody = request.body === void 0 ? void 0 : Buffer.isBuffer(request.body) ? request.body : Buffer.from(typeof request.body === "string" ? request.body : JSON.stringify(request.body));
428807
428900
  (0, system_1.proxyToUpstream)({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "camstack",
3
- "version": "1.2.97",
3
+ "version": "1.2.98",
4
4
  "description": "CLI tool for managing and running CamStack server",
5
5
  "keywords": [
6
6
  "camstack",