@scotthuang/agent-knock-knock 0.13.3 → 0.13.4
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 +14 -0
- package/README.md +13 -5
- package/dist/src/callback-outbox-policy.js +27 -6
- package/dist/src/callback-outbox-policy.js.map +1 -1
- package/dist/src/callback-outbox-service.d.ts +4 -30
- package/dist/src/callback-outbox-service.js +21 -154
- package/dist/src/callback-outbox-service.js.map +1 -1
- package/dist/src/callback-outbox-settlement.js +13 -8
- package/dist/src/callback-outbox-settlement.js.map +1 -1
- package/dist/src/callback-route-service.d.ts +46 -0
- package/dist/src/callback-route-service.js +155 -0
- package/dist/src/callback-route-service.js.map +1 -0
- package/dist/src/codex-process-incarnation.d.ts +8 -0
- package/dist/src/codex-process-incarnation.js +36 -0
- package/dist/src/codex-process-incarnation.js.map +1 -0
- package/dist/src/deferred-foreground-conflict-policy.d.ts +22 -0
- package/dist/src/deferred-foreground-conflict-policy.js +52 -0
- package/dist/src/deferred-foreground-conflict-policy.js.map +1 -0
- package/dist/src/durable-notification-kernel.d.ts +94 -0
- package/dist/src/durable-notification-kernel.js +68 -0
- package/dist/src/durable-notification-kernel.js.map +1 -0
- package/dist/src/herdr-socket-transport.d.ts +43 -0
- package/dist/src/herdr-socket-transport.js +170 -0
- package/dist/src/herdr-socket-transport.js.map +1 -0
- package/dist/src/herdr-terminal-control-provider.d.ts +2 -45
- package/dist/src/herdr-terminal-control-provider.js +2 -172
- package/dist/src/herdr-terminal-control-provider.js.map +1 -1
- package/dist/src/host-adapter-capabilities.d.ts +35 -0
- package/dist/src/host-adapter-capabilities.js +146 -0
- package/dist/src/host-adapter-capabilities.js.map +1 -0
- package/dist/src/host-adapter.d.ts +9 -3
- package/dist/src/host-adapter.js +33 -9
- package/dist/src/host-adapter.js.map +1 -1
- package/dist/src/host-bridge-tools.d.ts +3 -4
- package/dist/src/host-bridge-tools.js +49 -92
- package/dist/src/host-bridge-tools.js.map +1 -1
- package/dist/src/host-bridge.js +5 -5
- package/dist/src/host-bridge.js.map +1 -1
- package/dist/src/host-monitor-reconciliation.d.ts +6 -0
- package/dist/src/host-monitor-reconciliation.js +96 -0
- package/dist/src/host-monitor-reconciliation.js.map +1 -0
- package/dist/src/native-thread-lifecycle-cli-adapter.js +116 -60
- package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
- package/dist/src/openclaw-list-projection.d.ts +2 -0
- package/dist/src/openclaw-list-projection.js +3 -0
- package/dist/src/openclaw-list-projection.js.map +1 -0
- package/dist/src/openclaw-model-facing-field-policy.d.ts +2 -0
- package/dist/src/openclaw-model-facing-field-policy.js +3 -0
- package/dist/src/openclaw-model-facing-field-policy.js.map +1 -0
- package/dist/src/openclaw-plugin-command-adapter.d.ts +6 -29
- package/dist/src/openclaw-plugin-command-adapter.js +7 -2660
- package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
- package/dist/src/openclaw-plugin-helpers.d.ts +2 -148
- package/dist/src/openclaw-plugin-helpers.js +2 -1844
- package/dist/src/openclaw-plugin-helpers.js.map +1 -1
- package/dist/src/openclaw-plugin-schemas.d.ts +2 -563
- package/dist/src/openclaw-plugin-schemas.js +2 -572
- package/dist/src/openclaw-plugin-schemas.js.map +1 -1
- package/dist/src/openclaw-plugin-supervisor.d.ts +4 -5
- package/dist/src/openclaw-plugin-supervisor.js +5 -94
- package/dist/src/openclaw-plugin-supervisor.js.map +1 -1
- package/dist/src/openclaw-plugin-value-helpers.d.ts +2 -0
- package/dist/src/openclaw-plugin-value-helpers.js +3 -0
- package/dist/src/openclaw-plugin-value-helpers.js.map +1 -0
- package/dist/src/openclaw-private-authority-offers.d.ts +4 -39
- package/dist/src/openclaw-private-authority-offers.js +3 -258
- package/dist/src/openclaw-private-authority-offers.js.map +1 -1
- package/dist/src/semantic-private-authority-offers.d.ts +41 -0
- package/dist/src/semantic-private-authority-offers.js +261 -0
- package/dist/src/semantic-private-authority-offers.js.map +1 -0
- package/dist/src/semantic-tool-arguments.d.ts +9 -0
- package/dist/src/semantic-tool-arguments.js +64 -0
- package/dist/src/semantic-tool-arguments.js.map +1 -0
- package/dist/src/semantic-tool-catalog.d.ts +48 -0
- package/dist/src/semantic-tool-catalog.js +105 -0
- package/dist/src/semantic-tool-catalog.js.map +1 -0
- package/dist/src/semantic-tool-command-helpers.d.ts +145 -0
- package/dist/src/semantic-tool-command-helpers.js +1272 -0
- package/dist/src/semantic-tool-command-helpers.js.map +1 -0
- package/dist/src/semantic-tool-list-projection.d.ts +10 -0
- package/dist/src/semantic-tool-list-projection.js +497 -0
- package/dist/src/semantic-tool-list-projection.js.map +1 -0
- package/dist/src/semantic-tool-model-facing-field-policy.d.ts +3 -0
- package/dist/src/semantic-tool-model-facing-field-policy.js +66 -0
- package/dist/src/semantic-tool-model-facing-field-policy.js.map +1 -0
- package/dist/src/semantic-tool-presentation.d.ts +37 -0
- package/dist/src/semantic-tool-presentation.js +680 -0
- package/dist/src/semantic-tool-presentation.js.map +1 -0
- package/dist/src/semantic-tool-private-authority.d.ts +39 -0
- package/dist/src/semantic-tool-private-authority.js +602 -0
- package/dist/src/semantic-tool-private-authority.js.map +1 -0
- package/dist/src/semantic-tool-relay.d.ts +16 -0
- package/dist/src/semantic-tool-relay.js +175 -0
- package/dist/src/semantic-tool-relay.js.map +1 -0
- package/dist/src/semantic-tool-runtime.d.ts +10 -0
- package/dist/src/semantic-tool-runtime.js +1157 -0
- package/dist/src/semantic-tool-runtime.js.map +1 -0
- package/dist/src/semantic-tool-schemas.d.ts +563 -0
- package/dist/src/semantic-tool-schemas.js +573 -0
- package/dist/src/semantic-tool-schemas.js.map +1 -0
- package/dist/src/semantic-tool-value-helpers.d.ts +5 -0
- package/dist/src/semantic-tool-value-helpers.js +27 -0
- package/dist/src/semantic-tool-value-helpers.js.map +1 -0
- package/dist/src/store-event-presentation.d.ts +17 -0
- package/dist/src/store-event-presentation.js +33 -0
- package/dist/src/store-event-presentation.js.map +1 -0
- package/dist/src/store.d.ts +3 -16
- package/dist/src/store.js +2 -30
- package/dist/src/store.js.map +1 -1
- package/dist/src/terminal-action-projection.d.ts +2 -98
- package/dist/src/terminal-action-projection.js +13 -215
- package/dist/src/terminal-action-projection.js.map +1 -1
- package/dist/src/terminal-agent-bridge.d.ts +14 -340
- package/dist/src/terminal-agent-bridge.js +155 -3226
- package/dist/src/terminal-agent-bridge.js.map +1 -1
- package/dist/src/terminal-approval-cli-adapter.d.ts +17 -0
- package/dist/src/terminal-approval-cli-adapter.js +921 -0
- package/dist/src/terminal-approval-cli-adapter.js.map +1 -0
- package/dist/src/terminal-command-cli-adapter.d.ts +2 -429
- package/dist/src/terminal-command-cli-adapter.js +344 -6061
- package/dist/src/terminal-command-cli-adapter.js.map +1 -1
- package/dist/src/terminal-command-cli-ports.d.ts +443 -0
- package/dist/src/terminal-command-cli-ports.js +2 -0
- package/dist/src/terminal-command-cli-ports.js.map +1 -0
- package/dist/src/terminal-command-dispatch-preparation.d.ts +81 -0
- package/dist/src/terminal-command-dispatch-preparation.js +209 -0
- package/dist/src/terminal-command-dispatch-preparation.js.map +1 -0
- package/dist/src/terminal-command-dispatch-transport.d.ts +35 -0
- package/dist/src/terminal-command-dispatch-transport.js +859 -0
- package/dist/src/terminal-command-dispatch-transport.js.map +1 -0
- package/dist/src/terminal-command-foreground-proof.d.ts +32 -0
- package/dist/src/terminal-command-foreground-proof.js +72 -0
- package/dist/src/terminal-command-foreground-proof.js.map +1 -0
- package/dist/src/terminal-command-send-preflight.d.ts +41 -0
- package/dist/src/terminal-command-send-preflight.js +86 -0
- package/dist/src/terminal-command-send-preflight.js.map +1 -0
- package/dist/src/terminal-composer-classifier.d.ts +55 -0
- package/dist/src/terminal-composer-classifier.js +638 -0
- package/dist/src/terminal-composer-classifier.js.map +1 -0
- package/dist/src/terminal-dispatch-recovery-authority.d.ts +56 -0
- package/dist/src/terminal-dispatch-recovery-authority.js +251 -0
- package/dist/src/terminal-dispatch-recovery-authority.js.map +1 -0
- package/dist/src/terminal-dispatch-recovery-cli-adapter.d.ts +1 -9
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js +5 -240
- package/dist/src/terminal-dispatch-recovery-cli-adapter.js.map +1 -1
- package/dist/src/terminal-handoff-cli-adapter.d.ts +1 -11
- package/dist/src/terminal-handoff-cli-adapter.js +2 -39
- package/dist/src/terminal-handoff-cli-adapter.js.map +1 -1
- package/dist/src/terminal-human-explicit-send-cli-adapter.d.ts +25 -0
- package/dist/src/terminal-human-explicit-send-cli-adapter.js +903 -0
- package/dist/src/terminal-human-explicit-send-cli-adapter.js.map +1 -0
- package/dist/src/terminal-identity-authority-cli-adapter.d.ts +1 -6
- package/dist/src/terminal-identity-authority-cli-adapter.js +3 -33
- package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
- package/dist/src/terminal-interaction-cli-adapter.js +209 -210
- package/dist/src/terminal-interaction-cli-adapter.js.map +1 -1
- package/dist/src/terminal-interaction-core.d.ts +0 -2
- package/dist/src/terminal-interaction-core.js +4 -3
- package/dist/src/terminal-interaction-core.js.map +1 -1
- package/dist/src/terminal-interaction-protocol.d.ts +21 -0
- package/dist/src/terminal-interaction-protocol.js +74 -0
- package/dist/src/terminal-interaction-protocol.js.map +1 -1
- package/dist/src/terminal-interaction-response-bridge.d.ts +126 -0
- package/dist/src/terminal-interaction-response-bridge.js +579 -0
- package/dist/src/terminal-interaction-response-bridge.js.map +1 -0
- package/dist/src/terminal-interaction-response-transaction.d.ts +44 -0
- package/dist/src/terminal-interaction-response-transaction.js +56 -0
- package/dist/src/terminal-interaction-response-transaction.js.map +1 -0
- package/dist/src/terminal-list-action-policy.d.ts +43 -0
- package/dist/src/terminal-list-action-policy.js +164 -0
- package/dist/src/terminal-list-action-policy.js.map +1 -0
- package/dist/src/terminal-list-cli-adapter.d.ts +6 -36
- package/dist/src/terminal-list-cli-adapter.js +241 -1946
- package/dist/src/terminal-list-cli-adapter.js.map +1 -1
- package/dist/src/terminal-list-facts.d.ts +129 -0
- package/dist/src/terminal-list-facts.js +179 -0
- package/dist/src/terminal-list-facts.js.map +1 -0
- package/dist/src/terminal-list-inventory.d.ts +59 -0
- package/dist/src/terminal-list-inventory.js +194 -0
- package/dist/src/terminal-list-inventory.js.map +1 -0
- package/dist/src/terminal-list-ownership-service.d.ts +118 -0
- package/dist/src/terminal-list-ownership-service.js +1003 -0
- package/dist/src/terminal-list-ownership-service.js.map +1 -0
- package/dist/src/terminal-list-projection-service.d.ts +49 -0
- package/dist/src/terminal-list-projection-service.js +407 -0
- package/dist/src/terminal-list-projection-service.js.map +1 -0
- package/dist/src/terminal-list-renderer.d.ts +11 -11
- package/dist/src/terminal-list-renderer.js +168 -119
- package/dist/src/terminal-list-renderer.js.map +1 -1
- package/dist/src/terminal-managed-send-cli-adapter.d.ts +33 -0
- package/dist/src/terminal-managed-send-cli-adapter.js +994 -0
- package/dist/src/terminal-managed-send-cli-adapter.js.map +1 -0
- package/dist/src/terminal-managed-turn-list-action-policy.d.ts +47 -0
- package/dist/src/terminal-managed-turn-list-action-policy.js +64 -0
- package/dist/src/terminal-managed-turn-list-action-policy.js.map +1 -0
- package/dist/src/terminal-model-control-action-policy.d.ts +60 -0
- package/dist/src/terminal-model-control-action-policy.js +96 -0
- package/dist/src/terminal-model-control-action-policy.js.map +1 -0
- package/dist/src/terminal-model-control-availability.d.ts +68 -0
- package/dist/src/terminal-model-control-availability.js +157 -0
- package/dist/src/terminal-model-control-availability.js.map +1 -0
- package/dist/src/terminal-model-control-bridge.d.ts +48 -0
- package/dist/src/terminal-model-control-bridge.js +259 -0
- package/dist/src/terminal-model-control-bridge.js.map +1 -0
- package/dist/src/terminal-model-control-profile.d.ts +55 -0
- package/dist/src/terminal-model-control-profile.js +137 -0
- package/dist/src/terminal-model-control-profile.js.map +1 -0
- package/dist/src/terminal-model-control-subject.d.ts +34 -0
- package/dist/src/terminal-model-control-subject.js +58 -0
- package/dist/src/terminal-model-control-subject.js.map +1 -0
- package/dist/src/terminal-model-control-transaction.d.ts +19 -0
- package/dist/src/terminal-model-control-transaction.js +39 -0
- package/dist/src/terminal-model-control-transaction.js.map +1 -0
- package/dist/src/terminal-model-control.d.ts +37 -18
- package/dist/src/terminal-model-control.js +285 -194
- package/dist/src/terminal-model-control.js.map +1 -1
- package/dist/src/terminal-monitor-application-service.js +50 -17
- package/dist/src/terminal-monitor-application-service.js.map +1 -1
- package/dist/src/terminal-native-inspection-bridge.d.ts +211 -0
- package/dist/src/terminal-native-inspection-bridge.js +1127 -0
- package/dist/src/terminal-native-inspection-bridge.js.map +1 -0
- package/dist/src/terminal-runtime-cli-adapter.d.ts +2 -2
- package/dist/src/terminal-runtime-cli-adapter.js.map +1 -1
- package/dist/src/terminal-submission-retry-application.d.ts +24 -0
- package/dist/src/terminal-submission-retry-application.js +402 -0
- package/dist/src/terminal-submission-retry-application.js.map +1 -0
- package/dist/src/terminal-submission-retry-ports.d.ts +30 -0
- package/dist/src/terminal-submission-retry-ports.js +2 -0
- package/dist/src/terminal-submission-retry-ports.js.map +1 -0
- package/dist/src/terminal-submission-retry-reconciliation.d.ts +236 -0
- package/dist/src/terminal-submission-retry-reconciliation.js +1130 -0
- package/dist/src/terminal-submission-retry-reconciliation.js.map +1 -0
- package/dist/src/terminal-submission-retry-transport.d.ts +58 -0
- package/dist/src/terminal-submission-retry-transport.js +675 -0
- package/dist/src/terminal-submission-retry-transport.js.map +1 -0
- package/dist/src/terminal-text-submission-bridge.d.ts +200 -0
- package/dist/src/terminal-text-submission-bridge.js +632 -0
- package/dist/src/terminal-text-submission-bridge.js.map +1 -0
- package/dist/src/terminal-user-explicit-send-policy.d.ts +29 -0
- package/dist/src/terminal-user-explicit-send-policy.js +46 -0
- package/dist/src/terminal-user-explicit-send-policy.js.map +1 -0
- package/dist/src/terminal-watch-cli-adapter.js +91 -143
- package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
- package/dist/src/terminal-watch-codec.d.ts +9 -0
- package/dist/src/terminal-watch-codec.js +1051 -0
- package/dist/src/terminal-watch-codec.js.map +1 -0
- package/dist/src/terminal-watch-interaction-response-store.d.ts +19 -0
- package/dist/src/terminal-watch-interaction-response-store.js +87 -0
- package/dist/src/terminal-watch-interaction-response-store.js.map +1 -0
- package/dist/src/terminal-watch-record.d.ts +319 -0
- package/dist/src/terminal-watch-record.js +742 -0
- package/dist/src/terminal-watch-record.js.map +1 -0
- package/dist/src/terminal-watch-service.js +48 -27
- package/dist/src/terminal-watch-service.js.map +1 -1
- package/dist/src/terminal-watch-store.d.ts +3 -279
- package/dist/src/terminal-watch-store.js +5 -1779
- package/dist/src/terminal-watch-store.js.map +1 -1
- package/package.json +7 -2
- package/templates/openclaw-skills/agent-knock-knock/SKILL.md +1 -1
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
export const SEMANTIC_PRIVATE_AUTHORITY_OFFER_TTL_MS = 10 * 60 * 1000;
|
|
2
|
+
export const SEMANTIC_PRIVATE_AUTHORITY_OFFER_LIMIT = 512;
|
|
3
|
+
export const SEMANTIC_APPROVAL_AUTHORITY_KIND = "approval";
|
|
4
|
+
export const SEMANTIC_INTERACTION_AUTHORITY_KIND = "interaction";
|
|
5
|
+
export const SEMANTIC_INTERACTION_AUTHORITY_SUBJECT_KINDS = [
|
|
6
|
+
"managed_turn",
|
|
7
|
+
"terminal_watch"
|
|
8
|
+
];
|
|
9
|
+
const storesByApi = new WeakMap();
|
|
10
|
+
export function semanticApprovalAuthorityOfferKey(sessionKey, sessionId, target) {
|
|
11
|
+
return {
|
|
12
|
+
sessionKey,
|
|
13
|
+
sessionId,
|
|
14
|
+
kind: SEMANTIC_APPROVAL_AUTHORITY_KIND,
|
|
15
|
+
target
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function semanticInteractionAuthorityOfferKey(sessionKey, sessionId, subjectKindOrTurnId, subjectIdOrInteractionId, explicitInteractionId) {
|
|
19
|
+
const legacyManagedTurn = explicitInteractionId === undefined;
|
|
20
|
+
const subjectKind = legacyManagedTurn
|
|
21
|
+
? "managed_turn"
|
|
22
|
+
: interactionAuthoritySubjectKind(subjectKindOrTurnId);
|
|
23
|
+
const subjectId = exactNonBlank(legacyManagedTurn ? subjectKindOrTurnId : subjectIdOrInteractionId, "interaction subject id");
|
|
24
|
+
const interactionId = exactNonBlank(legacyManagedTurn ? subjectIdOrInteractionId : explicitInteractionId, "interaction id");
|
|
25
|
+
return {
|
|
26
|
+
sessionKey,
|
|
27
|
+
sessionId,
|
|
28
|
+
kind: SEMANTIC_INTERACTION_AUTHORITY_KIND,
|
|
29
|
+
target: {
|
|
30
|
+
type: "interaction_subject",
|
|
31
|
+
id: JSON.stringify([subjectKind, subjectId, interactionId])
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function semanticManagedTurnInteractionAuthorityOfferKey(sessionKey, sessionId, turnId, interactionId) {
|
|
36
|
+
return semanticInteractionAuthorityOfferKey(sessionKey, sessionId, "managed_turn", turnId, interactionId);
|
|
37
|
+
}
|
|
38
|
+
export function semanticTerminalWatchInteractionAuthorityOfferKey(sessionKey, sessionId, watchId, interactionId) {
|
|
39
|
+
return semanticInteractionAuthorityOfferKey(sessionKey, sessionId, "terminal_watch", watchId, interactionId);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Invalidates every interaction response offer previously displayed for one
|
|
43
|
+
* exact subject in one exact controller conversation. Status uses this as a
|
|
44
|
+
* refresh boundary before it publishes at most one offer from the new
|
|
45
|
+
* snapshot, so an old interaction id cannot remain actionable for the rest of
|
|
46
|
+
* its TTL after the terminal UI disappears or changes.
|
|
47
|
+
*/
|
|
48
|
+
export function invalidateSemanticInteractionAuthorityOffersForSubject(api, sessionKey, sessionId, subjectKind, subjectId, nowMs = Date.now()) {
|
|
49
|
+
const exactApi = assertApi(api);
|
|
50
|
+
const exactSessionKey = exactNonBlank(sessionKey, "sessionKey");
|
|
51
|
+
const exactSessionId = exactNonBlank(sessionId, "sessionId");
|
|
52
|
+
const exactSubjectKind = interactionAuthoritySubjectKind(subjectKind);
|
|
53
|
+
const exactSubjectId = exactNonBlank(subjectId, "interaction subject id");
|
|
54
|
+
assertNow(nowMs);
|
|
55
|
+
const store = storesByApi.get(exactApi);
|
|
56
|
+
if (!store)
|
|
57
|
+
return 0;
|
|
58
|
+
pruneExpiredOffers(store, nowMs);
|
|
59
|
+
let invalidated = 0;
|
|
60
|
+
for (const normalizedKey of store.entries.keys()) {
|
|
61
|
+
if (normalizedInteractionOfferMatchesSubject(normalizedKey, exactSessionKey, exactSessionId, exactSubjectKind, exactSubjectId)) {
|
|
62
|
+
store.entries.delete(normalizedKey);
|
|
63
|
+
invalidated += 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return invalidated;
|
|
67
|
+
}
|
|
68
|
+
export function rememberSemanticPrivateAuthorityOffer(api, key, payload, nowMs = Date.now()) {
|
|
69
|
+
const normalizedKey = privateAuthorityOfferKey(key);
|
|
70
|
+
const store = privateAuthorityOfferStore(api);
|
|
71
|
+
assertNow(nowMs);
|
|
72
|
+
pruneExpiredOffers(store, nowMs);
|
|
73
|
+
const previous = store.entries.get(normalizedKey)?.payload;
|
|
74
|
+
const authorityChanged = privateAuthorityPayloadChanged(previous, payload);
|
|
75
|
+
const merged = mergePrivateAuthorityPayload(previous, payload);
|
|
76
|
+
const invalidated = authorityChanged || (previous?.invalidated === true);
|
|
77
|
+
const storedPayload = {
|
|
78
|
+
...merged,
|
|
79
|
+
...(invalidated ? { invalidated: true } : {})
|
|
80
|
+
};
|
|
81
|
+
if (!invalidated)
|
|
82
|
+
delete storedPayload.invalidated;
|
|
83
|
+
store.entries.delete(normalizedKey);
|
|
84
|
+
while (store.entries.size >= SEMANTIC_PRIVATE_AUTHORITY_OFFER_LIMIT) {
|
|
85
|
+
const oldest = store.entries.keys().next().value;
|
|
86
|
+
if (typeof oldest !== "string")
|
|
87
|
+
break;
|
|
88
|
+
store.entries.delete(oldest);
|
|
89
|
+
}
|
|
90
|
+
store.entries.set(normalizedKey, {
|
|
91
|
+
expiresAtMs: nowMs + SEMANTIC_PRIVATE_AUTHORITY_OFFER_TTL_MS,
|
|
92
|
+
payload: cloneAndFreezePayload(storedPayload)
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
export function peekSemanticPrivateAuthorityOffer(api, key, nowMs = Date.now()) {
|
|
96
|
+
return readPrivateAuthorityOffer(api, key, false, nowMs);
|
|
97
|
+
}
|
|
98
|
+
export function consumeSemanticPrivateAuthorityOffer(api, key, nowMs = Date.now()) {
|
|
99
|
+
return readPrivateAuthorityOffer(api, key, true, nowMs);
|
|
100
|
+
}
|
|
101
|
+
function readPrivateAuthorityOffer(api, key, consume, nowMs) {
|
|
102
|
+
assertNow(nowMs);
|
|
103
|
+
const store = storesByApi.get(assertApi(api));
|
|
104
|
+
if (!store)
|
|
105
|
+
return undefined;
|
|
106
|
+
const normalizedKey = privateAuthorityOfferKey(key);
|
|
107
|
+
const offer = store.entries.get(normalizedKey);
|
|
108
|
+
if (!offer) {
|
|
109
|
+
pruneExpiredOffers(store, nowMs);
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
if (offer.expiresAtMs <= nowMs) {
|
|
113
|
+
store.entries.delete(normalizedKey);
|
|
114
|
+
pruneExpiredOffers(store, nowMs);
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
if (offer.payload.invalidated === true) {
|
|
118
|
+
if (consume)
|
|
119
|
+
store.entries.delete(normalizedKey);
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
if (consume)
|
|
123
|
+
store.entries.delete(normalizedKey);
|
|
124
|
+
return offer.payload;
|
|
125
|
+
}
|
|
126
|
+
function privateAuthorityOfferStore(api) {
|
|
127
|
+
const exactApi = assertApi(api);
|
|
128
|
+
const existing = storesByApi.get(exactApi);
|
|
129
|
+
if (existing)
|
|
130
|
+
return existing;
|
|
131
|
+
const created = { entries: new Map() };
|
|
132
|
+
storesByApi.set(exactApi, created);
|
|
133
|
+
return created;
|
|
134
|
+
}
|
|
135
|
+
function privateAuthorityOfferKey(key) {
|
|
136
|
+
const sessionKey = exactNonBlank(key?.sessionKey, "sessionKey");
|
|
137
|
+
const sessionId = exactNonBlank(key?.sessionId, "sessionId");
|
|
138
|
+
const kind = exactIdentifier(key?.kind, "kind");
|
|
139
|
+
const targetType = exactIdentifier(key?.target?.type, "target.type");
|
|
140
|
+
const targetId = exactNonBlank(key?.target?.id, "target.id");
|
|
141
|
+
return JSON.stringify([sessionKey, sessionId, kind, targetType, targetId]);
|
|
142
|
+
}
|
|
143
|
+
function normalizedInteractionOfferMatchesSubject(normalizedKey, sessionKey, sessionId, subjectKind, subjectId) {
|
|
144
|
+
try {
|
|
145
|
+
const key = JSON.parse(normalizedKey);
|
|
146
|
+
if (!Array.isArray(key) ||
|
|
147
|
+
key.length !== 5 ||
|
|
148
|
+
key[0] !== sessionKey ||
|
|
149
|
+
key[1] !== sessionId ||
|
|
150
|
+
key[2] !== SEMANTIC_INTERACTION_AUTHORITY_KIND ||
|
|
151
|
+
key[3] !== "interaction_subject" ||
|
|
152
|
+
typeof key[4] !== "string") {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
const target = JSON.parse(key[4]);
|
|
156
|
+
return Array.isArray(target) &&
|
|
157
|
+
target.length === 3 &&
|
|
158
|
+
target[0] === subjectKind &&
|
|
159
|
+
target[1] === subjectId &&
|
|
160
|
+
typeof target[2] === "string";
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function exactIdentifier(value, label) {
|
|
167
|
+
const text = exactNonBlank(value, label);
|
|
168
|
+
if (!/^[a-z][a-z0-9_.-]{0,63}$/u.test(text)) {
|
|
169
|
+
throw new Error(`private authority offer ${label} is invalid`);
|
|
170
|
+
}
|
|
171
|
+
return text;
|
|
172
|
+
}
|
|
173
|
+
function interactionAuthoritySubjectKind(value) {
|
|
174
|
+
if (!SEMANTIC_INTERACTION_AUTHORITY_SUBJECT_KINDS.includes(value)) {
|
|
175
|
+
throw new Error("private authority offer interaction subject kind is invalid");
|
|
176
|
+
}
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
function exactNonBlank(value, label) {
|
|
180
|
+
if (typeof value !== "string" ||
|
|
181
|
+
value.length === 0 ||
|
|
182
|
+
value.trim() !== value) {
|
|
183
|
+
throw new Error(`private authority offer ${label} must be exact and non-empty`);
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
function assertApi(api) {
|
|
188
|
+
if ((typeof api !== "object" || api === null) && typeof api !== "function") {
|
|
189
|
+
throw new Error("private authority offer api must be an object");
|
|
190
|
+
}
|
|
191
|
+
return api;
|
|
192
|
+
}
|
|
193
|
+
function assertNow(nowMs) {
|
|
194
|
+
if (!Number.isFinite(nowMs)) {
|
|
195
|
+
throw new Error("private authority offer clock must be finite");
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function pruneExpiredOffers(store, nowMs) {
|
|
199
|
+
for (const [key, offer] of store.entries) {
|
|
200
|
+
if (offer.expiresAtMs <= nowMs)
|
|
201
|
+
store.entries.delete(key);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function cloneAndFreezePayload(payload) {
|
|
205
|
+
if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
|
|
206
|
+
throw new Error("private authority offer payload must be an object");
|
|
207
|
+
}
|
|
208
|
+
let cloned;
|
|
209
|
+
try {
|
|
210
|
+
cloned = structuredClone(payload);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
throw new Error("private authority offer payload must be structured-cloneable");
|
|
214
|
+
}
|
|
215
|
+
return deepFreeze(cloned, new WeakSet());
|
|
216
|
+
}
|
|
217
|
+
function mergePrivateAuthorityPayload(previous, update) {
|
|
218
|
+
const definedUpdate = Object.fromEntries(Object.entries(update).filter(([, value]) => value !== undefined));
|
|
219
|
+
const previousArgs = isPlainRecord(previous?.args) ? previous.args : {};
|
|
220
|
+
const updateArgs = isPlainRecord(definedUpdate.args)
|
|
221
|
+
? definedUpdate.args
|
|
222
|
+
: undefined;
|
|
223
|
+
return {
|
|
224
|
+
...(previous ?? {}),
|
|
225
|
+
...definedUpdate,
|
|
226
|
+
...(updateArgs
|
|
227
|
+
? { args: { ...previousArgs, ...updateArgs } }
|
|
228
|
+
: Object.keys(previousArgs).length > 0
|
|
229
|
+
? { args: previousArgs }
|
|
230
|
+
: {})
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function privateAuthorityPayloadChanged(previous, update) {
|
|
234
|
+
if (!previous)
|
|
235
|
+
return false;
|
|
236
|
+
const nextFingerprint = update.fingerprint;
|
|
237
|
+
if (nextFingerprint !== undefined &&
|
|
238
|
+
previous.fingerprint !== undefined &&
|
|
239
|
+
nextFingerprint !== previous.fingerprint) {
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
const previousArgs = isPlainRecord(previous.args) ? previous.args : {};
|
|
243
|
+
const updateArgs = isPlainRecord(update.args) ? update.args : undefined;
|
|
244
|
+
if (!updateArgs)
|
|
245
|
+
return false;
|
|
246
|
+
return Object.keys(previousArgs).length > 0 &&
|
|
247
|
+
JSON.stringify(previousArgs) !== JSON.stringify(updateArgs);
|
|
248
|
+
}
|
|
249
|
+
function isPlainRecord(value) {
|
|
250
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
251
|
+
}
|
|
252
|
+
function deepFreeze(value, seen) {
|
|
253
|
+
if (typeof value !== "object" || value === null || seen.has(value)) {
|
|
254
|
+
return value;
|
|
255
|
+
}
|
|
256
|
+
seen.add(value);
|
|
257
|
+
for (const nested of Object.values(value))
|
|
258
|
+
deepFreeze(nested, seen);
|
|
259
|
+
return Object.freeze(value);
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=semantic-private-authority-offers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-private-authority-offers.js","sourceRoot":"","sources":["../../src/semantic-private-authority-offers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function pushTurnTarget(args: any, params: any): void;
|
|
2
|
+
export declare function authoritativeManagedId(value: any, name: any): string;
|
|
3
|
+
export declare function assertExclusiveRecoveryFence(params: any): void;
|
|
4
|
+
export declare function pushOptional(args: any, flag: any, value: any): void;
|
|
5
|
+
export declare function numberString(value: any): string | undefined;
|
|
6
|
+
export declare function requiredString(value: any, name: any): string;
|
|
7
|
+
export declare function requiredControllerSessionKey(value: unknown): string;
|
|
8
|
+
export declare function requiredControllerSessionId(value: unknown): string;
|
|
9
|
+
export declare function requiredTerminalInteractionIdentifier(value: unknown, name: string): string;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { nonBlankString as stringValue } from "./value-guards.js";
|
|
2
|
+
import { TERMINAL_INTERACTION_LIMITS } from "./terminal-interaction-protocol.js";
|
|
3
|
+
export function pushTurnTarget(args, params) {
|
|
4
|
+
if (Object.hasOwn(params, "turn_id") && Object.hasOwn(params, "conversation_id")) {
|
|
5
|
+
throw new Error("turn-target tools accept only one of turn_id or conversation_id");
|
|
6
|
+
}
|
|
7
|
+
const turnId = stringValue(params.turn_id);
|
|
8
|
+
if (turnId) {
|
|
9
|
+
args.push("--turn", authoritativeManagedId(turnId, "turn_id"));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
args.push("--conversation", requiredString(params.conversation_id, "turn_id"));
|
|
13
|
+
}
|
|
14
|
+
export function authoritativeManagedId(value, name) {
|
|
15
|
+
const id = requiredString(value, name).trim();
|
|
16
|
+
if (/^(?:only|latest|codex|claude|(?:codex|claude):latest)$/iu.test(id) ||
|
|
17
|
+
/^@[0-9a-f]+$/iu.test(id) ||
|
|
18
|
+
/^terminal:/iu.test(id)) {
|
|
19
|
+
throw new Error(`${name} must be an authoritative managed id, not a discovery selector or terminal id`);
|
|
20
|
+
}
|
|
21
|
+
return id;
|
|
22
|
+
}
|
|
23
|
+
export function assertExclusiveRecoveryFence(params) {
|
|
24
|
+
const expectedMessageId = stringValue(params.expected_message_id);
|
|
25
|
+
const expectedTransitionId = stringValue(params.expected_transition_id);
|
|
26
|
+
const closeFenceCount = [expectedMessageId, expectedTransitionId]
|
|
27
|
+
.filter(Boolean).length;
|
|
28
|
+
if (closeFenceCount > 1) {
|
|
29
|
+
throw new Error("close accepts only one of expected_message_id or expected_transition_id");
|
|
30
|
+
}
|
|
31
|
+
if (stringValue(params.reason) === "superseded_by_human_context_switch" &&
|
|
32
|
+
(!stringValue(params.turn_id) || stringValue(params.conversation_id))) {
|
|
33
|
+
throw new Error("human-context handoff Close requires the exact managed turn_id");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function pushOptional(args, flag, value) {
|
|
37
|
+
if (value !== undefined && value !== "") {
|
|
38
|
+
args.push(flag, value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function numberString(value) {
|
|
42
|
+
return typeof value === "number" && Number.isFinite(value) ? String(value) : undefined;
|
|
43
|
+
}
|
|
44
|
+
export function requiredString(value, name) {
|
|
45
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
46
|
+
throw new Error(`${name} is required`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
export function requiredControllerSessionKey(value) {
|
|
51
|
+
return requiredString(value, "Controller session identity for this confirmed action");
|
|
52
|
+
}
|
|
53
|
+
export function requiredControllerSessionId(value) {
|
|
54
|
+
return requiredString(value, "Controller conversation incarnation for this confirmed action");
|
|
55
|
+
}
|
|
56
|
+
export function requiredTerminalInteractionIdentifier(value, name) {
|
|
57
|
+
const identifier = requiredString(value, name);
|
|
58
|
+
if (identifier.length > TERMINAL_INTERACTION_LIMITS.maxIdentifierLength ||
|
|
59
|
+
!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/u.test(identifier)) {
|
|
60
|
+
throw new Error(`${name} must be an exact safe interaction identifier`);
|
|
61
|
+
}
|
|
62
|
+
return identifier;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=semantic-tool-arguments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-tool-arguments.js","sourceRoot":"","sources":["../../src/semantic-tool-arguments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface SemanticToolControllerContext {
|
|
2
|
+
readonly sessionKey?: unknown;
|
|
3
|
+
readonly sessionId?: unknown;
|
|
4
|
+
}
|
|
5
|
+
export interface SemanticCommandControllerContext extends SemanticToolControllerContext {
|
|
6
|
+
readonly args?: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface SemanticCommandCatalogEntry {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly description: string;
|
|
11
|
+
readonly acceptsArgs: boolean;
|
|
12
|
+
readonly requiresAuthentication: boolean;
|
|
13
|
+
readonly progressMessage: string;
|
|
14
|
+
readonly promptGuidance: readonly string[];
|
|
15
|
+
execute(context: SemanticCommandControllerContext): Promise<unknown> | unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface SemanticToolCatalogEntry {
|
|
18
|
+
readonly label: string;
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
22
|
+
execute(context: SemanticToolControllerContext, toolCallId: unknown, args: unknown, signal?: AbortSignal): Promise<unknown> | unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface SemanticToolCatalog {
|
|
25
|
+
readonly command: SemanticCommandCatalogEntry;
|
|
26
|
+
readonly tools: readonly SemanticToolCatalogEntry[];
|
|
27
|
+
}
|
|
28
|
+
export interface SemanticToolCatalogRegistrar {
|
|
29
|
+
registerCommand?(command: Readonly<Record<string, unknown>>): void;
|
|
30
|
+
registerTool(factory: (context: SemanticToolControllerContext) => Readonly<Record<string, unknown>>, registration: {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly optional: true;
|
|
33
|
+
}): void;
|
|
34
|
+
}
|
|
35
|
+
export declare function beginSemanticToolCatalog(runtime: object): void;
|
|
36
|
+
export declare function defineSemanticCatalogTool(runtime: object, tool: SemanticToolCatalogEntry): void;
|
|
37
|
+
export declare function semanticToolLabel(name: string): string;
|
|
38
|
+
export declare function finishSemanticToolCatalog(runtime: object, command: SemanticCommandCatalogEntry): SemanticToolCatalog;
|
|
39
|
+
/** Adapt one catalog to a context-factory registration API such as OpenClaw. */
|
|
40
|
+
export declare function registerSemanticToolCatalog(registrar: SemanticToolCatalogRegistrar, catalog: SemanticToolCatalog): void;
|
|
41
|
+
/**
|
|
42
|
+
* Freeze one host-neutral semantic catalog after checking its public identity.
|
|
43
|
+
*
|
|
44
|
+
* The catalog owns tool order, metadata, schema references, and execution
|
|
45
|
+
* factories. Host-specific registration APIs adapt this value; they are not a
|
|
46
|
+
* source of tool definitions.
|
|
47
|
+
*/
|
|
48
|
+
export declare function defineSemanticToolCatalog(command: SemanticCommandCatalogEntry, tools: readonly SemanticToolCatalogEntry[]): SemanticToolCatalog;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const pendingToolsByRuntime = new WeakMap();
|
|
2
|
+
export function beginSemanticToolCatalog(runtime) {
|
|
3
|
+
if (pendingToolsByRuntime.has(runtime)) {
|
|
4
|
+
throw new Error("semantic tool catalog construction is already active");
|
|
5
|
+
}
|
|
6
|
+
pendingToolsByRuntime.set(runtime, []);
|
|
7
|
+
}
|
|
8
|
+
export function defineSemanticCatalogTool(runtime, tool) {
|
|
9
|
+
const tools = pendingToolsByRuntime.get(runtime);
|
|
10
|
+
if (!tools) {
|
|
11
|
+
throw new Error("semantic tools must be defined inside catalog construction");
|
|
12
|
+
}
|
|
13
|
+
tools.push(tool);
|
|
14
|
+
}
|
|
15
|
+
export function semanticToolLabel(name) {
|
|
16
|
+
const action = name.replace(/^agent_knock_knock_/u, "")
|
|
17
|
+
.split("_").filter(Boolean)
|
|
18
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
19
|
+
.join(" ");
|
|
20
|
+
return `AKK ${action || "Tool"}`;
|
|
21
|
+
}
|
|
22
|
+
export function finishSemanticToolCatalog(runtime, command) {
|
|
23
|
+
const tools = pendingToolsByRuntime.get(runtime);
|
|
24
|
+
if (!tools) {
|
|
25
|
+
throw new Error("semantic tool catalog construction is not active");
|
|
26
|
+
}
|
|
27
|
+
pendingToolsByRuntime.delete(runtime);
|
|
28
|
+
return defineSemanticToolCatalog(command, tools);
|
|
29
|
+
}
|
|
30
|
+
/** Adapt one catalog to a context-factory registration API such as OpenClaw. */
|
|
31
|
+
export function registerSemanticToolCatalog(registrar, catalog) {
|
|
32
|
+
registrar.registerCommand?.({
|
|
33
|
+
name: catalog.command.name,
|
|
34
|
+
description: catalog.command.description,
|
|
35
|
+
acceptsArgs: catalog.command.acceptsArgs,
|
|
36
|
+
requireAuth: catalog.command.requiresAuthentication,
|
|
37
|
+
nativeProgressMessages: { default: catalog.command.progressMessage },
|
|
38
|
+
agentPromptGuidance: catalog.command.promptGuidance,
|
|
39
|
+
handler: async (context) => catalog.command.execute(context)
|
|
40
|
+
});
|
|
41
|
+
for (const tool of catalog.tools) {
|
|
42
|
+
registrar.registerTool((context) => ({
|
|
43
|
+
label: tool.label,
|
|
44
|
+
name: tool.name,
|
|
45
|
+
description: tool.description,
|
|
46
|
+
parameters: tool.inputSchema,
|
|
47
|
+
execute: (toolCallId, args, signal) => tool.execute(context, toolCallId, args, signal)
|
|
48
|
+
}), { name: tool.name, optional: true });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Freeze one host-neutral semantic catalog after checking its public identity.
|
|
53
|
+
*
|
|
54
|
+
* The catalog owns tool order, metadata, schema references, and execution
|
|
55
|
+
* factories. Host-specific registration APIs adapt this value; they are not a
|
|
56
|
+
* source of tool definitions.
|
|
57
|
+
*/
|
|
58
|
+
export function defineSemanticToolCatalog(command, tools) {
|
|
59
|
+
const exactCommand = Object.freeze({
|
|
60
|
+
...command,
|
|
61
|
+
promptGuidance: Object.freeze([...command.promptGuidance])
|
|
62
|
+
});
|
|
63
|
+
requiredString(exactCommand.name, "semantic command name");
|
|
64
|
+
requiredString(exactCommand.description, "semantic command description");
|
|
65
|
+
requiredString(exactCommand.progressMessage, "semantic command progress message");
|
|
66
|
+
if (!Array.isArray(exactCommand.promptGuidance) ||
|
|
67
|
+
exactCommand.promptGuidance.some((value) => typeof value !== "string" || value.length === 0)) {
|
|
68
|
+
throw new Error("semantic command prompt guidance is invalid");
|
|
69
|
+
}
|
|
70
|
+
if (typeof exactCommand.execute !== "function") {
|
|
71
|
+
throw new Error("semantic command execute is required");
|
|
72
|
+
}
|
|
73
|
+
const names = new Set();
|
|
74
|
+
const exactTools = tools.map((tool) => {
|
|
75
|
+
const exactTool = Object.freeze({ ...tool });
|
|
76
|
+
const name = requiredString(exactTool.name, "semantic tool name");
|
|
77
|
+
requiredString(exactTool.label, `semantic tool ${name} label`);
|
|
78
|
+
requiredString(exactTool.description, `semantic tool ${name} description`);
|
|
79
|
+
if (!isRecord(exactTool.inputSchema)) {
|
|
80
|
+
throw new Error(`semantic tool ${name} input schema is required`);
|
|
81
|
+
}
|
|
82
|
+
if (typeof exactTool.execute !== "function") {
|
|
83
|
+
throw new Error(`semantic tool ${name} execute is required`);
|
|
84
|
+
}
|
|
85
|
+
if (names.has(name)) {
|
|
86
|
+
throw new Error(`duplicate semantic tool ${name}`);
|
|
87
|
+
}
|
|
88
|
+
names.add(name);
|
|
89
|
+
return exactTool;
|
|
90
|
+
});
|
|
91
|
+
return Object.freeze({
|
|
92
|
+
command: exactCommand,
|
|
93
|
+
tools: Object.freeze(exactTools)
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function requiredString(value, label) {
|
|
97
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
98
|
+
throw new Error(`${label} is required`);
|
|
99
|
+
}
|
|
100
|
+
return value;
|
|
101
|
+
}
|
|
102
|
+
function isRecord(value) {
|
|
103
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=semantic-tool-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-tool-catalog.js","sourceRoot":"","sources":["../../src/semantic-tool-catalog.ts"],"names":[],"mappings":"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"}
|