@signetai/connector-forge 0.206.8 → 0.207.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +270 -10
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -15645,6 +15645,92 @@ function up132(db) {
|
|
|
15645
15645
|
ON epistemic_assertions(agent_id, subject_entity_id, status, asserted_at DESC, created_at DESC);
|
|
15646
15646
|
`);
|
|
15647
15647
|
}
|
|
15648
|
+
function up133(db) {
|
|
15649
|
+
db.exec(`
|
|
15650
|
+
CREATE TABLE IF NOT EXISTS memory_head_revisions (
|
|
15651
|
+
id TEXT PRIMARY KEY,
|
|
15652
|
+
agent_id TEXT NOT NULL,
|
|
15653
|
+
revision INTEGER NOT NULL,
|
|
15654
|
+
content TEXT NOT NULL,
|
|
15655
|
+
content_hash TEXT NOT NULL,
|
|
15656
|
+
rendered_token_count INTEGER NOT NULL,
|
|
15657
|
+
pass_id TEXT NOT NULL,
|
|
15658
|
+
base_revision INTEGER NOT NULL,
|
|
15659
|
+
base_hash TEXT NOT NULL,
|
|
15660
|
+
created_at TEXT NOT NULL,
|
|
15661
|
+
UNIQUE(agent_id, revision)
|
|
15662
|
+
);
|
|
15663
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_revisions_agent
|
|
15664
|
+
ON memory_head_revisions(agent_id, revision DESC);
|
|
15665
|
+
CREATE TABLE IF NOT EXISTS memory_head_entries (
|
|
15666
|
+
entry_id TEXT PRIMARY KEY,
|
|
15667
|
+
agent_id TEXT NOT NULL,
|
|
15668
|
+
canonical_text TEXT NOT NULL,
|
|
15669
|
+
entry_hash TEXT NOT NULL,
|
|
15670
|
+
status TEXT NOT NULL CHECK(status IN ('active','removed','superseded')),
|
|
15671
|
+
first_revision INTEGER NOT NULL,
|
|
15672
|
+
last_revision INTEGER NOT NULL,
|
|
15673
|
+
created_at TEXT NOT NULL,
|
|
15674
|
+
updated_at TEXT NOT NULL
|
|
15675
|
+
);
|
|
15676
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_entries_agent
|
|
15677
|
+
ON memory_head_entries(agent_id, entry_id, last_revision DESC);
|
|
15678
|
+
CREATE TABLE IF NOT EXISTS memory_head_revision_entries (
|
|
15679
|
+
agent_id TEXT NOT NULL,
|
|
15680
|
+
revision INTEGER NOT NULL,
|
|
15681
|
+
entry_id TEXT NOT NULL,
|
|
15682
|
+
ordinal INTEGER NOT NULL,
|
|
15683
|
+
operation TEXT NOT NULL CHECK(operation IN ('add','update','remove','retain')),
|
|
15684
|
+
provenance_json TEXT NOT NULL,
|
|
15685
|
+
PRIMARY KEY(agent_id, revision, entry_id),
|
|
15686
|
+
UNIQUE(agent_id, revision, ordinal)
|
|
15687
|
+
);
|
|
15688
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_revision_entries_entry
|
|
15689
|
+
ON memory_head_revision_entries(agent_id, entry_id, revision DESC);
|
|
15690
|
+
`);
|
|
15691
|
+
const columns = db.prepare("PRAGMA table_info(memory_md_heads)").all();
|
|
15692
|
+
const names = new Set(columns.map((column) => String(column.name)));
|
|
15693
|
+
if (!names.has("revision_id"))
|
|
15694
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN revision_id TEXT");
|
|
15695
|
+
if (!names.has("pass_id"))
|
|
15696
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN pass_id TEXT");
|
|
15697
|
+
if (!names.has("format_version"))
|
|
15698
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN format_version INTEGER NOT NULL DEFAULT 1");
|
|
15699
|
+
}
|
|
15700
|
+
function up134(db) {
|
|
15701
|
+
db.exec(`
|
|
15702
|
+
CREATE TABLE memory_head_entries_v134 (
|
|
15703
|
+
entry_id TEXT NOT NULL, agent_id TEXT NOT NULL, canonical_text TEXT NOT NULL,
|
|
15704
|
+
entry_hash TEXT NOT NULL, status TEXT NOT NULL CHECK(status IN ('active','removed','superseded')),
|
|
15705
|
+
first_revision INTEGER NOT NULL, last_revision INTEGER NOT NULL,
|
|
15706
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL,
|
|
15707
|
+
PRIMARY KEY(agent_id, entry_id)
|
|
15708
|
+
);
|
|
15709
|
+
INSERT INTO memory_head_entries_v134
|
|
15710
|
+
SELECT entry_id, agent_id, canonical_text, entry_hash, status, first_revision, last_revision, created_at, updated_at
|
|
15711
|
+
FROM memory_head_entries;
|
|
15712
|
+
DROP TABLE memory_head_entries;
|
|
15713
|
+
ALTER TABLE memory_head_entries_v134 RENAME TO memory_head_entries;
|
|
15714
|
+
CREATE INDEX idx_memory_head_entries_agent
|
|
15715
|
+
ON memory_head_entries(agent_id, entry_id, last_revision DESC);
|
|
15716
|
+
`);
|
|
15717
|
+
}
|
|
15718
|
+
function up135(db) {
|
|
15719
|
+
db.exec(`
|
|
15720
|
+
CREATE TABLE IF NOT EXISTS memory_head_publications (
|
|
15721
|
+
agent_id TEXT NOT NULL,
|
|
15722
|
+
revision INTEGER NOT NULL,
|
|
15723
|
+
revision_id TEXT NOT NULL,
|
|
15724
|
+
status TEXT NOT NULL CHECK(status IN ('pending', 'completed')),
|
|
15725
|
+
created_at TEXT NOT NULL,
|
|
15726
|
+
completed_at TEXT,
|
|
15727
|
+
PRIMARY KEY(agent_id, revision),
|
|
15728
|
+
UNIQUE(agent_id, revision_id)
|
|
15729
|
+
);
|
|
15730
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_publications_pending
|
|
15731
|
+
ON memory_head_publications(agent_id, status, revision DESC);
|
|
15732
|
+
`);
|
|
15733
|
+
}
|
|
15648
15734
|
var MIGRATIONS = [
|
|
15649
15735
|
{
|
|
15650
15736
|
version: 1,
|
|
@@ -16699,6 +16785,24 @@ var MIGRATIONS = [
|
|
|
16699
16785
|
name: "observer-scoped-epistemic-assertions",
|
|
16700
16786
|
up: up132,
|
|
16701
16787
|
artifacts: { tables: ["epistemic_assertions"] }
|
|
16788
|
+
},
|
|
16789
|
+
{
|
|
16790
|
+
version: 133,
|
|
16791
|
+
name: "dreaming-memory-head",
|
|
16792
|
+
up: up133,
|
|
16793
|
+
artifacts: { tables: ["memory_head_revisions", "memory_head_entries", "memory_head_revision_entries"] }
|
|
16794
|
+
},
|
|
16795
|
+
{
|
|
16796
|
+
version: 134,
|
|
16797
|
+
name: "scope-memory-head-entries",
|
|
16798
|
+
up: up134,
|
|
16799
|
+
artifacts: { tables: ["memory_head_entries"] }
|
|
16800
|
+
},
|
|
16801
|
+
{
|
|
16802
|
+
version: 135,
|
|
16803
|
+
name: "memory-head-publication",
|
|
16804
|
+
up: up135,
|
|
16805
|
+
artifacts: { tables: ["memory_head_publications"] }
|
|
16702
16806
|
}
|
|
16703
16807
|
];
|
|
16704
16808
|
var LATEST_SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
|
|
@@ -16741,16 +16845,42 @@ function classifyError(error) {
|
|
|
16741
16845
|
}
|
|
16742
16846
|
return { state: "corrupt", message };
|
|
16743
16847
|
}
|
|
16848
|
+
function tryRequireOverride() {
|
|
16849
|
+
const override = process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim();
|
|
16850
|
+
if (!override)
|
|
16851
|
+
return null;
|
|
16852
|
+
const isAbsolute2 = override.startsWith("/") || /^\\\\[^\\]+\\[^\\]+/.test(override) || /^[A-Za-z]:[\\/]/.test(override);
|
|
16853
|
+
if (!isAbsolute2)
|
|
16854
|
+
return null;
|
|
16855
|
+
try {
|
|
16856
|
+
return require2(override);
|
|
16857
|
+
} catch {
|
|
16858
|
+
return null;
|
|
16859
|
+
}
|
|
16860
|
+
}
|
|
16744
16861
|
async function loadModule() {
|
|
16745
|
-
modulePromise ??=
|
|
16862
|
+
modulePromise ??= (async () => {
|
|
16863
|
+
const override = process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim();
|
|
16864
|
+
if (override)
|
|
16865
|
+
return tryRequireOverride();
|
|
16866
|
+
return await Promise.resolve().then(() => __toESM2(require_keyring(), 1)).catch(() => null);
|
|
16867
|
+
})();
|
|
16746
16868
|
return modulePromise;
|
|
16747
16869
|
}
|
|
16748
16870
|
function loadModuleSync() {
|
|
16749
16871
|
if (syncModule !== undefined)
|
|
16750
16872
|
return syncModule;
|
|
16873
|
+
if (process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim()) {
|
|
16874
|
+
syncModule = tryRequireOverride();
|
|
16875
|
+
return syncModule;
|
|
16876
|
+
}
|
|
16877
|
+
const override = tryRequireOverride();
|
|
16878
|
+
if (override) {
|
|
16879
|
+
syncModule = override;
|
|
16880
|
+
return syncModule;
|
|
16881
|
+
}
|
|
16751
16882
|
try {
|
|
16752
|
-
|
|
16753
|
-
syncModule = mod;
|
|
16883
|
+
syncModule = require2("@napi-rs/keyring");
|
|
16754
16884
|
} catch {
|
|
16755
16885
|
syncModule = null;
|
|
16756
16886
|
}
|
|
@@ -28771,7 +28901,7 @@ function memoriesFtsNeedsTokenizerRepair2(sql) {
|
|
|
28771
28901
|
return true;
|
|
28772
28902
|
return !normalized.includes(`tokenize='${MEMORIES_FTS_TOKENIZER2}'`);
|
|
28773
28903
|
}
|
|
28774
|
-
function
|
|
28904
|
+
function up136(db) {
|
|
28775
28905
|
db.exec(`
|
|
28776
28906
|
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
28777
28907
|
version INTEGER PRIMARY KEY,
|
|
@@ -29255,7 +29385,7 @@ function addColumnIfMissing52(db, table, column, definition) {
|
|
|
29255
29385
|
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
29256
29386
|
}
|
|
29257
29387
|
}
|
|
29258
|
-
function
|
|
29388
|
+
function up137(db) {
|
|
29259
29389
|
db.exec(`
|
|
29260
29390
|
CREATE TABLE IF NOT EXISTS ingestion_jobs (
|
|
29261
29391
|
id TEXT PRIMARY KEY,
|
|
@@ -33010,11 +33140,97 @@ function up1322(db) {
|
|
|
33010
33140
|
ON epistemic_assertions(agent_id, subject_entity_id, status, asserted_at DESC, created_at DESC);
|
|
33011
33141
|
`);
|
|
33012
33142
|
}
|
|
33143
|
+
function up1332(db) {
|
|
33144
|
+
db.exec(`
|
|
33145
|
+
CREATE TABLE IF NOT EXISTS memory_head_revisions (
|
|
33146
|
+
id TEXT PRIMARY KEY,
|
|
33147
|
+
agent_id TEXT NOT NULL,
|
|
33148
|
+
revision INTEGER NOT NULL,
|
|
33149
|
+
content TEXT NOT NULL,
|
|
33150
|
+
content_hash TEXT NOT NULL,
|
|
33151
|
+
rendered_token_count INTEGER NOT NULL,
|
|
33152
|
+
pass_id TEXT NOT NULL,
|
|
33153
|
+
base_revision INTEGER NOT NULL,
|
|
33154
|
+
base_hash TEXT NOT NULL,
|
|
33155
|
+
created_at TEXT NOT NULL,
|
|
33156
|
+
UNIQUE(agent_id, revision)
|
|
33157
|
+
);
|
|
33158
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_revisions_agent
|
|
33159
|
+
ON memory_head_revisions(agent_id, revision DESC);
|
|
33160
|
+
CREATE TABLE IF NOT EXISTS memory_head_entries (
|
|
33161
|
+
entry_id TEXT PRIMARY KEY,
|
|
33162
|
+
agent_id TEXT NOT NULL,
|
|
33163
|
+
canonical_text TEXT NOT NULL,
|
|
33164
|
+
entry_hash TEXT NOT NULL,
|
|
33165
|
+
status TEXT NOT NULL CHECK(status IN ('active','removed','superseded')),
|
|
33166
|
+
first_revision INTEGER NOT NULL,
|
|
33167
|
+
last_revision INTEGER NOT NULL,
|
|
33168
|
+
created_at TEXT NOT NULL,
|
|
33169
|
+
updated_at TEXT NOT NULL
|
|
33170
|
+
);
|
|
33171
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_entries_agent
|
|
33172
|
+
ON memory_head_entries(agent_id, entry_id, last_revision DESC);
|
|
33173
|
+
CREATE TABLE IF NOT EXISTS memory_head_revision_entries (
|
|
33174
|
+
agent_id TEXT NOT NULL,
|
|
33175
|
+
revision INTEGER NOT NULL,
|
|
33176
|
+
entry_id TEXT NOT NULL,
|
|
33177
|
+
ordinal INTEGER NOT NULL,
|
|
33178
|
+
operation TEXT NOT NULL CHECK(operation IN ('add','update','remove','retain')),
|
|
33179
|
+
provenance_json TEXT NOT NULL,
|
|
33180
|
+
PRIMARY KEY(agent_id, revision, entry_id),
|
|
33181
|
+
UNIQUE(agent_id, revision, ordinal)
|
|
33182
|
+
);
|
|
33183
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_revision_entries_entry
|
|
33184
|
+
ON memory_head_revision_entries(agent_id, entry_id, revision DESC);
|
|
33185
|
+
`);
|
|
33186
|
+
const columns = db.prepare("PRAGMA table_info(memory_md_heads)").all();
|
|
33187
|
+
const names = new Set(columns.map((column) => String(column.name)));
|
|
33188
|
+
if (!names.has("revision_id"))
|
|
33189
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN revision_id TEXT");
|
|
33190
|
+
if (!names.has("pass_id"))
|
|
33191
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN pass_id TEXT");
|
|
33192
|
+
if (!names.has("format_version"))
|
|
33193
|
+
db.exec("ALTER TABLE memory_md_heads ADD COLUMN format_version INTEGER NOT NULL DEFAULT 1");
|
|
33194
|
+
}
|
|
33195
|
+
function up1342(db) {
|
|
33196
|
+
db.exec(`
|
|
33197
|
+
CREATE TABLE memory_head_entries_v134 (
|
|
33198
|
+
entry_id TEXT NOT NULL, agent_id TEXT NOT NULL, canonical_text TEXT NOT NULL,
|
|
33199
|
+
entry_hash TEXT NOT NULL, status TEXT NOT NULL CHECK(status IN ('active','removed','superseded')),
|
|
33200
|
+
first_revision INTEGER NOT NULL, last_revision INTEGER NOT NULL,
|
|
33201
|
+
created_at TEXT NOT NULL, updated_at TEXT NOT NULL,
|
|
33202
|
+
PRIMARY KEY(agent_id, entry_id)
|
|
33203
|
+
);
|
|
33204
|
+
INSERT INTO memory_head_entries_v134
|
|
33205
|
+
SELECT entry_id, agent_id, canonical_text, entry_hash, status, first_revision, last_revision, created_at, updated_at
|
|
33206
|
+
FROM memory_head_entries;
|
|
33207
|
+
DROP TABLE memory_head_entries;
|
|
33208
|
+
ALTER TABLE memory_head_entries_v134 RENAME TO memory_head_entries;
|
|
33209
|
+
CREATE INDEX idx_memory_head_entries_agent
|
|
33210
|
+
ON memory_head_entries(agent_id, entry_id, last_revision DESC);
|
|
33211
|
+
`);
|
|
33212
|
+
}
|
|
33213
|
+
function up1352(db) {
|
|
33214
|
+
db.exec(`
|
|
33215
|
+
CREATE TABLE IF NOT EXISTS memory_head_publications (
|
|
33216
|
+
agent_id TEXT NOT NULL,
|
|
33217
|
+
revision INTEGER NOT NULL,
|
|
33218
|
+
revision_id TEXT NOT NULL,
|
|
33219
|
+
status TEXT NOT NULL CHECK(status IN ('pending', 'completed')),
|
|
33220
|
+
created_at TEXT NOT NULL,
|
|
33221
|
+
completed_at TEXT,
|
|
33222
|
+
PRIMARY KEY(agent_id, revision),
|
|
33223
|
+
UNIQUE(agent_id, revision_id)
|
|
33224
|
+
);
|
|
33225
|
+
CREATE INDEX IF NOT EXISTS idx_memory_head_publications_pending
|
|
33226
|
+
ON memory_head_publications(agent_id, status, revision DESC);
|
|
33227
|
+
`);
|
|
33228
|
+
}
|
|
33013
33229
|
var MIGRATIONS2 = [
|
|
33014
33230
|
{
|
|
33015
33231
|
version: 1,
|
|
33016
33232
|
name: "baseline",
|
|
33017
|
-
up:
|
|
33233
|
+
up: up136,
|
|
33018
33234
|
artifacts: { tables: ["memories", "conversations", "embeddings"] }
|
|
33019
33235
|
},
|
|
33020
33236
|
{
|
|
@@ -33092,7 +33308,7 @@ var MIGRATIONS2 = [
|
|
|
33092
33308
|
{
|
|
33093
33309
|
version: 13,
|
|
33094
33310
|
name: "ingestion-tracking",
|
|
33095
|
-
up:
|
|
33311
|
+
up: up137,
|
|
33096
33312
|
artifacts: {
|
|
33097
33313
|
columns: [
|
|
33098
33314
|
{ table: "memories", column: "source_path" },
|
|
@@ -34064,6 +34280,24 @@ var MIGRATIONS2 = [
|
|
|
34064
34280
|
name: "observer-scoped-epistemic-assertions",
|
|
34065
34281
|
up: up1322,
|
|
34066
34282
|
artifacts: { tables: ["epistemic_assertions"] }
|
|
34283
|
+
},
|
|
34284
|
+
{
|
|
34285
|
+
version: 133,
|
|
34286
|
+
name: "dreaming-memory-head",
|
|
34287
|
+
up: up1332,
|
|
34288
|
+
artifacts: { tables: ["memory_head_revisions", "memory_head_entries", "memory_head_revision_entries"] }
|
|
34289
|
+
},
|
|
34290
|
+
{
|
|
34291
|
+
version: 134,
|
|
34292
|
+
name: "scope-memory-head-entries",
|
|
34293
|
+
up: up1342,
|
|
34294
|
+
artifacts: { tables: ["memory_head_entries"] }
|
|
34295
|
+
},
|
|
34296
|
+
{
|
|
34297
|
+
version: 135,
|
|
34298
|
+
name: "memory-head-publication",
|
|
34299
|
+
up: up1352,
|
|
34300
|
+
artifacts: { tables: ["memory_head_publications"] }
|
|
34067
34301
|
}
|
|
34068
34302
|
];
|
|
34069
34303
|
var LATEST_SCHEMA_VERSION2 = MIGRATIONS2[MIGRATIONS2.length - 1]?.version ?? 0;
|
|
@@ -34106,16 +34340,42 @@ function classifyError2(error) {
|
|
|
34106
34340
|
}
|
|
34107
34341
|
return { state: "corrupt", message };
|
|
34108
34342
|
}
|
|
34343
|
+
function tryRequireOverride2() {
|
|
34344
|
+
const override = process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim();
|
|
34345
|
+
if (!override)
|
|
34346
|
+
return null;
|
|
34347
|
+
const isAbsolute2 = override.startsWith("/") || /^\\\\[^\\]+\\[^\\]+/.test(override) || /^[A-Za-z]:[\\/]/.test(override);
|
|
34348
|
+
if (!isAbsolute2)
|
|
34349
|
+
return null;
|
|
34350
|
+
try {
|
|
34351
|
+
return require22(override);
|
|
34352
|
+
} catch {
|
|
34353
|
+
return null;
|
|
34354
|
+
}
|
|
34355
|
+
}
|
|
34109
34356
|
async function loadModule2() {
|
|
34110
|
-
modulePromise2 ??=
|
|
34357
|
+
modulePromise2 ??= (async () => {
|
|
34358
|
+
const override = process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim();
|
|
34359
|
+
if (override)
|
|
34360
|
+
return tryRequireOverride2();
|
|
34361
|
+
return await Promise.resolve().then(() => __toESM(require_keyring2(), 1)).catch(() => null);
|
|
34362
|
+
})();
|
|
34111
34363
|
return modulePromise2;
|
|
34112
34364
|
}
|
|
34113
34365
|
function loadModuleSync2() {
|
|
34114
34366
|
if (syncModule2 !== undefined)
|
|
34115
34367
|
return syncModule2;
|
|
34368
|
+
if (process.env.SIGNET_KEYRING_NATIVE_MODULE_PATH?.trim()) {
|
|
34369
|
+
syncModule2 = tryRequireOverride2();
|
|
34370
|
+
return syncModule2;
|
|
34371
|
+
}
|
|
34372
|
+
const override = tryRequireOverride2();
|
|
34373
|
+
if (override) {
|
|
34374
|
+
syncModule2 = override;
|
|
34375
|
+
return syncModule2;
|
|
34376
|
+
}
|
|
34116
34377
|
try {
|
|
34117
|
-
|
|
34118
|
-
syncModule2 = mod;
|
|
34378
|
+
syncModule2 = require22("@napi-rs/keyring");
|
|
34119
34379
|
} catch {
|
|
34120
34380
|
syncModule2 = null;
|
|
34121
34381
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signetai/connector-forge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.207.2",
|
|
4
4
|
"description": "Signet connector for ForgeCode - installs MCP, identity, and skills integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
"typecheck": "tsc --noEmit"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@signetai/connector-base": "0.
|
|
28
|
-
"@signetai/core": "0.
|
|
27
|
+
"@signetai/connector-base": "0.207.2",
|
|
28
|
+
"@signetai/core": "0.207.2"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^22.0.0",
|