@arnilo/prism 0.1.3 → 0.1.5
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/CHANGELOG.md +10 -0
- package/dist/agent-approval.d.ts +49 -0
- package/dist/agent-approval.js +178 -0
- package/dist/agent-run-lifecycle.d.ts +5 -1
- package/dist/agent-run-lifecycle.js +211 -3
- package/dist/agent-session.d.ts +98 -0
- package/dist/agent-session.js +1811 -0
- package/dist/agent-tool-dispatch.d.ts +13 -0
- package/dist/agent-tool-dispatch.js +92 -0
- package/dist/agents.d.ts +16 -9
- package/dist/agents.js +14 -2267
- package/dist/cli-init.d.ts +0 -2
- package/dist/cli-init.js +0 -2
- package/dist/cli-runner.js +1 -1
- package/dist/contracts-core.d.ts +1396 -0
- package/dist/contracts-core.js +119 -0
- package/dist/contracts-protocol.d.ts +594 -0
- package/dist/contracts-protocol.js +2 -0
- package/dist/contracts-run-state.d.ts +285 -0
- package/dist/contracts-run-state.js +77 -0
- package/dist/contracts.d.ts +7 -2269
- package/dist/contracts.js +7 -192
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/rpc.js +2 -1
- package/docs/agent-loops.md +1 -1
- package/docs/agent-session-runtime.md +4 -2
- package/docs/browser-automation.md +13 -9
- package/docs/coding-agent-tools.md +1 -2
- package/docs/compaction-observational-memory.md +5 -6
- package/docs/index.md +4 -4
- package/docs/migration.md +114 -1
- package/docs/performance.md +10 -0
- package/docs/provider-conformance.md +2 -2
- package/docs/provider-layer.md +1 -1
- package/docs/provider-packages.md +1 -1
- package/docs/provider-primitives.md +1 -1
- package/docs/public-contracts.md +4 -2
- package/docs/release-and-install.md +64 -0
- package/docs/tool-execution-primitives.md +3 -3
- package/docs/tools.md +2 -2
- package/docs/use-case-model-selection.md +12 -11
- package/package.json +2 -2
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export const SESSION_ENTRY_KINDS = [
|
|
2
|
+
"message",
|
|
3
|
+
"event",
|
|
4
|
+
"summary",
|
|
5
|
+
"metadata",
|
|
6
|
+
"model_change",
|
|
7
|
+
"label",
|
|
8
|
+
"custom",
|
|
9
|
+
"compaction",
|
|
10
|
+
];
|
|
11
|
+
const SESSION_ENTRY_KIND_SET = new Set(SESSION_ENTRY_KINDS);
|
|
12
|
+
export const SESSION_ENTRY_SCHEMA_VERSION = 1;
|
|
13
|
+
export function isSessionEntryKind(value) {
|
|
14
|
+
return typeof value === "string" && SESSION_ENTRY_KIND_SET.has(value);
|
|
15
|
+
}
|
|
16
|
+
/** Host-written `SessionRecord.metadata` / session metadata key for workspace filtering. */
|
|
17
|
+
export const SESSION_SEARCH_WORKSPACE_METADATA_KEY = "workspaceRoot";
|
|
18
|
+
export const DEFAULT_SESSION_SEARCH_LIMIT = 20;
|
|
19
|
+
export const HARD_MAX_SESSION_SEARCH_LIMIT = 100;
|
|
20
|
+
export const DEFAULT_MAX_SESSION_SEARCH_QUERY_BYTES = 4 * 1024;
|
|
21
|
+
export const HARD_MAX_SESSION_SEARCH_QUERY_BYTES = 16 * 1024;
|
|
22
|
+
export const DEFAULT_MAX_SESSION_SEARCH_SNIPPET_BYTES = 512;
|
|
23
|
+
export const HARD_MAX_SESSION_SEARCH_SNIPPET_BYTES = 4 * 1024;
|
|
24
|
+
export const DEFAULT_MAX_SESSION_SEARCH_CURSOR_BYTES = 1 * 1024;
|
|
25
|
+
export const HARD_MAX_SESSION_SEARCH_CURSOR_BYTES = 4 * 1024;
|
|
26
|
+
export const DEFAULT_MAX_SESSION_SEARCH_LINEAR_SESSIONS = 1_000;
|
|
27
|
+
export const HARD_MAX_SESSION_SEARCH_LINEAR_SESSIONS = 5_000;
|
|
28
|
+
export const DEFAULT_MAX_SESSION_SEARCH_LINEAR_ENTRIES = 10_000;
|
|
29
|
+
export const HARD_MAX_SESSION_SEARCH_LINEAR_ENTRIES = 50_000;
|
|
30
|
+
export const DEFAULT_MAX_SESSION_SEARCH_LINEAR_BYTES = 8 * 1024 * 1024;
|
|
31
|
+
export const HARD_MAX_SESSION_SEARCH_LINEAR_BYTES = 64 * 1024 * 1024;
|
|
32
|
+
export const DEFAULT_MAX_SESSION_SEARCH_FTS_CANDIDATES = 1_000;
|
|
33
|
+
export const HARD_MAX_SESSION_SEARCH_FTS_CANDIDATES = 5_000;
|
|
34
|
+
/**
|
|
35
|
+
* O(1) validation before any scan/query. Applies default page limit; rejects NaN,
|
|
36
|
+
* non-positive limits, oversize query/cursor/filter strings, and invalid order.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveSessionSearchQuery(query) {
|
|
39
|
+
const limit = query.limit === undefined ? DEFAULT_SESSION_SEARCH_LIMIT : query.limit;
|
|
40
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > HARD_MAX_SESSION_SEARCH_LIMIT) {
|
|
41
|
+
throw new TypeError(`SessionSearchQuery.limit must be a safe integer from 1 to ${HARD_MAX_SESSION_SEARCH_LIMIT}`);
|
|
42
|
+
}
|
|
43
|
+
const order = query.order ?? "desc";
|
|
44
|
+
if (order !== "asc" && order !== "desc") {
|
|
45
|
+
throw new TypeError('SessionSearchQuery.order must be "asc" or "desc"');
|
|
46
|
+
}
|
|
47
|
+
assertSearchStringBytes(query.query, "query", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
48
|
+
assertSearchStringBytes(query.cursor, "cursor", HARD_MAX_SESSION_SEARCH_CURSOR_BYTES);
|
|
49
|
+
assertSearchStringBytes(query.workspaceRoot, "workspaceRoot", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
50
|
+
assertSearchStringBytes(query.provider, "provider", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
51
|
+
assertSearchStringBytes(query.model, "model", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
52
|
+
assertSearchStringBytes(query.label, "label", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
53
|
+
assertSearchStringBytes(query.summary, "summary", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
54
|
+
assertSearchStringBytes(query.tenantId, "tenantId", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
55
|
+
assertSearchStringBytes(query.accountId, "accountId", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
56
|
+
assertSearchStringBytes(query.userId, "userId", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
57
|
+
assertSearchStringBytes(query.fromUpdatedAt, "fromUpdatedAt", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
58
|
+
assertSearchStringBytes(query.toUpdatedAt, "toUpdatedAt", HARD_MAX_SESSION_SEARCH_QUERY_BYTES);
|
|
59
|
+
return { ...query, limit, order };
|
|
60
|
+
}
|
|
61
|
+
function assertSearchStringBytes(value, name, hardMax) {
|
|
62
|
+
if (value === undefined)
|
|
63
|
+
return;
|
|
64
|
+
if (typeof value !== "string") {
|
|
65
|
+
throw new TypeError(`SessionSearchQuery.${name} must be a string`);
|
|
66
|
+
}
|
|
67
|
+
// ponytail: UTF-8 byte length via TextEncoder; upgrade only if a non-Unicode host appears.
|
|
68
|
+
const bytes = new TextEncoder().encode(value).byteLength;
|
|
69
|
+
if (bytes > hardMax) {
|
|
70
|
+
throw new TypeError(`SessionSearchQuery.${name} exceeds ${hardMax} bytes`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export const SESSION_SEARCH_UNSUPPORTED_CODE = "session_search_unsupported";
|
|
74
|
+
/** Thrown when a store opts out of `searchSessions` (memory `unsupported`, JSONL). */
|
|
75
|
+
export class SessionSearchUnsupportedError extends Error {
|
|
76
|
+
code = SESSION_SEARCH_UNSUPPORTED_CODE;
|
|
77
|
+
constructor(message = "session search is unsupported by this store") {
|
|
78
|
+
super(message);
|
|
79
|
+
this.name = "SessionSearchUnsupportedError";
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function isSessionSearchUnsupported(error) {
|
|
83
|
+
return error instanceof Error && error.code === SESSION_SEARCH_UNSUPPORTED_CODE;
|
|
84
|
+
}
|
|
85
|
+
/** Stable error code carried by `SessionAppendConflictError`. */
|
|
86
|
+
export const SESSION_APPEND_CONFLICT_CODE = "session_append_conflict";
|
|
87
|
+
/**
|
|
88
|
+
* Thrown when `SessionStore.append` rejects an entry under `SessionAppendOptions`
|
|
89
|
+
* (dangling/stale `expectedParentId`, stricter adapter CAS failure, or duplicate
|
|
90
|
+
* idempotency key for the same parent). Recognize via the stable `code` and
|
|
91
|
+
* `isSessionAppendConflict`, not message text.
|
|
92
|
+
*/
|
|
93
|
+
export class SessionAppendConflictError extends Error {
|
|
94
|
+
conflict;
|
|
95
|
+
code = SESSION_APPEND_CONFLICT_CODE;
|
|
96
|
+
constructor(conflict) {
|
|
97
|
+
const detail = conflict.idempotencyDuplicate
|
|
98
|
+
? `idempotency key already used`
|
|
99
|
+
: conflict.currentLeafId !== undefined
|
|
100
|
+
? `expected parent ${conflict.expectedParentId ?? "<none>"} does not match current leaf ${conflict.currentLeafId}`
|
|
101
|
+
: `expected parent ${conflict.expectedParentId ?? "<none>"} is unavailable`;
|
|
102
|
+
super(`session append conflict: ${detail}`);
|
|
103
|
+
this.conflict = conflict;
|
|
104
|
+
this.name = "SessionAppendConflictError";
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Type guard keyed off the stable `code` (works across bundles; not message text). */
|
|
108
|
+
export function isSessionAppendConflict(error) {
|
|
109
|
+
return error instanceof Error && error.code === SESSION_APPEND_CONFLICT_CODE;
|
|
110
|
+
}
|
|
111
|
+
const SESSION_METADATA_KEY_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/;
|
|
112
|
+
/** Validate a top-level `SessionRecord.metadata` key used by `SessionQuery.metadataKey` filters. */
|
|
113
|
+
export function assertSessionMetadataKey(key) {
|
|
114
|
+
if (typeof key !== "string" || !SESSION_METADATA_KEY_PATTERN.test(key)) {
|
|
115
|
+
throw new RangeError("metadataKey must match /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/");
|
|
116
|
+
}
|
|
117
|
+
return key;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=contracts-core.js.map
|