@athenaintel/react 0.40.3 → 0.41.1

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 (82) hide show
  1. package/README.md +59 -0
  2. package/dist/chat/athena-citation-links.cjs +23 -2
  3. package/dist/chat/athena-citation-links.cjs.map +1 -1
  4. package/dist/chat/athena-citation-links.d.ts +5 -0
  5. package/dist/chat/athena-citation-links.js +23 -2
  6. package/dist/chat/athena-citation-links.js.map +1 -1
  7. package/dist/chat-ui/index.d.ts +1 -1
  8. package/dist/chat-ui/lib/asset-urls.cjs +6 -1
  9. package/dist/chat-ui/lib/asset-urls.cjs.map +1 -1
  10. package/dist/chat-ui/lib/asset-urls.d.ts +6 -1
  11. package/dist/chat-ui/lib/asset-urls.js +7 -2
  12. package/dist/chat-ui/lib/asset-urls.js.map +1 -1
  13. package/dist/chat-ui/mentions/mention-chip.cjs +118 -7
  14. package/dist/chat-ui/mentions/mention-chip.cjs.map +1 -1
  15. package/dist/chat-ui/mentions/mention-chip.d.ts +29 -0
  16. package/dist/chat-ui/mentions/mention-chip.js +120 -9
  17. package/dist/chat-ui/mentions/mention-chip.js.map +1 -1
  18. package/dist/chat-ui/rich-text/chat-message-body.cjs +2 -1
  19. package/dist/chat-ui/rich-text/chat-message-body.cjs.map +1 -1
  20. package/dist/chat-ui/rich-text/chat-message-body.js +2 -1
  21. package/dist/chat-ui/rich-text/chat-message-body.js.map +1 -1
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +2 -2
  25. package/dist/lib/athena-urls.cjs +17 -0
  26. package/dist/lib/athena-urls.cjs.map +1 -1
  27. package/dist/lib/athena-urls.d.ts +14 -0
  28. package/dist/lib/athena-urls.js +17 -0
  29. package/dist/lib/athena-urls.js.map +1 -1
  30. package/dist/react/package.json.cjs +1 -1
  31. package/dist/react/package.json.js +1 -1
  32. package/dist/references/src/anchors/file-line-range.cjs +70 -0
  33. package/dist/references/src/anchors/file-line-range.cjs.map +1 -0
  34. package/dist/references/src/anchors/file-line-range.js +70 -0
  35. package/dist/references/src/anchors/file-line-range.js.map +1 -0
  36. package/dist/references/src/anchors/format.cjs +219 -0
  37. package/dist/references/src/anchors/format.cjs.map +1 -0
  38. package/dist/references/src/anchors/format.js +219 -0
  39. package/dist/references/src/anchors/format.js.map +1 -0
  40. package/dist/references/src/anchors/parse.cjs +408 -0
  41. package/dist/references/src/anchors/parse.cjs.map +1 -0
  42. package/dist/references/src/anchors/parse.js +408 -0
  43. package/dist/references/src/anchors/parse.js.map +1 -0
  44. package/dist/references/src/anchors/serialize.cjs +185 -0
  45. package/dist/references/src/anchors/serialize.cjs.map +1 -0
  46. package/dist/references/src/anchors/serialize.js +185 -0
  47. package/dist/references/src/anchors/serialize.js.map +1 -0
  48. package/dist/references/src/anchors/types.cjs +50 -0
  49. package/dist/references/src/anchors/types.cjs.map +1 -0
  50. package/dist/references/src/anchors/types.js +50 -0
  51. package/dist/references/src/anchors/types.js.map +1 -0
  52. package/dist/references/src/formats/uri/asset-mention-uri.cjs +29 -0
  53. package/dist/references/src/formats/uri/asset-mention-uri.cjs.map +1 -0
  54. package/dist/references/src/formats/uri/asset-mention-uri.js +29 -0
  55. package/dist/references/src/formats/uri/asset-mention-uri.js.map +1 -0
  56. package/dist/references/src/formats/uri/asset-spaces-url.cjs +64 -0
  57. package/dist/references/src/formats/uri/asset-spaces-url.cjs.map +1 -0
  58. package/dist/references/src/formats/uri/asset-spaces-url.js +64 -0
  59. package/dist/references/src/formats/uri/asset-spaces-url.js.map +1 -0
  60. package/dist/references/src/formats/uri/template-placeholder.cjs +9 -0
  61. package/dist/references/src/formats/uri/template-placeholder.cjs.map +1 -0
  62. package/dist/references/src/formats/uri/template-placeholder.js +9 -0
  63. package/dist/references/src/formats/uri/template-placeholder.js.map +1 -0
  64. package/dist/references/src/sheet-name.cjs +10 -0
  65. package/dist/references/src/sheet-name.cjs.map +1 -0
  66. package/dist/references/src/sheet-name.js +10 -0
  67. package/dist/references/src/sheet-name.js.map +1 -0
  68. package/dist/references/src/version-ref.cjs +61 -0
  69. package/dist/references/src/version-ref.cjs.map +1 -0
  70. package/dist/references/src/version-ref.js +61 -0
  71. package/dist/references/src/version-ref.js.map +1 -0
  72. package/dist/styles.css +1 -1
  73. package/dist/workbench/session-workbench-model.cjs +0 -18
  74. package/dist/workbench/session-workbench-model.cjs.map +1 -1
  75. package/dist/workbench/session-workbench-model.d.ts +0 -13
  76. package/dist/workbench/session-workbench-model.js +0 -18
  77. package/dist/workbench/session-workbench-model.js.map +1 -1
  78. package/dist/workbench/session-workbench-panes.cjs +1 -1
  79. package/dist/workbench/session-workbench-panes.cjs.map +1 -1
  80. package/dist/workbench/session-workbench-panes.js +2 -2
  81. package/dist/workbench/session-workbench-panes.js.map +1 -1
  82. package/package.json +3 -2
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const parse = require("../../anchors/parse.cjs");
4
+ const versionRef = require("../../version-ref.cjs");
5
+ const templatePlaceholder = require("./template-placeholder.cjs");
6
+ function decodeFromAssetMentionUri(url) {
7
+ const params = url.searchParams;
8
+ const id = templatePlaceholder.unwrapTemplatePlaceholder(params.get("id") ?? "");
9
+ const anchor = parse.parseAnchorFromParams(params);
10
+ const version = versionRef.parseVersionRefFromParams(params);
11
+ const meta = {};
12
+ const assetType = params.get("asset_type") ?? params.get("type");
13
+ if (assetType) meta.assetType = templatePlaceholder.unwrapTemplatePlaceholder(assetType);
14
+ const excerpt = params.get("excerpt");
15
+ if (excerpt) meta.excerpt = excerpt;
16
+ const sheetName = params.get("sheet_name");
17
+ if (sheetName) meta.sheetName = sheetName;
18
+ const provider = params.get("provider");
19
+ if (provider) meta.provider = provider;
20
+ const providerLocation = params.get("provider_location") || params.get("providerLocation");
21
+ if (providerLocation) meta.providerLocation = providerLocation;
22
+ const ref = { referenced: "asset", id };
23
+ if (anchor) ref.anchor = anchor;
24
+ if (version) ref.version = version;
25
+ if (Object.keys(meta).length > 0) ref.meta = meta;
26
+ return versionRef.normalizeAssetReference(ref);
27
+ }
28
+ exports.decodeFromAssetMentionUri = decodeFromAssetMentionUri;
29
+ //# sourceMappingURL=asset-mention-uri.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-mention-uri.cjs","sources":["../../../../../../references/src/formats/uri/asset-mention-uri.ts"],"sourcesContent":["import { parseAnchorFromParams } from '../../anchors/parse';\nimport { serializeAnchorToParams } from '../../anchors/serialize';\nimport type { AssetMeta, AssetReference } from '../../types';\nimport {\n normalizeAssetReference,\n parseVersionRefFromParams,\n serializeVersionRefToParams,\n} from '../../version-ref';\nimport { unwrapTemplatePlaceholder } from './template-placeholder';\n\n/*\n * Transient asset mention URI — `mention://asset?id=X&...`\n *\n * This format is used in markdown when the full asset type / title is not yet\n * known (e.g. server-side markdown generation) and fetching the asset details\n * would be too expensive. It is NOT the format persisted by the TipTap editor.\n * The editor stores assets as dashboard-spaces URLs (the canonical format):\n * /dashboard/spaces?asset_ids=<id>&type=<type>\n * See sibling `asset-spaces-url.ts` for the stored dashboard-spaces format.\n *\n * Always prefer the stored dashboard-spaces format when possible.\n */\n\n/**\n * Decode: `mention://asset?id=X&anchor=page&page=5` → AssetReference\n */\nexport function decodeFromAssetMentionUri(url: URL): AssetReference {\n const params = url.searchParams;\n\n const id = unwrapTemplatePlaceholder(params.get('id') ?? '');\n const anchor = parseAnchorFromParams(params);\n const version = parseVersionRefFromParams(params);\n\n const meta: AssetMeta = {};\n const assetType = params.get('asset_type') ?? params.get('type');\n if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);\n\n const excerpt = params.get('excerpt');\n if (excerpt) meta.excerpt = excerpt;\n\n const sheetName = params.get('sheet_name');\n if (sheetName) meta.sheetName = sheetName;\n\n const provider = params.get('provider');\n if (provider) meta.provider = provider;\n\n const providerLocation =\n params.get('provider_location') || params.get('providerLocation');\n if (providerLocation) meta.providerLocation = providerLocation;\n\n const ref: AssetReference = { referenced: 'asset', id };\n if (anchor) ref.anchor = anchor;\n if (version) ref.version = version;\n if (Object.keys(meta).length > 0) ref.meta = meta;\n\n return normalizeAssetReference(ref);\n}\n\n/**\n * Encode: AssetReference → `mention://asset?id=X&anchor=page&page=5`\n */\nexport function encodeToAssetMentionUri(reference: AssetReference): string {\n const ref = normalizeAssetReference(reference);\n const params = new URLSearchParams();\n params.set('id', ref.id);\n\n if (ref.meta?.assetType) {\n params.set('asset_type', ref.meta.assetType);\n }\n\n if (ref.version) {\n for (const [key, value] of serializeVersionRefToParams(ref.version)) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.sheetName) {\n params.set('sheet_name', ref.meta.sheetName);\n }\n\n if (ref.anchor) {\n const anchorParams = serializeAnchorToParams(ref.anchor);\n for (const [key, value] of anchorParams) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.excerpt) {\n params.set('excerpt', ref.meta.excerpt);\n }\n\n if (ref.meta?.provider) {\n params.set('provider', ref.meta.provider);\n }\n\n if (ref.meta?.providerLocation) {\n params.set('provider_location', ref.meta.providerLocation);\n }\n\n return `mention://asset?${params.toString()}`;\n}\n"],"names":["unwrapTemplatePlaceholder","parseAnchorFromParams","parseVersionRefFromParams","normalizeAssetReference"],"mappings":";;;;;AA0BO,SAAS,0BAA0B,KAA0B;AAClE,QAAM,SAAS,IAAI;AAEnB,QAAM,KAAKA,oBAAAA,0BAA0B,OAAO,IAAI,IAAI,KAAK,EAAE;AAC3D,QAAM,SAASC,MAAAA,sBAAsB,MAAM;AAC3C,QAAM,UAAUC,WAAAA,0BAA0B,MAAM;AAEhD,QAAM,OAAkB,CAAA;AACxB,QAAM,YAAY,OAAO,IAAI,YAAY,KAAK,OAAO,IAAI,MAAM;AAC/D,MAAI,UAAW,MAAK,YAAYF,oBAAAA,0BAA0B,SAAS;AAEnE,QAAM,UAAU,OAAO,IAAI,SAAS;AACpC,MAAI,cAAc,UAAU;AAE5B,QAAM,YAAY,OAAO,IAAI,YAAY;AACzC,MAAI,gBAAgB,YAAY;AAEhC,QAAM,WAAW,OAAO,IAAI,UAAU;AACtC,MAAI,eAAe,WAAW;AAE9B,QAAM,mBACJ,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,kBAAkB;AAClE,MAAI,uBAAuB,mBAAmB;AAE9C,QAAM,MAAsB,EAAE,YAAY,SAAS,GAAA;AACnD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,UAAU;AAC3B,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,OAAO;AAE7C,SAAOG,WAAAA,wBAAwB,GAAG;AACpC;;"}
@@ -0,0 +1,29 @@
1
+ import { parseAnchorFromParams } from "../../anchors/parse.js";
2
+ import { parseVersionRefFromParams, normalizeAssetReference } from "../../version-ref.js";
3
+ import { unwrapTemplatePlaceholder } from "./template-placeholder.js";
4
+ function decodeFromAssetMentionUri(url) {
5
+ const params = url.searchParams;
6
+ const id = unwrapTemplatePlaceholder(params.get("id") ?? "");
7
+ const anchor = parseAnchorFromParams(params);
8
+ const version = parseVersionRefFromParams(params);
9
+ const meta = {};
10
+ const assetType = params.get("asset_type") ?? params.get("type");
11
+ if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);
12
+ const excerpt = params.get("excerpt");
13
+ if (excerpt) meta.excerpt = excerpt;
14
+ const sheetName = params.get("sheet_name");
15
+ if (sheetName) meta.sheetName = sheetName;
16
+ const provider = params.get("provider");
17
+ if (provider) meta.provider = provider;
18
+ const providerLocation = params.get("provider_location") || params.get("providerLocation");
19
+ if (providerLocation) meta.providerLocation = providerLocation;
20
+ const ref = { referenced: "asset", id };
21
+ if (anchor) ref.anchor = anchor;
22
+ if (version) ref.version = version;
23
+ if (Object.keys(meta).length > 0) ref.meta = meta;
24
+ return normalizeAssetReference(ref);
25
+ }
26
+ export {
27
+ decodeFromAssetMentionUri
28
+ };
29
+ //# sourceMappingURL=asset-mention-uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-mention-uri.js","sources":["../../../../../../references/src/formats/uri/asset-mention-uri.ts"],"sourcesContent":["import { parseAnchorFromParams } from '../../anchors/parse';\nimport { serializeAnchorToParams } from '../../anchors/serialize';\nimport type { AssetMeta, AssetReference } from '../../types';\nimport {\n normalizeAssetReference,\n parseVersionRefFromParams,\n serializeVersionRefToParams,\n} from '../../version-ref';\nimport { unwrapTemplatePlaceholder } from './template-placeholder';\n\n/*\n * Transient asset mention URI — `mention://asset?id=X&...`\n *\n * This format is used in markdown when the full asset type / title is not yet\n * known (e.g. server-side markdown generation) and fetching the asset details\n * would be too expensive. It is NOT the format persisted by the TipTap editor.\n * The editor stores assets as dashboard-spaces URLs (the canonical format):\n * /dashboard/spaces?asset_ids=<id>&type=<type>\n * See sibling `asset-spaces-url.ts` for the stored dashboard-spaces format.\n *\n * Always prefer the stored dashboard-spaces format when possible.\n */\n\n/**\n * Decode: `mention://asset?id=X&anchor=page&page=5` → AssetReference\n */\nexport function decodeFromAssetMentionUri(url: URL): AssetReference {\n const params = url.searchParams;\n\n const id = unwrapTemplatePlaceholder(params.get('id') ?? '');\n const anchor = parseAnchorFromParams(params);\n const version = parseVersionRefFromParams(params);\n\n const meta: AssetMeta = {};\n const assetType = params.get('asset_type') ?? params.get('type');\n if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);\n\n const excerpt = params.get('excerpt');\n if (excerpt) meta.excerpt = excerpt;\n\n const sheetName = params.get('sheet_name');\n if (sheetName) meta.sheetName = sheetName;\n\n const provider = params.get('provider');\n if (provider) meta.provider = provider;\n\n const providerLocation =\n params.get('provider_location') || params.get('providerLocation');\n if (providerLocation) meta.providerLocation = providerLocation;\n\n const ref: AssetReference = { referenced: 'asset', id };\n if (anchor) ref.anchor = anchor;\n if (version) ref.version = version;\n if (Object.keys(meta).length > 0) ref.meta = meta;\n\n return normalizeAssetReference(ref);\n}\n\n/**\n * Encode: AssetReference → `mention://asset?id=X&anchor=page&page=5`\n */\nexport function encodeToAssetMentionUri(reference: AssetReference): string {\n const ref = normalizeAssetReference(reference);\n const params = new URLSearchParams();\n params.set('id', ref.id);\n\n if (ref.meta?.assetType) {\n params.set('asset_type', ref.meta.assetType);\n }\n\n if (ref.version) {\n for (const [key, value] of serializeVersionRefToParams(ref.version)) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.sheetName) {\n params.set('sheet_name', ref.meta.sheetName);\n }\n\n if (ref.anchor) {\n const anchorParams = serializeAnchorToParams(ref.anchor);\n for (const [key, value] of anchorParams) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.excerpt) {\n params.set('excerpt', ref.meta.excerpt);\n }\n\n if (ref.meta?.provider) {\n params.set('provider', ref.meta.provider);\n }\n\n if (ref.meta?.providerLocation) {\n params.set('provider_location', ref.meta.providerLocation);\n }\n\n return `mention://asset?${params.toString()}`;\n}\n"],"names":[],"mappings":";;;AA0BO,SAAS,0BAA0B,KAA0B;AAClE,QAAM,SAAS,IAAI;AAEnB,QAAM,KAAK,0BAA0B,OAAO,IAAI,IAAI,KAAK,EAAE;AAC3D,QAAM,SAAS,sBAAsB,MAAM;AAC3C,QAAM,UAAU,0BAA0B,MAAM;AAEhD,QAAM,OAAkB,CAAA;AACxB,QAAM,YAAY,OAAO,IAAI,YAAY,KAAK,OAAO,IAAI,MAAM;AAC/D,MAAI,UAAW,MAAK,YAAY,0BAA0B,SAAS;AAEnE,QAAM,UAAU,OAAO,IAAI,SAAS;AACpC,MAAI,cAAc,UAAU;AAE5B,QAAM,YAAY,OAAO,IAAI,YAAY;AACzC,MAAI,gBAAgB,YAAY;AAEhC,QAAM,WAAW,OAAO,IAAI,UAAU;AACtC,MAAI,eAAe,WAAW;AAE9B,QAAM,mBACJ,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,kBAAkB;AAClE,MAAI,uBAAuB,mBAAmB;AAE9C,QAAM,MAAsB,EAAE,YAAY,SAAS,GAAA;AACnD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,UAAU;AAC3B,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,OAAO;AAE7C,SAAO,wBAAwB,GAAG;AACpC;"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const parse = require("../../anchors/parse.cjs");
4
+ const serialize = require("../../anchors/serialize.cjs");
5
+ const versionRef = require("../../version-ref.cjs");
6
+ const templatePlaceholder = require("./template-placeholder.cjs");
7
+ function decodeFromAssetSpacesUrl(url) {
8
+ const params = url.searchParams;
9
+ const id = templatePlaceholder.unwrapTemplatePlaceholder(params.get("asset_ids") ?? "");
10
+ const anchor = parse.parseAnchorFromParams(params);
11
+ const version = versionRef.parseVersionRefFromParams(params);
12
+ const meta = {};
13
+ const assetType = params.get("type") ?? params.get("asset_type");
14
+ if (assetType) meta.assetType = templatePlaceholder.unwrapTemplatePlaceholder(assetType);
15
+ const excerpt = params.get("excerpt");
16
+ if (excerpt) meta.excerpt = excerpt;
17
+ const sheetName = params.get("sheet_name");
18
+ if (sheetName) meta.sheetName = sheetName;
19
+ const provider = params.get("provider");
20
+ if (provider) meta.provider = provider;
21
+ const providerLocation = params.get("provider_location") || params.get("providerLocation");
22
+ if (providerLocation) meta.providerLocation = providerLocation;
23
+ const ref = { referenced: "asset", id };
24
+ if (anchor) ref.anchor = anchor;
25
+ if (version) ref.version = version;
26
+ if (Object.keys(meta).length > 0) ref.meta = meta;
27
+ return versionRef.normalizeAssetReference(ref);
28
+ }
29
+ function encodeToAssetSpacesUrl(reference) {
30
+ var _a, _b, _c, _d, _e;
31
+ const ref = versionRef.normalizeAssetReference(reference);
32
+ const params = new URLSearchParams();
33
+ params.set("asset_ids", ref.id);
34
+ if ((_a = ref.meta) == null ? void 0 : _a.assetType) {
35
+ params.set("type", ref.meta.assetType);
36
+ }
37
+ if (ref.version) {
38
+ for (const [key, value] of versionRef.serializeVersionRefToParams(ref.version)) {
39
+ params.set(key, value);
40
+ }
41
+ }
42
+ if (ref.anchor) {
43
+ const anchorParams = serialize.serializeAnchorToParams(ref.anchor);
44
+ for (const [key, value] of anchorParams) {
45
+ params.set(key, value);
46
+ }
47
+ }
48
+ if ((_b = ref.meta) == null ? void 0 : _b.excerpt) {
49
+ params.set("excerpt", ref.meta.excerpt);
50
+ }
51
+ if ((_c = ref.meta) == null ? void 0 : _c.sheetName) {
52
+ params.set("sheet_name", ref.meta.sheetName);
53
+ }
54
+ if ((_d = ref.meta) == null ? void 0 : _d.provider) {
55
+ params.set("provider", ref.meta.provider);
56
+ }
57
+ if ((_e = ref.meta) == null ? void 0 : _e.providerLocation) {
58
+ params.set("provider_location", ref.meta.providerLocation);
59
+ }
60
+ return `/dashboard/spaces?${params.toString()}`;
61
+ }
62
+ exports.decodeFromAssetSpacesUrl = decodeFromAssetSpacesUrl;
63
+ exports.encodeToAssetSpacesUrl = encodeToAssetSpacesUrl;
64
+ //# sourceMappingURL=asset-spaces-url.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-spaces-url.cjs","sources":["../../../../../../references/src/formats/uri/asset-spaces-url.ts"],"sourcesContent":["import { parseAnchorFromParams } from '../../anchors/parse';\nimport { serializeAnchorToParams } from '../../anchors/serialize';\nimport type { AssetMeta, AssetReference } from '../../types';\nimport {\n normalizeAssetReference,\n parseVersionRefFromParams,\n serializeVersionRefToParams,\n} from '../../version-ref';\nimport { unwrapTemplatePlaceholder } from './template-placeholder';\n\n/**\n * Decode: `/dashboard/spaces?asset_ids=X&...` → AssetReference\n */\nexport function decodeFromAssetSpacesUrl(url: URL): AssetReference {\n const params = url.searchParams;\n\n const id = unwrapTemplatePlaceholder(params.get('asset_ids') ?? '');\n const anchor = parseAnchorFromParams(params);\n const version = parseVersionRefFromParams(params);\n\n const meta: AssetMeta = {};\n const assetType = params.get('type') ?? params.get('asset_type');\n if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);\n\n const excerpt = params.get('excerpt');\n if (excerpt) meta.excerpt = excerpt;\n\n const sheetName = params.get('sheet_name');\n if (sheetName) meta.sheetName = sheetName;\n\n const provider = params.get('provider');\n if (provider) meta.provider = provider;\n\n const providerLocation =\n params.get('provider_location') || params.get('providerLocation');\n if (providerLocation) meta.providerLocation = providerLocation;\n\n const ref: AssetReference = { referenced: 'asset', id };\n if (anchor) ref.anchor = anchor;\n if (version) ref.version = version;\n if (Object.keys(meta).length > 0) ref.meta = meta;\n\n // `asset_ids=asset_x@ver` is the legacy spelling of `&version=ver`.\n return normalizeAssetReference(ref);\n}\n\n/**\n * Encode: AssetReference → `/dashboard/spaces?asset_ids=X&...`\n */\nexport function encodeToAssetSpacesUrl(reference: AssetReference): string {\n const ref = normalizeAssetReference(reference);\n const params = new URLSearchParams();\n params.set('asset_ids', ref.id);\n\n if (ref.meta?.assetType) {\n params.set('type', ref.meta.assetType);\n }\n\n if (ref.version) {\n for (const [key, value] of serializeVersionRefToParams(ref.version)) {\n params.set(key, value);\n }\n }\n\n if (ref.anchor) {\n const anchorParams = serializeAnchorToParams(ref.anchor);\n for (const [key, value] of anchorParams) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.excerpt) {\n params.set('excerpt', ref.meta.excerpt);\n }\n\n if (ref.meta?.sheetName) {\n params.set('sheet_name', ref.meta.sheetName);\n }\n\n if (ref.meta?.provider) {\n params.set('provider', ref.meta.provider);\n }\n\n if (ref.meta?.providerLocation) {\n params.set('provider_location', ref.meta.providerLocation);\n }\n\n return `/dashboard/spaces?${params.toString()}`;\n}\n"],"names":["unwrapTemplatePlaceholder","parseAnchorFromParams","parseVersionRefFromParams","normalizeAssetReference","serializeVersionRefToParams","serializeAnchorToParams"],"mappings":";;;;;;AAaO,SAAS,yBAAyB,KAA0B;AACjE,QAAM,SAAS,IAAI;AAEnB,QAAM,KAAKA,oBAAAA,0BAA0B,OAAO,IAAI,WAAW,KAAK,EAAE;AAClE,QAAM,SAASC,MAAAA,sBAAsB,MAAM;AAC3C,QAAM,UAAUC,WAAAA,0BAA0B,MAAM;AAEhD,QAAM,OAAkB,CAAA;AACxB,QAAM,YAAY,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,YAAY;AAC/D,MAAI,UAAW,MAAK,YAAYF,oBAAAA,0BAA0B,SAAS;AAEnE,QAAM,UAAU,OAAO,IAAI,SAAS;AACpC,MAAI,cAAc,UAAU;AAE5B,QAAM,YAAY,OAAO,IAAI,YAAY;AACzC,MAAI,gBAAgB,YAAY;AAEhC,QAAM,WAAW,OAAO,IAAI,UAAU;AACtC,MAAI,eAAe,WAAW;AAE9B,QAAM,mBACJ,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,kBAAkB;AAClE,MAAI,uBAAuB,mBAAmB;AAE9C,QAAM,MAAsB,EAAE,YAAY,SAAS,GAAA;AACnD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,UAAU;AAC3B,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,OAAO;AAG7C,SAAOG,WAAAA,wBAAwB,GAAG;AACpC;AAKO,SAAS,uBAAuB,WAAmC;;AACxE,QAAM,MAAMA,WAAAA,wBAAwB,SAAS;AAC7C,QAAM,SAAS,IAAI,gBAAA;AACnB,SAAO,IAAI,aAAa,IAAI,EAAE;AAE9B,OAAI,SAAI,SAAJ,mBAAU,WAAW;AACvB,WAAO,IAAI,QAAQ,IAAI,KAAK,SAAS;AAAA,EACvC;AAEA,MAAI,IAAI,SAAS;AACf,eAAW,CAAC,KAAK,KAAK,KAAKC,WAAAA,4BAA4B,IAAI,OAAO,GAAG;AACnE,aAAO,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,IAAI,QAAQ;AACd,UAAM,eAAeC,UAAAA,wBAAwB,IAAI,MAAM;AACvD,eAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,aAAO,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,OAAI,SAAI,SAAJ,mBAAU,SAAS;AACrB,WAAO,IAAI,WAAW,IAAI,KAAK,OAAO;AAAA,EACxC;AAEA,OAAI,SAAI,SAAJ,mBAAU,WAAW;AACvB,WAAO,IAAI,cAAc,IAAI,KAAK,SAAS;AAAA,EAC7C;AAEA,OAAI,SAAI,SAAJ,mBAAU,UAAU;AACtB,WAAO,IAAI,YAAY,IAAI,KAAK,QAAQ;AAAA,EAC1C;AAEA,OAAI,SAAI,SAAJ,mBAAU,kBAAkB;AAC9B,WAAO,IAAI,qBAAqB,IAAI,KAAK,gBAAgB;AAAA,EAC3D;AAEA,SAAO,qBAAqB,OAAO,SAAA,CAAU;AAC/C;;;"}
@@ -0,0 +1,64 @@
1
+ import { parseAnchorFromParams } from "../../anchors/parse.js";
2
+ import { serializeAnchorToParams } from "../../anchors/serialize.js";
3
+ import { parseVersionRefFromParams, normalizeAssetReference, serializeVersionRefToParams } from "../../version-ref.js";
4
+ import { unwrapTemplatePlaceholder } from "./template-placeholder.js";
5
+ function decodeFromAssetSpacesUrl(url) {
6
+ const params = url.searchParams;
7
+ const id = unwrapTemplatePlaceholder(params.get("asset_ids") ?? "");
8
+ const anchor = parseAnchorFromParams(params);
9
+ const version = parseVersionRefFromParams(params);
10
+ const meta = {};
11
+ const assetType = params.get("type") ?? params.get("asset_type");
12
+ if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);
13
+ const excerpt = params.get("excerpt");
14
+ if (excerpt) meta.excerpt = excerpt;
15
+ const sheetName = params.get("sheet_name");
16
+ if (sheetName) meta.sheetName = sheetName;
17
+ const provider = params.get("provider");
18
+ if (provider) meta.provider = provider;
19
+ const providerLocation = params.get("provider_location") || params.get("providerLocation");
20
+ if (providerLocation) meta.providerLocation = providerLocation;
21
+ const ref = { referenced: "asset", id };
22
+ if (anchor) ref.anchor = anchor;
23
+ if (version) ref.version = version;
24
+ if (Object.keys(meta).length > 0) ref.meta = meta;
25
+ return normalizeAssetReference(ref);
26
+ }
27
+ function encodeToAssetSpacesUrl(reference) {
28
+ var _a, _b, _c, _d, _e;
29
+ const ref = normalizeAssetReference(reference);
30
+ const params = new URLSearchParams();
31
+ params.set("asset_ids", ref.id);
32
+ if ((_a = ref.meta) == null ? void 0 : _a.assetType) {
33
+ params.set("type", ref.meta.assetType);
34
+ }
35
+ if (ref.version) {
36
+ for (const [key, value] of serializeVersionRefToParams(ref.version)) {
37
+ params.set(key, value);
38
+ }
39
+ }
40
+ if (ref.anchor) {
41
+ const anchorParams = serializeAnchorToParams(ref.anchor);
42
+ for (const [key, value] of anchorParams) {
43
+ params.set(key, value);
44
+ }
45
+ }
46
+ if ((_b = ref.meta) == null ? void 0 : _b.excerpt) {
47
+ params.set("excerpt", ref.meta.excerpt);
48
+ }
49
+ if ((_c = ref.meta) == null ? void 0 : _c.sheetName) {
50
+ params.set("sheet_name", ref.meta.sheetName);
51
+ }
52
+ if ((_d = ref.meta) == null ? void 0 : _d.provider) {
53
+ params.set("provider", ref.meta.provider);
54
+ }
55
+ if ((_e = ref.meta) == null ? void 0 : _e.providerLocation) {
56
+ params.set("provider_location", ref.meta.providerLocation);
57
+ }
58
+ return `/dashboard/spaces?${params.toString()}`;
59
+ }
60
+ export {
61
+ decodeFromAssetSpacesUrl,
62
+ encodeToAssetSpacesUrl
63
+ };
64
+ //# sourceMappingURL=asset-spaces-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-spaces-url.js","sources":["../../../../../../references/src/formats/uri/asset-spaces-url.ts"],"sourcesContent":["import { parseAnchorFromParams } from '../../anchors/parse';\nimport { serializeAnchorToParams } from '../../anchors/serialize';\nimport type { AssetMeta, AssetReference } from '../../types';\nimport {\n normalizeAssetReference,\n parseVersionRefFromParams,\n serializeVersionRefToParams,\n} from '../../version-ref';\nimport { unwrapTemplatePlaceholder } from './template-placeholder';\n\n/**\n * Decode: `/dashboard/spaces?asset_ids=X&...` → AssetReference\n */\nexport function decodeFromAssetSpacesUrl(url: URL): AssetReference {\n const params = url.searchParams;\n\n const id = unwrapTemplatePlaceholder(params.get('asset_ids') ?? '');\n const anchor = parseAnchorFromParams(params);\n const version = parseVersionRefFromParams(params);\n\n const meta: AssetMeta = {};\n const assetType = params.get('type') ?? params.get('asset_type');\n if (assetType) meta.assetType = unwrapTemplatePlaceholder(assetType);\n\n const excerpt = params.get('excerpt');\n if (excerpt) meta.excerpt = excerpt;\n\n const sheetName = params.get('sheet_name');\n if (sheetName) meta.sheetName = sheetName;\n\n const provider = params.get('provider');\n if (provider) meta.provider = provider;\n\n const providerLocation =\n params.get('provider_location') || params.get('providerLocation');\n if (providerLocation) meta.providerLocation = providerLocation;\n\n const ref: AssetReference = { referenced: 'asset', id };\n if (anchor) ref.anchor = anchor;\n if (version) ref.version = version;\n if (Object.keys(meta).length > 0) ref.meta = meta;\n\n // `asset_ids=asset_x@ver` is the legacy spelling of `&version=ver`.\n return normalizeAssetReference(ref);\n}\n\n/**\n * Encode: AssetReference → `/dashboard/spaces?asset_ids=X&...`\n */\nexport function encodeToAssetSpacesUrl(reference: AssetReference): string {\n const ref = normalizeAssetReference(reference);\n const params = new URLSearchParams();\n params.set('asset_ids', ref.id);\n\n if (ref.meta?.assetType) {\n params.set('type', ref.meta.assetType);\n }\n\n if (ref.version) {\n for (const [key, value] of serializeVersionRefToParams(ref.version)) {\n params.set(key, value);\n }\n }\n\n if (ref.anchor) {\n const anchorParams = serializeAnchorToParams(ref.anchor);\n for (const [key, value] of anchorParams) {\n params.set(key, value);\n }\n }\n\n if (ref.meta?.excerpt) {\n params.set('excerpt', ref.meta.excerpt);\n }\n\n if (ref.meta?.sheetName) {\n params.set('sheet_name', ref.meta.sheetName);\n }\n\n if (ref.meta?.provider) {\n params.set('provider', ref.meta.provider);\n }\n\n if (ref.meta?.providerLocation) {\n params.set('provider_location', ref.meta.providerLocation);\n }\n\n return `/dashboard/spaces?${params.toString()}`;\n}\n"],"names":[],"mappings":";;;;AAaO,SAAS,yBAAyB,KAA0B;AACjE,QAAM,SAAS,IAAI;AAEnB,QAAM,KAAK,0BAA0B,OAAO,IAAI,WAAW,KAAK,EAAE;AAClE,QAAM,SAAS,sBAAsB,MAAM;AAC3C,QAAM,UAAU,0BAA0B,MAAM;AAEhD,QAAM,OAAkB,CAAA;AACxB,QAAM,YAAY,OAAO,IAAI,MAAM,KAAK,OAAO,IAAI,YAAY;AAC/D,MAAI,UAAW,MAAK,YAAY,0BAA0B,SAAS;AAEnE,QAAM,UAAU,OAAO,IAAI,SAAS;AACpC,MAAI,cAAc,UAAU;AAE5B,QAAM,YAAY,OAAO,IAAI,YAAY;AACzC,MAAI,gBAAgB,YAAY;AAEhC,QAAM,WAAW,OAAO,IAAI,UAAU;AACtC,MAAI,eAAe,WAAW;AAE9B,QAAM,mBACJ,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,kBAAkB;AAClE,MAAI,uBAAuB,mBAAmB;AAE9C,QAAM,MAAsB,EAAE,YAAY,SAAS,GAAA;AACnD,MAAI,YAAY,SAAS;AACzB,MAAI,aAAa,UAAU;AAC3B,MAAI,OAAO,KAAK,IAAI,EAAE,SAAS,OAAO,OAAO;AAG7C,SAAO,wBAAwB,GAAG;AACpC;AAKO,SAAS,uBAAuB,WAAmC;;AACxE,QAAM,MAAM,wBAAwB,SAAS;AAC7C,QAAM,SAAS,IAAI,gBAAA;AACnB,SAAO,IAAI,aAAa,IAAI,EAAE;AAE9B,OAAI,SAAI,SAAJ,mBAAU,WAAW;AACvB,WAAO,IAAI,QAAQ,IAAI,KAAK,SAAS;AAAA,EACvC;AAEA,MAAI,IAAI,SAAS;AACf,eAAW,CAAC,KAAK,KAAK,KAAK,4BAA4B,IAAI,OAAO,GAAG;AACnE,aAAO,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,MAAI,IAAI,QAAQ;AACd,UAAM,eAAe,wBAAwB,IAAI,MAAM;AACvD,eAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,aAAO,IAAI,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,OAAI,SAAI,SAAJ,mBAAU,SAAS;AACrB,WAAO,IAAI,WAAW,IAAI,KAAK,OAAO;AAAA,EACxC;AAEA,OAAI,SAAI,SAAJ,mBAAU,WAAW;AACvB,WAAO,IAAI,cAAc,IAAI,KAAK,SAAS;AAAA,EAC7C;AAEA,OAAI,SAAI,SAAJ,mBAAU,UAAU;AACtB,WAAO,IAAI,YAAY,IAAI,KAAK,QAAQ;AAAA,EAC1C;AAEA,OAAI,SAAI,SAAJ,mBAAU,kBAAkB;AAC9B,WAAO,IAAI,qBAAqB,IAAI,KAAK,gBAAgB;AAAA,EAC3D;AAEA,SAAO,qBAAqB,OAAO,SAAA,CAAU;AAC/C;"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function unwrapTemplatePlaceholder(value) {
4
+ const match = /^\[([^[\],\s]+)\]$/.exec(value.trim());
5
+ if (!match || /^[A-Z][A-Z0-9_]*$/.test(match[1])) return value;
6
+ return match[1];
7
+ }
8
+ exports.unwrapTemplatePlaceholder = unwrapTemplatePlaceholder;
9
+ //# sourceMappingURL=template-placeholder.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-placeholder.cjs","sources":["../../../../../../references/src/formats/uri/template-placeholder.ts"],"sourcesContent":["/**\n * Unwraps a query value an agent copied from a link template with the\n * template's brackets kept, e.g. `asset_ids=[asset_x]` from\n * `asset_ids=[ASSET_ID]`. Kept verbatim, the id never resolves and the mention\n * reads \"Asset Not Found\" for an asset that exists.\n *\n * Only a single bracketed token is unwrapped; anything containing a comma,\n * whitespace or nested brackets is returned unchanged. So is the template's own\n * placeholder (`[ASSET_ID]`, `[ASSET_TYPE]`): a prompt that teaches the link\n * template must read back exactly as written.\n */\nexport function unwrapTemplatePlaceholder(value: string): string {\n\tconst match = /^\\[([^[\\],\\s]+)\\]$/.exec(value.trim());\n\tif (!match || /^[A-Z][A-Z0-9_]*$/.test(match[1])) return value;\n\treturn match[1];\n}\n"],"names":[],"mappings":";;AAWO,SAAS,0BAA0B,OAAuB;AAChE,QAAM,QAAQ,qBAAqB,KAAK,MAAM,MAAM;AACpD,MAAI,CAAC,SAAS,oBAAoB,KAAK,MAAM,CAAC,CAAC,EAAG,QAAO;AACzD,SAAO,MAAM,CAAC;AACf;;"}
@@ -0,0 +1,9 @@
1
+ function unwrapTemplatePlaceholder(value) {
2
+ const match = /^\[([^[\],\s]+)\]$/.exec(value.trim());
3
+ if (!match || /^[A-Z][A-Z0-9_]*$/.test(match[1])) return value;
4
+ return match[1];
5
+ }
6
+ export {
7
+ unwrapTemplatePlaceholder
8
+ };
9
+ //# sourceMappingURL=template-placeholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-placeholder.js","sources":["../../../../../../references/src/formats/uri/template-placeholder.ts"],"sourcesContent":["/**\n * Unwraps a query value an agent copied from a link template with the\n * template's brackets kept, e.g. `asset_ids=[asset_x]` from\n * `asset_ids=[ASSET_ID]`. Kept verbatim, the id never resolves and the mention\n * reads \"Asset Not Found\" for an asset that exists.\n *\n * Only a single bracketed token is unwrapped; anything containing a comma,\n * whitespace or nested brackets is returned unchanged. So is the template's own\n * placeholder (`[ASSET_ID]`, `[ASSET_TYPE]`): a prompt that teaches the link\n * template must read back exactly as written.\n */\nexport function unwrapTemplatePlaceholder(value: string): string {\n\tconst match = /^\\[([^[\\],\\s]+)\\]$/.exec(value.trim());\n\tif (!match || /^[A-Z][A-Z0-9_]*$/.test(match[1])) return value;\n\treturn match[1];\n}\n"],"names":[],"mappings":"AAWO,SAAS,0BAA0B,OAAuB;AAChE,QAAM,QAAQ,qBAAqB,KAAK,MAAM,MAAM;AACpD,MAAI,CAAC,SAAS,oBAAoB,KAAK,MAAM,CAAC,CAAC,EAAG,QAAO;AACzD,SAAO,MAAM,CAAC;AACf;"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function quoteSheetName(name) {
4
+ if (/\s|[^a-zA-Z0-9]/.test(name)) {
5
+ return `'${name.replace(/'/g, "''")}'`;
6
+ }
7
+ return name;
8
+ }
9
+ exports.quoteSheetName = quoteSheetName;
10
+ //# sourceMappingURL=sheet-name.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-name.cjs","sources":["../../../../references/src/sheet-name.ts"],"sourcesContent":["/**\n * Quote a sheet name for Excel cross-sheet reference notation.\n *\n * A name that is not a bare run of ASCII letters and digits is wrapped in\n * single quotes with embedded apostrophes doubled, so `1. Form Factor SKUs`\n * renders as `'1. Form Factor SKUs'` and `O'Brien` as `'O''Brien'`. Mirrors\n * `sanitizeSheetName` in `@rowsncolumns/utils` (kept local so the citation\n * label formatter does not import the sheets engine).\n */\nexport function quoteSheetName(name: string): string {\n if (/\\s|[^a-zA-Z0-9]/.test(name)) {\n return `'${name.replace(/'/g, \"''\")}'`;\n }\n return name;\n}\n"],"names":[],"mappings":";;AASO,SAAS,eAAe,MAAsB;AACnD,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,WAAO,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,EACrC;AACA,SAAO;AACT;;"}
@@ -0,0 +1,10 @@
1
+ function quoteSheetName(name) {
2
+ if (/\s|[^a-zA-Z0-9]/.test(name)) {
3
+ return `'${name.replace(/'/g, "''")}'`;
4
+ }
5
+ return name;
6
+ }
7
+ export {
8
+ quoteSheetName
9
+ };
10
+ //# sourceMappingURL=sheet-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sheet-name.js","sources":["../../../../references/src/sheet-name.ts"],"sourcesContent":["/**\n * Quote a sheet name for Excel cross-sheet reference notation.\n *\n * A name that is not a bare run of ASCII letters and digits is wrapped in\n * single quotes with embedded apostrophes doubled, so `1. Form Factor SKUs`\n * renders as `'1. Form Factor SKUs'` and `O'Brien` as `'O''Brien'`. Mirrors\n * `sanitizeSheetName` in `@rowsncolumns/utils` (kept local so the citation\n * label formatter does not import the sheets engine).\n */\nexport function quoteSheetName(name: string): string {\n if (/\\s|[^a-zA-Z0-9]/.test(name)) {\n return `'${name.replace(/'/g, \"''\")}'`;\n }\n return name;\n}\n"],"names":[],"mappings":"AASO,SAAS,eAAe,MAAsB;AACnD,MAAI,kBAAkB,KAAK,IAAI,GAAG;AAChC,WAAO,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,EACrC;AACA,SAAO;AACT;"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const VERSION_PARAM = "version";
4
+ const AS_OF_PARAM = "as_of";
5
+ const KERYX_CLOCK_PARAM = "keryx_clock";
6
+ const MOVING_ALIASES = /* @__PURE__ */ new Set(["latest", "live", "head"]);
7
+ const VERSIONED_ASSET_ID = /^(asset_[^_@]+)@([A-Za-z0-9._-]+)$/;
8
+ function splitVersionedAssetId(assetId) {
9
+ const match = VERSIONED_ASSET_ID.exec(assetId);
10
+ if (!match) return void 0;
11
+ return { baseId: match[1], version: match[2] };
12
+ }
13
+ function parseVersionRefFromParams(params) {
14
+ const versionId = params.get(VERSION_PARAM);
15
+ if (versionId && !MOVING_ALIASES.has(versionId.toLowerCase())) {
16
+ return { kind: "pinned", versionId };
17
+ }
18
+ if (versionId) {
19
+ return { kind: "latest" };
20
+ }
21
+ const asOf = params.get(AS_OF_PARAM);
22
+ if (asOf) {
23
+ const rawClock = params.get(KERYX_CLOCK_PARAM);
24
+ return rawClock != null && /^\d+$/.test(rawClock) ? { kind: "as_of", at: asOf, keryxClock: Number(rawClock) } : { kind: "as_of", at: asOf };
25
+ }
26
+ return void 0;
27
+ }
28
+ function serializeVersionRefToParams(version) {
29
+ const params = new URLSearchParams();
30
+ if (version.kind === "pinned") {
31
+ params.set(VERSION_PARAM, version.versionId);
32
+ return params;
33
+ }
34
+ if (version.kind === "as_of") {
35
+ params.set(AS_OF_PARAM, version.at);
36
+ if (version.keryxClock != null) {
37
+ params.set(KERYX_CLOCK_PARAM, String(version.keryxClock));
38
+ }
39
+ }
40
+ return params;
41
+ }
42
+ function normalizeAssetReference(ref) {
43
+ const split = splitVersionedAssetId(ref.id);
44
+ if (!split) return ref;
45
+ if (ref.version) {
46
+ return { ...ref, id: split.baseId };
47
+ }
48
+ if (MOVING_ALIASES.has(split.version.toLowerCase())) {
49
+ return { ...ref, id: split.baseId, version: { kind: "latest" } };
50
+ }
51
+ return {
52
+ ...ref,
53
+ id: split.baseId,
54
+ version: { kind: "pinned", versionId: split.version }
55
+ };
56
+ }
57
+ exports.normalizeAssetReference = normalizeAssetReference;
58
+ exports.parseVersionRefFromParams = parseVersionRefFromParams;
59
+ exports.serializeVersionRefToParams = serializeVersionRefToParams;
60
+ exports.splitVersionedAssetId = splitVersionedAssetId;
61
+ //# sourceMappingURL=version-ref.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-ref.cjs","sources":["../../../../references/src/version-ref.ts"],"sourcesContent":["/**\n * Asset version references — *which state* of a source a reference points at.\n *\n * An anchor says *where* in a document a reference points; a version ref says\n * *when*. Without one, an anchor silently re-resolves against whatever the\n * source says today, which is the drift problem versioned citations solve.\n *\n * The discriminator is `kind`, matching the shipped `VersionPolicy` in\n * `@athenaintel/source-binding` so the two stay one concept.\n */\n\nimport type { AssetReference, AssetVersionRef } from './types';\n\n/** Query param carrying a pinned version id (also the legacy spelling). */\nconst VERSION_PARAM = 'version';\n/** Query param carrying a point-in-time timestamp. */\nconst AS_OF_PARAM = 'as_of';\n/** Query param carrying the Keryx clock a point-in-time state maps to. */\nconst KERYX_CLOCK_PARAM = 'keryx_clock';\n\n/**\n * Version aliases that name a moving target rather than a fixed state.\n * `asset_x@latest` is an alias, not a pin — treating it as one would freeze a\n * reference that was explicitly asked to follow the document.\n */\nconst MOVING_ALIASES = new Set(['latest', 'live', 'head']);\n\n/**\n * Matches the legacy `asset_<id>@<version>` addressing form. The base must be a\n * plain `asset_<id>` — live-asset ids (`asset_<uuid>_<providerId>`, whose\n * provider-controlled segment may itself contain `@`) and thread ids\n * (`asset_thread_<uuid>`) are never versioned, mirroring agora's anchored\n * `_VERSIONED_ASSET_ID_PATTERN`.\n */\nconst VERSIONED_ASSET_ID = /^(asset_[^_@]+)@([A-Za-z0-9._-]+)$/;\n\n/** Split a legacy versioned asset id into its base id and version segment. */\nexport function splitVersionedAssetId(\n assetId: string\n): { baseId: string; version: string } | undefined {\n const match = VERSIONED_ASSET_ID.exec(assetId);\n if (!match) return undefined;\n return { baseId: match[1], version: match[2] };\n}\n\n/** Decode a version ref from URL params, or `undefined` when unversioned. */\nexport function parseVersionRefFromParams(\n params: URLSearchParams\n): AssetVersionRef | undefined {\n const versionId = params.get(VERSION_PARAM);\n if (versionId && !MOVING_ALIASES.has(versionId.toLowerCase())) {\n return { kind: 'pinned', versionId };\n }\n if (versionId) {\n return { kind: 'latest' };\n }\n\n const asOf = params.get(AS_OF_PARAM);\n if (asOf) {\n // Digits-only, mirroring the Python codec's `int()` — `Number('')` is 0 and\n // `Number()` accepts floats/hex, which would decode to a clock the other\n // side rejects.\n const rawClock = params.get(KERYX_CLOCK_PARAM);\n return rawClock != null && /^\\d+$/.test(rawClock)\n ? { kind: 'as_of', at: asOf, keryxClock: Number(rawClock) }\n : { kind: 'as_of', at: asOf };\n }\n\n return undefined;\n}\n\n/** Encode a version ref to URL params. `latest` is the default, so it is a no-op. */\nexport function serializeVersionRefToParams(version: AssetVersionRef): URLSearchParams {\n const params = new URLSearchParams();\n\n if (version.kind === 'pinned') {\n params.set(VERSION_PARAM, version.versionId);\n return params;\n }\n\n if (version.kind === 'as_of') {\n params.set(AS_OF_PARAM, version.at);\n if (version.keryxClock != null) {\n params.set(KERYX_CLOCK_PARAM, String(version.keryxClock));\n }\n }\n\n return params;\n}\n\n/**\n * Move a legacy `id@versionId` into the `version` field, leaving `id` a plain\n * asset id. Callers can then read `ref.version` instead of re-deriving it with\n * `id.split('@')`, which is how versions got silently dropped.\n *\n * Already-normalized references and unversioned ids pass through untouched.\n */\nexport function normalizeAssetReference(ref: AssetReference): AssetReference {\n const split = splitVersionedAssetId(ref.id);\n if (!split) return ref;\n\n // An explicit `version` wins — the id suffix is the legacy spelling of it.\n if (ref.version) {\n return { ...ref, id: split.baseId };\n }\n\n if (MOVING_ALIASES.has(split.version.toLowerCase())) {\n return { ...ref, id: split.baseId, version: { kind: 'latest' } };\n }\n\n return {\n ...ref,\n id: split.baseId,\n version: { kind: 'pinned', versionId: split.version },\n };\n}\n\n/** The pinned version id a reference resolves to, if it names a fixed state. */\nexport function getPinnedVersionId(ref: AssetReference): string | undefined {\n const normalized = normalizeAssetReference(ref);\n return normalized.version?.kind === 'pinned' ? normalized.version.versionId : undefined;\n}\n"],"names":[],"mappings":";;AAcA,MAAM,gBAAgB;AAEtB,MAAM,cAAc;AAEpB,MAAM,oBAAoB;AAO1B,MAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,QAAQ,MAAM,CAAC;AASzD,MAAM,qBAAqB;AAGpB,SAAS,sBACd,SACiD;AACjD,QAAM,QAAQ,mBAAmB,KAAK,OAAO;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,QAAQ,MAAM,CAAC,GAAG,SAAS,MAAM,CAAC,EAAA;AAC7C;AAGO,SAAS,0BACd,QAC6B;AAC7B,QAAM,YAAY,OAAO,IAAI,aAAa;AAC1C,MAAI,aAAa,CAAC,eAAe,IAAI,UAAU,YAAA,CAAa,GAAG;AAC7D,WAAO,EAAE,MAAM,UAAU,UAAA;AAAA,EAC3B;AACA,MAAI,WAAW;AACb,WAAO,EAAE,MAAM,SAAA;AAAA,EACjB;AAEA,QAAM,OAAO,OAAO,IAAI,WAAW;AACnC,MAAI,MAAM;AAIR,UAAM,WAAW,OAAO,IAAI,iBAAiB;AAC7C,WAAO,YAAY,QAAQ,QAAQ,KAAK,QAAQ,IAC5C,EAAE,MAAM,SAAS,IAAI,MAAM,YAAY,OAAO,QAAQ,EAAA,IACtD,EAAE,MAAM,SAAS,IAAI,KAAA;AAAA,EAC3B;AAEA,SAAO;AACT;AAGO,SAAS,4BAA4B,SAA2C;AACrF,QAAM,SAAS,IAAI,gBAAA;AAEnB,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,IAAI,eAAe,QAAQ,SAAS;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,WAAO,IAAI,aAAa,QAAQ,EAAE;AAClC,QAAI,QAAQ,cAAc,MAAM;AAC9B,aAAO,IAAI,mBAAmB,OAAO,QAAQ,UAAU,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,wBAAwB,KAAqC;AAC3E,QAAM,QAAQ,sBAAsB,IAAI,EAAE;AAC1C,MAAI,CAAC,MAAO,QAAO;AAGnB,MAAI,IAAI,SAAS;AACf,WAAO,EAAE,GAAG,KAAK,IAAI,MAAM,OAAA;AAAA,EAC7B;AAEA,MAAI,eAAe,IAAI,MAAM,QAAQ,YAAA,CAAa,GAAG;AACnD,WAAO,EAAE,GAAG,KAAK,IAAI,MAAM,QAAQ,SAAS,EAAE,MAAM,WAAS;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,MAAM;AAAA,IACV,SAAS,EAAE,MAAM,UAAU,WAAW,MAAM,QAAA;AAAA,EAAQ;AAExD;;;;;"}
@@ -0,0 +1,61 @@
1
+ const VERSION_PARAM = "version";
2
+ const AS_OF_PARAM = "as_of";
3
+ const KERYX_CLOCK_PARAM = "keryx_clock";
4
+ const MOVING_ALIASES = /* @__PURE__ */ new Set(["latest", "live", "head"]);
5
+ const VERSIONED_ASSET_ID = /^(asset_[^_@]+)@([A-Za-z0-9._-]+)$/;
6
+ function splitVersionedAssetId(assetId) {
7
+ const match = VERSIONED_ASSET_ID.exec(assetId);
8
+ if (!match) return void 0;
9
+ return { baseId: match[1], version: match[2] };
10
+ }
11
+ function parseVersionRefFromParams(params) {
12
+ const versionId = params.get(VERSION_PARAM);
13
+ if (versionId && !MOVING_ALIASES.has(versionId.toLowerCase())) {
14
+ return { kind: "pinned", versionId };
15
+ }
16
+ if (versionId) {
17
+ return { kind: "latest" };
18
+ }
19
+ const asOf = params.get(AS_OF_PARAM);
20
+ if (asOf) {
21
+ const rawClock = params.get(KERYX_CLOCK_PARAM);
22
+ return rawClock != null && /^\d+$/.test(rawClock) ? { kind: "as_of", at: asOf, keryxClock: Number(rawClock) } : { kind: "as_of", at: asOf };
23
+ }
24
+ return void 0;
25
+ }
26
+ function serializeVersionRefToParams(version) {
27
+ const params = new URLSearchParams();
28
+ if (version.kind === "pinned") {
29
+ params.set(VERSION_PARAM, version.versionId);
30
+ return params;
31
+ }
32
+ if (version.kind === "as_of") {
33
+ params.set(AS_OF_PARAM, version.at);
34
+ if (version.keryxClock != null) {
35
+ params.set(KERYX_CLOCK_PARAM, String(version.keryxClock));
36
+ }
37
+ }
38
+ return params;
39
+ }
40
+ function normalizeAssetReference(ref) {
41
+ const split = splitVersionedAssetId(ref.id);
42
+ if (!split) return ref;
43
+ if (ref.version) {
44
+ return { ...ref, id: split.baseId };
45
+ }
46
+ if (MOVING_ALIASES.has(split.version.toLowerCase())) {
47
+ return { ...ref, id: split.baseId, version: { kind: "latest" } };
48
+ }
49
+ return {
50
+ ...ref,
51
+ id: split.baseId,
52
+ version: { kind: "pinned", versionId: split.version }
53
+ };
54
+ }
55
+ export {
56
+ normalizeAssetReference,
57
+ parseVersionRefFromParams,
58
+ serializeVersionRefToParams,
59
+ splitVersionedAssetId
60
+ };
61
+ //# sourceMappingURL=version-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-ref.js","sources":["../../../../references/src/version-ref.ts"],"sourcesContent":["/**\n * Asset version references — *which state* of a source a reference points at.\n *\n * An anchor says *where* in a document a reference points; a version ref says\n * *when*. Without one, an anchor silently re-resolves against whatever the\n * source says today, which is the drift problem versioned citations solve.\n *\n * The discriminator is `kind`, matching the shipped `VersionPolicy` in\n * `@athenaintel/source-binding` so the two stay one concept.\n */\n\nimport type { AssetReference, AssetVersionRef } from './types';\n\n/** Query param carrying a pinned version id (also the legacy spelling). */\nconst VERSION_PARAM = 'version';\n/** Query param carrying a point-in-time timestamp. */\nconst AS_OF_PARAM = 'as_of';\n/** Query param carrying the Keryx clock a point-in-time state maps to. */\nconst KERYX_CLOCK_PARAM = 'keryx_clock';\n\n/**\n * Version aliases that name a moving target rather than a fixed state.\n * `asset_x@latest` is an alias, not a pin — treating it as one would freeze a\n * reference that was explicitly asked to follow the document.\n */\nconst MOVING_ALIASES = new Set(['latest', 'live', 'head']);\n\n/**\n * Matches the legacy `asset_<id>@<version>` addressing form. The base must be a\n * plain `asset_<id>` — live-asset ids (`asset_<uuid>_<providerId>`, whose\n * provider-controlled segment may itself contain `@`) and thread ids\n * (`asset_thread_<uuid>`) are never versioned, mirroring agora's anchored\n * `_VERSIONED_ASSET_ID_PATTERN`.\n */\nconst VERSIONED_ASSET_ID = /^(asset_[^_@]+)@([A-Za-z0-9._-]+)$/;\n\n/** Split a legacy versioned asset id into its base id and version segment. */\nexport function splitVersionedAssetId(\n assetId: string\n): { baseId: string; version: string } | undefined {\n const match = VERSIONED_ASSET_ID.exec(assetId);\n if (!match) return undefined;\n return { baseId: match[1], version: match[2] };\n}\n\n/** Decode a version ref from URL params, or `undefined` when unversioned. */\nexport function parseVersionRefFromParams(\n params: URLSearchParams\n): AssetVersionRef | undefined {\n const versionId = params.get(VERSION_PARAM);\n if (versionId && !MOVING_ALIASES.has(versionId.toLowerCase())) {\n return { kind: 'pinned', versionId };\n }\n if (versionId) {\n return { kind: 'latest' };\n }\n\n const asOf = params.get(AS_OF_PARAM);\n if (asOf) {\n // Digits-only, mirroring the Python codec's `int()` — `Number('')` is 0 and\n // `Number()` accepts floats/hex, which would decode to a clock the other\n // side rejects.\n const rawClock = params.get(KERYX_CLOCK_PARAM);\n return rawClock != null && /^\\d+$/.test(rawClock)\n ? { kind: 'as_of', at: asOf, keryxClock: Number(rawClock) }\n : { kind: 'as_of', at: asOf };\n }\n\n return undefined;\n}\n\n/** Encode a version ref to URL params. `latest` is the default, so it is a no-op. */\nexport function serializeVersionRefToParams(version: AssetVersionRef): URLSearchParams {\n const params = new URLSearchParams();\n\n if (version.kind === 'pinned') {\n params.set(VERSION_PARAM, version.versionId);\n return params;\n }\n\n if (version.kind === 'as_of') {\n params.set(AS_OF_PARAM, version.at);\n if (version.keryxClock != null) {\n params.set(KERYX_CLOCK_PARAM, String(version.keryxClock));\n }\n }\n\n return params;\n}\n\n/**\n * Move a legacy `id@versionId` into the `version` field, leaving `id` a plain\n * asset id. Callers can then read `ref.version` instead of re-deriving it with\n * `id.split('@')`, which is how versions got silently dropped.\n *\n * Already-normalized references and unversioned ids pass through untouched.\n */\nexport function normalizeAssetReference(ref: AssetReference): AssetReference {\n const split = splitVersionedAssetId(ref.id);\n if (!split) return ref;\n\n // An explicit `version` wins — the id suffix is the legacy spelling of it.\n if (ref.version) {\n return { ...ref, id: split.baseId };\n }\n\n if (MOVING_ALIASES.has(split.version.toLowerCase())) {\n return { ...ref, id: split.baseId, version: { kind: 'latest' } };\n }\n\n return {\n ...ref,\n id: split.baseId,\n version: { kind: 'pinned', versionId: split.version },\n };\n}\n\n/** The pinned version id a reference resolves to, if it names a fixed state. */\nexport function getPinnedVersionId(ref: AssetReference): string | undefined {\n const normalized = normalizeAssetReference(ref);\n return normalized.version?.kind === 'pinned' ? normalized.version.versionId : undefined;\n}\n"],"names":[],"mappings":"AAcA,MAAM,gBAAgB;AAEtB,MAAM,cAAc;AAEpB,MAAM,oBAAoB;AAO1B,MAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,QAAQ,MAAM,CAAC;AASzD,MAAM,qBAAqB;AAGpB,SAAS,sBACd,SACiD;AACjD,QAAM,QAAQ,mBAAmB,KAAK,OAAO;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,EAAE,QAAQ,MAAM,CAAC,GAAG,SAAS,MAAM,CAAC,EAAA;AAC7C;AAGO,SAAS,0BACd,QAC6B;AAC7B,QAAM,YAAY,OAAO,IAAI,aAAa;AAC1C,MAAI,aAAa,CAAC,eAAe,IAAI,UAAU,YAAA,CAAa,GAAG;AAC7D,WAAO,EAAE,MAAM,UAAU,UAAA;AAAA,EAC3B;AACA,MAAI,WAAW;AACb,WAAO,EAAE,MAAM,SAAA;AAAA,EACjB;AAEA,QAAM,OAAO,OAAO,IAAI,WAAW;AACnC,MAAI,MAAM;AAIR,UAAM,WAAW,OAAO,IAAI,iBAAiB;AAC7C,WAAO,YAAY,QAAQ,QAAQ,KAAK,QAAQ,IAC5C,EAAE,MAAM,SAAS,IAAI,MAAM,YAAY,OAAO,QAAQ,EAAA,IACtD,EAAE,MAAM,SAAS,IAAI,KAAA;AAAA,EAC3B;AAEA,SAAO;AACT;AAGO,SAAS,4BAA4B,SAA2C;AACrF,QAAM,SAAS,IAAI,gBAAA;AAEnB,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,IAAI,eAAe,QAAQ,SAAS;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,WAAO,IAAI,aAAa,QAAQ,EAAE;AAClC,QAAI,QAAQ,cAAc,MAAM;AAC9B,aAAO,IAAI,mBAAmB,OAAO,QAAQ,UAAU,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,wBAAwB,KAAqC;AAC3E,QAAM,QAAQ,sBAAsB,IAAI,EAAE;AAC1C,MAAI,CAAC,MAAO,QAAO;AAGnB,MAAI,IAAI,SAAS;AACf,WAAO,EAAE,GAAG,KAAK,IAAI,MAAM,OAAA;AAAA,EAC7B;AAEA,MAAI,eAAe,IAAI,MAAM,QAAQ,YAAA,CAAa,GAAG;AACnD,WAAO,EAAE,GAAG,KAAK,IAAI,MAAM,QAAQ,SAAS,EAAE,MAAM,WAAS;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,MAAM;AAAA,IACV,SAAS,EAAE,MAAM,UAAU,WAAW,MAAM,QAAA;AAAA,EAAQ;AAExD;"}