@soat/cli 0.50.0 → 0.52.0
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.mjs +363 -29
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -13,7 +13,7 @@ import * as os from "node:os";
|
|
|
13
13
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
14
14
|
|
|
15
15
|
//#region package.json
|
|
16
|
-
var version = "0.
|
|
16
|
+
var version = "0.52.0";
|
|
17
17
|
|
|
18
18
|
//#endregion
|
|
19
19
|
//#region src/cli-wrappers/wrappers/formations.ts
|
|
@@ -145,7 +145,7 @@ var describeDeployReason = args => {
|
|
|
145
145
|
* The server answers 2xx here on purpose — the operation ran, and partial
|
|
146
146
|
* failure is modelled on the resource — so the body's `status` is the only
|
|
147
147
|
* signal that anything went wrong. Turning it into a non-zero exit is what
|
|
148
|
-
* stops `&&` chains from reporting a deploy that deployed nothing
|
|
148
|
+
* stops `&&` chains from reporting a deploy that deployed nothing.
|
|
149
149
|
*/
|
|
150
150
|
var describeFailedDeploy = args => {
|
|
151
151
|
const {
|
|
@@ -1306,12 +1306,6 @@ var routes = {
|
|
|
1306
1306
|
"required": false,
|
|
1307
1307
|
"type": "object",
|
|
1308
1308
|
"in": "body"
|
|
1309
|
-
}, {
|
|
1310
|
-
"name": "extract",
|
|
1311
|
-
"description": "Per-turn override of the agent's `knowledge_config.extraction` default. Omit to follow the agent's stored config. Set `false` to suppress automatic memory store extraction for this turn (e.g. an operational or tool-listing turn that would only add noise to a curated memory store). Set `true` to force extraction on for this turn even when the agent does not enable it by default, provided the agent has a `write_memory_store_id`. Has no effect on streaming or `requires_action` turns, which never extract.",
|
|
1312
|
-
"required": false,
|
|
1313
|
-
"type": "boolean",
|
|
1314
|
-
"in": "body"
|
|
1315
1309
|
}, {
|
|
1316
1310
|
"name": "knowledge_config",
|
|
1317
1311
|
"description": "Per-generation knowledge retrieval override. Array filters (memory_store_ids, document_ids, document_paths) are unioned with the agent's stored knowledge_config; `tags` pairs are merged with the override winning per key; scalar fields (min_score, limit) use the per-generation value when present.",
|
|
@@ -4321,7 +4315,7 @@ var routes = {
|
|
|
4321
4315
|
"list-generations": {
|
|
4322
4316
|
serviceClass: "Generations",
|
|
4323
4317
|
operationId: "listGenerations",
|
|
4324
|
-
description: "Returns generations the caller can access, optionally filtered by agent, trace, orchestration run, node, and status.
|
|
4318
|
+
description: "Returns generations the caller can access, optionally filtered by agent, trace, orchestration run, node, and status. The generations of one trace are the `trace_id` filter. Filtering by `orchestration_run_id` is the supported way to get from an orchestration run to the generations its agent nodes produced: a node execution record carries no generation id, so the pointer lives here, alongside the run's other attribution columns.",
|
|
4325
4319
|
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/generations",
|
|
4326
4320
|
httpMethod: "get",
|
|
4327
4321
|
pathParams: [],
|
|
@@ -4990,12 +4984,6 @@ var routes = {
|
|
|
4990
4984
|
"required": false,
|
|
4991
4985
|
"type": "number",
|
|
4992
4986
|
"in": "body"
|
|
4993
|
-
}, {
|
|
4994
|
-
"name": "min_score",
|
|
4995
|
-
"description": "Deprecated alias for `min_similarity`, with identical behavior. While ranking was single-signal `score` equaled `similarity_score`, so this has only ever filtered cosine and an existing value keeps returning the same results. `min_similarity` wins when both are sent. Removed in v2.",
|
|
4996
|
-
"required": false,
|
|
4997
|
-
"type": "number",
|
|
4998
|
-
"in": "body"
|
|
4999
4987
|
}, {
|
|
5000
4988
|
"name": "rrf_k",
|
|
5001
4989
|
"description": "The `k` in the reciprocal rank fusion term `1 / (k + rank)`, which sets how steeply a result's contribution decays with its position in each ranked list. A smaller value weights the very top of each list more heavily. Defaults to the deployment's `KNOWLEDGE_RRF_K`, itself 60 by default. Only applies when `query` is provided.",
|
|
@@ -5004,7 +4992,7 @@ var routes = {
|
|
|
5004
4992
|
"in": "body"
|
|
5005
4993
|
}, {
|
|
5006
4994
|
"name": "recency_half_life_days",
|
|
5007
|
-
"description": "Half-life, in days, of a recency decay applied to **memory store** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0` — the default, and the default of the deployment's `KNOWLEDGE_RECENCY_HALF_LIFE_DAYS` — disables the blend entirely; it is a switch, not a lower bound, and sending `0` turns off a deployment-wide decay for this one request. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided.",
|
|
4995
|
+
"description": "Half-life, in days, of a recency decay applied to **memory store** results after fusion: a result's `score` is multiplied by `2 ^ (-age_in_days / recency_half_life_days)`, where age is measured from its `updated_at`. Document results are never decayed. `0` — the default, and the default of the deployment's `KNOWLEDGE_RECENCY_HALF_LIFE_DAYS` — disables the blend entirely; it is a switch, not a lower bound, and sending `0` turns off a deployment-wide decay for this one request. Accepts fractions (`0.5` is twelve hours). How many ranks a given half-life costs depends on `rrf_k`. Only applies when `query` is provided. **No value is known to be safe in general**: every half-life measured against the reference corpus that lifted recency-sensitive queries also cost relevance-sensitive ones, which is why this ships disabled. Measure against your own corpus before setting it — see the Retrieval Quality guide.",
|
|
5008
4996
|
"required": false,
|
|
5009
4997
|
"type": "number",
|
|
5010
4998
|
"in": "body"
|
|
@@ -5014,6 +5002,18 @@ var routes = {
|
|
|
5014
5002
|
"required": false,
|
|
5015
5003
|
"type": "integer",
|
|
5016
5004
|
"in": "body"
|
|
5005
|
+
}, {
|
|
5006
|
+
"name": "include_documents",
|
|
5007
|
+
"description": "Set `false` to leave the document store out of this search. A `query` names no store, so it reaches both; the store-specific filters narrow *within* a store rather than choosing between them. This is the switch, and a filter naming the other store never overrides it. `false` for both stores is `400`.",
|
|
5008
|
+
"required": false,
|
|
5009
|
+
"type": "boolean",
|
|
5010
|
+
"in": "body"
|
|
5011
|
+
}, {
|
|
5012
|
+
"name": "include_memories",
|
|
5013
|
+
"description": "Set `false` to leave the memory store out of this search. The mirror of `include_documents`, for a caller that wants documents alone.",
|
|
5014
|
+
"required": false,
|
|
5015
|
+
"type": "boolean",
|
|
5016
|
+
"in": "body"
|
|
5017
5017
|
}, {
|
|
5018
5018
|
"name": "memory_store_ids",
|
|
5019
5019
|
"description": "Search memories within these specific memory stores",
|
|
@@ -5034,7 +5034,7 @@ var routes = {
|
|
|
5034
5034
|
"in": "body"
|
|
5035
5035
|
}, {
|
|
5036
5036
|
"name": "tags",
|
|
5037
|
-
"description": "Filter results to documents and memories whose `tags` contain every one of these key-value pairs (exact, case-sensitive match).
|
|
5037
|
+
"description": "Filter results to documents and memories whose `tags` contain every one of these key-value pairs (exact, case-sensitive match). Scopes both stores, so passing it alone searches both — as `query` does. For memories it matches at memory granularity: a memory is returned when its parent memory store's tags match or its own do.",
|
|
5038
5038
|
"required": false,
|
|
5039
5039
|
"type": "object",
|
|
5040
5040
|
"in": "body"
|
|
@@ -5083,7 +5083,7 @@ var routes = {
|
|
|
5083
5083
|
"create-memory": {
|
|
5084
5084
|
serviceClass: "Memories",
|
|
5085
5085
|
operationId: "createMemory",
|
|
5086
|
-
description: "
|
|
5086
|
+
description: "Writes a fact to the specified memory store through the standard write algorithm: the content is embedded (or matched to text the store already holds), compared against the most similar currently-valid memory, and resolved to exactly one of three outcomes — `skipped` at or above `duplicate_threshold`, `superseded` at or above `supersede_threshold`, `created` below it. `supersedes` overrides that comparison entirely, retiring the memory it names. Every call records one assertion, whatever the outcome.",
|
|
5087
5087
|
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memories",
|
|
5088
5088
|
httpMethod: "post",
|
|
5089
5089
|
pathParams: [],
|
|
@@ -5124,9 +5124,21 @@ var routes = {
|
|
|
5124
5124
|
"required": false,
|
|
5125
5125
|
"type": "object",
|
|
5126
5126
|
"in": "body"
|
|
5127
|
+
}, {
|
|
5128
|
+
"name": "supersedes",
|
|
5129
|
+
"description": "The memory this write replaces, named outright. The declaration outranks the thresholds in both directions: the target is retired and the write returns `superseded` however similar or distant the two texts are. This is what reaches a contradiction cosine cannot see (\"The office is in Lisbon\" then \"We closed the Lisbon office\"). The target must be a still-valid memory in the same memory store, and the caller needs `memories:UpdateMemory` on it as well as `memories:CreateMemory` on the store.",
|
|
5130
|
+
"required": false,
|
|
5131
|
+
"type": "string",
|
|
5132
|
+
"in": "body"
|
|
5127
5133
|
}, {
|
|
5128
5134
|
"name": "duplicate_threshold",
|
|
5129
|
-
"description": "Cosine similarity
|
|
5135
|
+
"description": "Cosine similarity at or above which the incoming content is a duplicate of an existing memory and the write is skipped. Overrides the store's `duplicate_threshold` for this call; falls back to the store's value, then to `0.95`.",
|
|
5136
|
+
"required": false,
|
|
5137
|
+
"type": "number",
|
|
5138
|
+
"in": "body"
|
|
5139
|
+
}, {
|
|
5140
|
+
"name": "supersede_threshold",
|
|
5141
|
+
"description": "Cosine similarity at or above which the incoming content restates a fact that has changed: the top match is invalidated and a new memory replaces it. Overrides the store's `supersede_threshold` for this call; falls back to the store's value, then to `0.90`. The effective pair must satisfy `supersede_threshold < duplicate_threshold`, and the check runs against the effective pair — so overriding only one value cannot invert it against the store's other one.",
|
|
5130
5142
|
"required": false,
|
|
5131
5143
|
"type": "number",
|
|
5132
5144
|
"in": "body"
|
|
@@ -5198,6 +5210,34 @@ var routes = {
|
|
|
5198
5210
|
"in": "path"
|
|
5199
5211
|
}]
|
|
5200
5212
|
},
|
|
5213
|
+
"list-memory-assertions": {
|
|
5214
|
+
serviceClass: "Memories",
|
|
5215
|
+
operationId: "listMemoryAssertions",
|
|
5216
|
+
description: "Returns every write that resolved into this memory, oldest first: the one that created it, the duplicates it absorbed, and the assertion that superseded another memory in its favour. A superseded memory keeps its own assertions, so the chain can be walked in both directions.",
|
|
5217
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memories",
|
|
5218
|
+
httpMethod: "get",
|
|
5219
|
+
pathParams: ["memory_id"],
|
|
5220
|
+
queryParams: ["limit", "offset"],
|
|
5221
|
+
flags: [{
|
|
5222
|
+
"name": "memory_id",
|
|
5223
|
+
"description": "",
|
|
5224
|
+
"required": true,
|
|
5225
|
+
"type": "string",
|
|
5226
|
+
"in": "path"
|
|
5227
|
+
}, {
|
|
5228
|
+
"name": "limit",
|
|
5229
|
+
"description": "Maximum number of results to return",
|
|
5230
|
+
"required": false,
|
|
5231
|
+
"type": "integer",
|
|
5232
|
+
"in": "query"
|
|
5233
|
+
}, {
|
|
5234
|
+
"name": "offset",
|
|
5235
|
+
"description": "Number of results to skip",
|
|
5236
|
+
"required": false,
|
|
5237
|
+
"type": "integer",
|
|
5238
|
+
"in": "query"
|
|
5239
|
+
}]
|
|
5240
|
+
},
|
|
5201
5241
|
"get-memory-tags": {
|
|
5202
5242
|
serviceClass: "Memories",
|
|
5203
5243
|
operationId: "getMemoryTags",
|
|
@@ -5246,6 +5286,224 @@ var routes = {
|
|
|
5246
5286
|
"in": "path"
|
|
5247
5287
|
}]
|
|
5248
5288
|
},
|
|
5289
|
+
"list-memory-rules": {
|
|
5290
|
+
serviceClass: "MemoryRules",
|
|
5291
|
+
operationId: "listMemoryRules",
|
|
5292
|
+
description: "Returns memory rules, newest first. Narrow to one store with `memory_store_id` — that form is authorized against the store itself, so it answers \"what feeds this store?\" in one call.",
|
|
5293
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-rules",
|
|
5294
|
+
httpMethod: "get",
|
|
5295
|
+
pathParams: [],
|
|
5296
|
+
queryParams: ["memory_store_id", "project_id", "limit", "offset"],
|
|
5297
|
+
flags: [{
|
|
5298
|
+
"name": "memory_store_id",
|
|
5299
|
+
"description": "Only the rules of this memory store",
|
|
5300
|
+
"required": false,
|
|
5301
|
+
"type": "string",
|
|
5302
|
+
"in": "query"
|
|
5303
|
+
}, {
|
|
5304
|
+
"name": "project_id",
|
|
5305
|
+
"description": "Project ID (required if not using project key auth)",
|
|
5306
|
+
"required": false,
|
|
5307
|
+
"type": "string",
|
|
5308
|
+
"in": "query"
|
|
5309
|
+
}, {
|
|
5310
|
+
"name": "limit",
|
|
5311
|
+
"description": "Number of results per page",
|
|
5312
|
+
"required": false,
|
|
5313
|
+
"type": "integer",
|
|
5314
|
+
"in": "query"
|
|
5315
|
+
}, {
|
|
5316
|
+
"name": "offset",
|
|
5317
|
+
"description": "Number of results to skip",
|
|
5318
|
+
"required": false,
|
|
5319
|
+
"type": "integer",
|
|
5320
|
+
"in": "query"
|
|
5321
|
+
}]
|
|
5322
|
+
},
|
|
5323
|
+
"create-memory-rule": {
|
|
5324
|
+
serviceClass: "MemoryRules",
|
|
5325
|
+
operationId: "createMemoryRule",
|
|
5326
|
+
description: "Creates an ingestion rule on a memory store. With neither `agent_id` nor `tool_id` the built-in extractor runs, configurable through `prompt`, `ai_provider_id` and `model`.",
|
|
5327
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-rules",
|
|
5328
|
+
httpMethod: "post",
|
|
5329
|
+
pathParams: [],
|
|
5330
|
+
queryParams: [],
|
|
5331
|
+
flags: [{
|
|
5332
|
+
"name": "memory_store_id",
|
|
5333
|
+
"description": "The destination store, and the rule's owning scope",
|
|
5334
|
+
"required": true,
|
|
5335
|
+
"type": "string",
|
|
5336
|
+
"in": "body"
|
|
5337
|
+
}, {
|
|
5338
|
+
"name": "on",
|
|
5339
|
+
"description": "The event a firing reads. `agents.generation.completed` fires once per completed turn whatever the transport, and is the only event the built-in extractor may bind to. `conversations.message.generated` fires per persisted assistant reply and is conversation-backed, so it is for custom handlers.",
|
|
5340
|
+
"required": true,
|
|
5341
|
+
"type": "string",
|
|
5342
|
+
"in": "body"
|
|
5343
|
+
}, {
|
|
5344
|
+
"name": "source_agent_ids",
|
|
5345
|
+
"description": "Agents whose turns this rule reads. Omit or send `null` for every agent in the store's project.",
|
|
5346
|
+
"required": false,
|
|
5347
|
+
"type": "array",
|
|
5348
|
+
"in": "body"
|
|
5349
|
+
}, {
|
|
5350
|
+
"name": "agent_id",
|
|
5351
|
+
"description": "Handler agent (mutually exclusive with tool_id)",
|
|
5352
|
+
"required": false,
|
|
5353
|
+
"type": "string",
|
|
5354
|
+
"in": "body"
|
|
5355
|
+
}, {
|
|
5356
|
+
"name": "tool_id",
|
|
5357
|
+
"description": "Handler tool (mutually exclusive with agent_id)",
|
|
5358
|
+
"required": false,
|
|
5359
|
+
"type": "string",
|
|
5360
|
+
"in": "body"
|
|
5361
|
+
}, {
|
|
5362
|
+
"name": "action",
|
|
5363
|
+
"description": "Operation id, for a tool handler",
|
|
5364
|
+
"required": false,
|
|
5365
|
+
"type": "string",
|
|
5366
|
+
"in": "body"
|
|
5367
|
+
}, {
|
|
5368
|
+
"name": "preset_parameters",
|
|
5369
|
+
"description": "Merged into a tool handler's input before invocation. The turn's own fields are reserved and win.",
|
|
5370
|
+
"required": false,
|
|
5371
|
+
"type": "object",
|
|
5372
|
+
"in": "body"
|
|
5373
|
+
}, {
|
|
5374
|
+
"name": "prompt",
|
|
5375
|
+
"description": "Replaces the built-in extractor's task instructions. The JSON response contract and the transcript are always appended. Not valid with a handler.",
|
|
5376
|
+
"required": false,
|
|
5377
|
+
"type": "string",
|
|
5378
|
+
"in": "body"
|
|
5379
|
+
}, {
|
|
5380
|
+
"name": "ai_provider_id",
|
|
5381
|
+
"description": "Provider override for the built-in extractor's completion. Not valid with a handler.",
|
|
5382
|
+
"required": false,
|
|
5383
|
+
"type": "string",
|
|
5384
|
+
"in": "body"
|
|
5385
|
+
}, {
|
|
5386
|
+
"name": "model",
|
|
5387
|
+
"description": "Model override for the built-in extractor's completion. Not valid with a handler.",
|
|
5388
|
+
"required": false,
|
|
5389
|
+
"type": "string",
|
|
5390
|
+
"in": "body"
|
|
5391
|
+
}, {
|
|
5392
|
+
"name": "enabled",
|
|
5393
|
+
"description": "A disabled rule is kept and never fires",
|
|
5394
|
+
"required": false,
|
|
5395
|
+
"type": "boolean",
|
|
5396
|
+
"in": "body"
|
|
5397
|
+
}]
|
|
5398
|
+
},
|
|
5399
|
+
"get-memory-rule": {
|
|
5400
|
+
serviceClass: "MemoryRules",
|
|
5401
|
+
operationId: "getMemoryRule",
|
|
5402
|
+
description: "Returns a specific memory rule",
|
|
5403
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-rules",
|
|
5404
|
+
httpMethod: "get",
|
|
5405
|
+
pathParams: ["memory_rule_id"],
|
|
5406
|
+
queryParams: [],
|
|
5407
|
+
flags: [{
|
|
5408
|
+
"name": "memory_rule_id",
|
|
5409
|
+
"description": "Memory rule ID",
|
|
5410
|
+
"required": true,
|
|
5411
|
+
"type": "string",
|
|
5412
|
+
"in": "path"
|
|
5413
|
+
}]
|
|
5414
|
+
},
|
|
5415
|
+
"update-memory-rule": {
|
|
5416
|
+
serviceClass: "MemoryRules",
|
|
5417
|
+
operationId: "updateMemoryRule",
|
|
5418
|
+
description: "Updates a memory rule. Validation runs against the rule as it would stand after the change, so a one-field update cannot pair a handler with a stored extractor override from the side.",
|
|
5419
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-rules",
|
|
5420
|
+
httpMethod: "patch",
|
|
5421
|
+
pathParams: ["memory_rule_id"],
|
|
5422
|
+
queryParams: [],
|
|
5423
|
+
flags: [{
|
|
5424
|
+
"name": "memory_rule_id",
|
|
5425
|
+
"description": "Memory rule ID",
|
|
5426
|
+
"required": true,
|
|
5427
|
+
"type": "string",
|
|
5428
|
+
"in": "path"
|
|
5429
|
+
}, {
|
|
5430
|
+
"name": "on",
|
|
5431
|
+
"description": "The event a firing reads. `agents.generation.completed` fires once per completed turn whatever the transport, and is the only event the built-in extractor may bind to. `conversations.message.generated` fires per persisted assistant reply and is conversation-backed, so it is for custom handlers.",
|
|
5432
|
+
"required": false,
|
|
5433
|
+
"type": "string",
|
|
5434
|
+
"in": "body"
|
|
5435
|
+
}, {
|
|
5436
|
+
"name": "source_agent_ids",
|
|
5437
|
+
"description": "Send `null` to widen the rule to every agent in the project",
|
|
5438
|
+
"required": false,
|
|
5439
|
+
"type": "array",
|
|
5440
|
+
"in": "body"
|
|
5441
|
+
}, {
|
|
5442
|
+
"name": "agent_id",
|
|
5443
|
+
"description": "",
|
|
5444
|
+
"required": false,
|
|
5445
|
+
"type": "string",
|
|
5446
|
+
"in": "body"
|
|
5447
|
+
}, {
|
|
5448
|
+
"name": "tool_id",
|
|
5449
|
+
"description": "",
|
|
5450
|
+
"required": false,
|
|
5451
|
+
"type": "string",
|
|
5452
|
+
"in": "body"
|
|
5453
|
+
}, {
|
|
5454
|
+
"name": "action",
|
|
5455
|
+
"description": "",
|
|
5456
|
+
"required": false,
|
|
5457
|
+
"type": "string",
|
|
5458
|
+
"in": "body"
|
|
5459
|
+
}, {
|
|
5460
|
+
"name": "preset_parameters",
|
|
5461
|
+
"description": "",
|
|
5462
|
+
"required": false,
|
|
5463
|
+
"type": "object",
|
|
5464
|
+
"in": "body"
|
|
5465
|
+
}, {
|
|
5466
|
+
"name": "prompt",
|
|
5467
|
+
"description": "",
|
|
5468
|
+
"required": false,
|
|
5469
|
+
"type": "string",
|
|
5470
|
+
"in": "body"
|
|
5471
|
+
}, {
|
|
5472
|
+
"name": "ai_provider_id",
|
|
5473
|
+
"description": "",
|
|
5474
|
+
"required": false,
|
|
5475
|
+
"type": "string",
|
|
5476
|
+
"in": "body"
|
|
5477
|
+
}, {
|
|
5478
|
+
"name": "model",
|
|
5479
|
+
"description": "",
|
|
5480
|
+
"required": false,
|
|
5481
|
+
"type": "string",
|
|
5482
|
+
"in": "body"
|
|
5483
|
+
}, {
|
|
5484
|
+
"name": "enabled",
|
|
5485
|
+
"description": "",
|
|
5486
|
+
"required": false,
|
|
5487
|
+
"type": "boolean",
|
|
5488
|
+
"in": "body"
|
|
5489
|
+
}]
|
|
5490
|
+
},
|
|
5491
|
+
"delete-memory-rule": {
|
|
5492
|
+
serviceClass: "MemoryRules",
|
|
5493
|
+
operationId: "deleteMemoryRule",
|
|
5494
|
+
description: "Deletes a memory rule. The assertions it wrote are kept; their `rule_id` becomes null.",
|
|
5495
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-rules",
|
|
5496
|
+
httpMethod: "delete",
|
|
5497
|
+
pathParams: ["memory_rule_id"],
|
|
5498
|
+
queryParams: [],
|
|
5499
|
+
flags: [{
|
|
5500
|
+
"name": "memory_rule_id",
|
|
5501
|
+
"description": "Memory rule ID",
|
|
5502
|
+
"required": true,
|
|
5503
|
+
"type": "string",
|
|
5504
|
+
"in": "path"
|
|
5505
|
+
}]
|
|
5506
|
+
},
|
|
5249
5507
|
"list-memory-stores": {
|
|
5250
5508
|
serviceClass: "MemoryStores",
|
|
5251
5509
|
operationId: "listMemoryStores",
|
|
@@ -5312,6 +5570,18 @@ var routes = {
|
|
|
5312
5570
|
"required": false,
|
|
5313
5571
|
"type": "object",
|
|
5314
5572
|
"in": "body"
|
|
5573
|
+
}, {
|
|
5574
|
+
"name": "duplicate_threshold",
|
|
5575
|
+
"description": "The store's dedup policy: cosine similarity at or above which an incoming fact is already known and the write is skipped. `null` (the default) uses the algorithm constant `0.95`. A single `POST /api/v1/memories` call may override it; the agent tool and the post-turn rule never can.",
|
|
5576
|
+
"required": false,
|
|
5577
|
+
"type": "number",
|
|
5578
|
+
"in": "body"
|
|
5579
|
+
}, {
|
|
5580
|
+
"name": "supersede_threshold",
|
|
5581
|
+
"description": "Cosine similarity at or above which an incoming fact restates a known one that has changed: the matched memory is invalidated and replaced. `null` (the default) uses the algorithm constant `0.90`. Must be lower than the effective `duplicate_threshold`, or the write is rejected with `400 VALIDATION_FAILED` — equal makes `superseded` unreachable and inverted swallows `skipped`.",
|
|
5582
|
+
"required": false,
|
|
5583
|
+
"type": "number",
|
|
5584
|
+
"in": "body"
|
|
5315
5585
|
}]
|
|
5316
5586
|
},
|
|
5317
5587
|
"get-memory-store": {
|
|
@@ -5362,6 +5632,18 @@ var routes = {
|
|
|
5362
5632
|
"required": false,
|
|
5363
5633
|
"type": "object",
|
|
5364
5634
|
"in": "body"
|
|
5635
|
+
}, {
|
|
5636
|
+
"name": "duplicate_threshold",
|
|
5637
|
+
"description": "The store's dedup policy: cosine similarity at or above which an incoming fact is already known and the write is skipped. `null` (the default) uses the algorithm constant `0.95`. A single `POST /api/v1/memories` call may override it; the agent tool and the post-turn rule never can.",
|
|
5638
|
+
"required": false,
|
|
5639
|
+
"type": "number",
|
|
5640
|
+
"in": "body"
|
|
5641
|
+
}, {
|
|
5642
|
+
"name": "supersede_threshold",
|
|
5643
|
+
"description": "Cosine similarity at or above which an incoming fact restates a known one that has changed: the matched memory is invalidated and replaced. `null` (the default) uses the algorithm constant `0.90`. Must be lower than the effective `duplicate_threshold`, or the write is rejected with `400 VALIDATION_FAILED` — equal makes `superseded` unreachable and inverted swallows `skipped`.",
|
|
5644
|
+
"required": false,
|
|
5645
|
+
"type": "number",
|
|
5646
|
+
"in": "body"
|
|
5365
5647
|
}]
|
|
5366
5648
|
},
|
|
5367
5649
|
"delete-memory-store": {
|
|
@@ -5380,6 +5662,58 @@ var routes = {
|
|
|
5380
5662
|
"in": "path"
|
|
5381
5663
|
}]
|
|
5382
5664
|
},
|
|
5665
|
+
"list-memory-store-assertions": {
|
|
5666
|
+
serviceClass: "MemoryStores",
|
|
5667
|
+
operationId: "listMemoryStoreAssertions",
|
|
5668
|
+
description: "Returns the store's write ledger, newest first: one row per write attempt, skips included. This is how \"which write path is filling this store?\" is asked — a question no column on a memory row could answer, because a skipped write produced no memory at all.",
|
|
5669
|
+
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/memory-stores",
|
|
5670
|
+
httpMethod: "get",
|
|
5671
|
+
pathParams: ["memory_store_id"],
|
|
5672
|
+
queryParams: ["mechanism", "outcome", "generation_id", "since", "limit", "offset"],
|
|
5673
|
+
flags: [{
|
|
5674
|
+
"name": "memory_store_id",
|
|
5675
|
+
"description": "",
|
|
5676
|
+
"required": true,
|
|
5677
|
+
"type": "string",
|
|
5678
|
+
"in": "path"
|
|
5679
|
+
}, {
|
|
5680
|
+
"name": "mechanism",
|
|
5681
|
+
"description": "Only assertions that came through this door.",
|
|
5682
|
+
"required": false,
|
|
5683
|
+
"type": "string",
|
|
5684
|
+
"in": "query"
|
|
5685
|
+
}, {
|
|
5686
|
+
"name": "outcome",
|
|
5687
|
+
"description": "Only assertions that resolved this way.",
|
|
5688
|
+
"required": false,
|
|
5689
|
+
"type": "string",
|
|
5690
|
+
"in": "query"
|
|
5691
|
+
}, {
|
|
5692
|
+
"name": "generation_id",
|
|
5693
|
+
"description": "Only assertions made during this generation. A generation that does not exist matches nothing rather than widening to the whole store.",
|
|
5694
|
+
"required": false,
|
|
5695
|
+
"type": "string",
|
|
5696
|
+
"in": "query"
|
|
5697
|
+
}, {
|
|
5698
|
+
"name": "since",
|
|
5699
|
+
"description": "Only assertions recorded at or after this instant.",
|
|
5700
|
+
"required": false,
|
|
5701
|
+
"type": "string",
|
|
5702
|
+
"in": "query"
|
|
5703
|
+
}, {
|
|
5704
|
+
"name": "limit",
|
|
5705
|
+
"description": "Maximum number of results to return",
|
|
5706
|
+
"required": false,
|
|
5707
|
+
"type": "integer",
|
|
5708
|
+
"in": "query"
|
|
5709
|
+
}, {
|
|
5710
|
+
"name": "offset",
|
|
5711
|
+
"description": "Number of results to skip",
|
|
5712
|
+
"required": false,
|
|
5713
|
+
"type": "integer",
|
|
5714
|
+
"in": "query"
|
|
5715
|
+
}]
|
|
5716
|
+
},
|
|
5383
5717
|
"get-memory-store-tags": {
|
|
5384
5718
|
serviceClass: "MemoryStores",
|
|
5385
5719
|
operationId: "getMemoryStoreTags",
|
|
@@ -6059,7 +6393,7 @@ var routes = {
|
|
|
6059
6393
|
"list-policies": {
|
|
6060
6394
|
serviceClass: "Policies",
|
|
6061
6395
|
operationId: "listPolicies",
|
|
6062
|
-
description: "Returns global policies. Requires admin role. Pass user_id to list only the policies attached to that user
|
|
6396
|
+
description: "Returns global policies. Requires admin role. Pass user_id to list only the policies attached to that user.",
|
|
6063
6397
|
moduleDocsUrl: "https://soat.ttoss.dev/docs/modules/policies",
|
|
6064
6398
|
httpMethod: "get",
|
|
6065
6399
|
pathParams: [],
|
|
@@ -7416,7 +7750,7 @@ var routes = {
|
|
|
7416
7750
|
"in": "body"
|
|
7417
7751
|
}, {
|
|
7418
7752
|
"name": "context_keys",
|
|
7419
|
-
"description": "Optional allowlist of `tool_context` keys that may be forwarded to this tool as prefixed context headers (`X-Soat-Context-<key>` by default). When `null` or omitted, every key in the caller's `tool_context` is forwarded
|
|
7753
|
+
"description": "Optional allowlist of `tool_context` keys that may be forwarded to this tool as prefixed context headers (`X-Soat-Context-<key>` by default). When `null` or omitted, every key in the caller's `tool_context` is forwarded. When set, only the listed keys are, so a per-user credential in `tool_context` can be confined to the tools that need it; `[]` forwards none. The server-pinned identity keys (`session_id`, `actor_id`, `actor_external_id`) are always forwarded. A key consumed by a `{{context:<key>}}` token in this tool's own headers is substituted regardless of this list — the tool declared that header itself.",
|
|
7420
7754
|
"required": false,
|
|
7421
7755
|
"type": "array",
|
|
7422
7756
|
"in": "body"
|
|
@@ -7526,7 +7860,7 @@ var routes = {
|
|
|
7526
7860
|
"in": "body"
|
|
7527
7861
|
}, {
|
|
7528
7862
|
"name": "context_keys",
|
|
7529
|
-
"description": "Optional allowlist of `tool_context` keys that may be forwarded to this tool as prefixed context headers (`X-Soat-Context-<key>` by default). When `null` or omitted, every key in the caller's `tool_context` is forwarded
|
|
7863
|
+
"description": "Optional allowlist of `tool_context` keys that may be forwarded to this tool as prefixed context headers (`X-Soat-Context-<key>` by default). When `null` or omitted, every key in the caller's `tool_context` is forwarded. When set, only the listed keys are, so a per-user credential in `tool_context` can be confined to the tools that need it; `[]` forwards none. The server-pinned identity keys (`session_id`, `actor_id`, `actor_external_id`) are always forwarded. A key consumed by a `{{context:<key>}}` token in this tool's own headers is substituted regardless of this list — the tool declared that header itself.",
|
|
7530
7864
|
"required": false,
|
|
7531
7865
|
"type": "array",
|
|
7532
7866
|
"in": "body"
|
|
@@ -9049,7 +9383,7 @@ var kebabToSnake = s => {
|
|
|
9049
9383
|
* (e.g. project_id → project-id). Kebab-case is the documented canonical CLI
|
|
9050
9384
|
* flag convention (see the generated docs pages and tutorials); the parser is
|
|
9051
9385
|
* lenient and accepts snake/kebab/camel alike via `toCanonical`, so this only
|
|
9052
|
-
* affects how flags are printed
|
|
9386
|
+
* affects how flags are printed.
|
|
9053
9387
|
*/
|
|
9054
9388
|
var toKebab = s => {
|
|
9055
9389
|
return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/_/g, "-").toLowerCase();
|
|
@@ -9123,8 +9457,8 @@ var digestMatches = args => {
|
|
|
9123
9457
|
if (expectedBuffer.length !== actualBuffer.length) return false;
|
|
9124
9458
|
return timingSafeEqual(expectedBuffer, actualBuffer);
|
|
9125
9459
|
};
|
|
9126
|
-
/**
|
|
9127
|
-
var
|
|
9460
|
+
/** The trigger scheme: `sha256=<hex>` over the bare body. */
|
|
9461
|
+
var verifyBareBodySignature = args => {
|
|
9128
9462
|
const expected = createHmac("sha256", args.secret).update(args.payload).digest("hex");
|
|
9129
9463
|
return digestMatches({
|
|
9130
9464
|
expected,
|
|
@@ -9162,9 +9496,9 @@ var headerValue = value => {
|
|
|
9162
9496
|
*/
|
|
9163
9497
|
var inspectDeliverySignature = args => {
|
|
9164
9498
|
const timestamped = headerValue(args.headers["x-soat-signature-v2"]);
|
|
9165
|
-
const
|
|
9499
|
+
const bareBody = headerValue(args.headers["x-soat-signature"]);
|
|
9166
9500
|
const scheme = timestamped ? "v2" : "v1";
|
|
9167
|
-
const signature = timestamped ||
|
|
9501
|
+
const signature = timestamped || bareBody;
|
|
9168
9502
|
if (!args.secret) return {
|
|
9169
9503
|
signature,
|
|
9170
9504
|
scheme,
|
|
@@ -9177,10 +9511,10 @@ var inspectDeliverySignature = args => {
|
|
|
9177
9511
|
secret: args.secret,
|
|
9178
9512
|
payload: args.payload,
|
|
9179
9513
|
header: timestamped
|
|
9180
|
-
}) :
|
|
9514
|
+
}) : verifyBareBodySignature({
|
|
9181
9515
|
secret: args.secret,
|
|
9182
9516
|
payload: args.payload,
|
|
9183
|
-
header:
|
|
9517
|
+
header: bareBody
|
|
9184
9518
|
})
|
|
9185
9519
|
};
|
|
9186
9520
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soat/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"description": "CLI for SOAT — open-source infrastructure for production-ready AI agents.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@inquirer/input": "^5.1.6",
|
|
24
24
|
"@inquirer/password": "^5.2.2",
|
|
25
|
-
"@soat/sdk": "0.
|
|
25
|
+
"@soat/sdk": "0.52.0",
|
|
26
26
|
"@ttoss/logger": "^0.8.20",
|
|
27
27
|
"commander": "^15.0.0",
|
|
28
28
|
"js-yaml": "^5.4.2"
|