@sema-agent/client-core 0.99.0 → 0.101.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/CHANGELOG.md +572 -0
- package/README.md +174 -114
- package/dist/adapt/arms.js +109 -50
- package/dist/adapt/panelTasks.d.ts +2 -1
- package/dist/adapt/panelTasks.js +32 -9
- package/dist/adapt/textStream.d.ts +1 -1
- package/dist/adapt/textStream.js +58 -32
- package/dist/adapt/toolCards.js +9 -8
- package/dist/adapt.js +7 -1
- package/dist/adapter/activeRunSelfHeal.d.ts +31 -2
- package/dist/adapter/activeRunSelfHeal.js +162 -13
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +25 -6
- package/dist/adapter/downstream/eventToSdkMessage.js +157 -20
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
- package/dist/adapter/downstream/terminalToSdkResult.js +219 -39
- package/dist/adapter/downstream/wiringManifestView.d.ts +3 -1
- package/dist/adapter/downstream/wiringManifestView.js +1 -0
- package/dist/adapter/runStream.d.ts +4 -4
- package/dist/adapter/runStream.js +184 -42
- package/dist/adapter/types.d.ts +2 -0
- package/dist/agentsWireCaps.d.ts +9 -7
- package/dist/agentsWireCaps.js +101 -17
- package/dist/approvalDecidedByCapability.js +2 -2
- package/dist/approvalFrameFamilies.d.ts +33 -0
- package/dist/approvalFrameFamilies.js +120 -0
- package/dist/approvalsStreamLiveCapability.js +2 -2
- package/dist/attachmentsWireCaps.js +41 -13
- package/dist/callerCwdCapability.js +2 -2
- package/dist/centerWiringCapability.js +2 -2
- package/dist/clockReading.d.ts +2 -0
- package/dist/clockReading.js +4 -0
- package/dist/cloudConfigWireCaps.d.ts +28 -5
- package/dist/cloudConfigWireCaps.js +334 -103
- package/dist/compactionStatus.d.ts +34 -0
- package/dist/compactionStatus.js +196 -0
- package/dist/coreValuePorts.d.ts +12 -2
- package/dist/coreValuePorts.js +9 -0
- package/dist/decideFailureNote.js +8 -6
- package/dist/decideReceipt.js +2 -2
- package/dist/deviceExecutorManagementCapability.js +2 -2
- package/dist/deviceFlowPolling.js +1 -1
- package/dist/disableSkillsWire.d.ts +1 -1
- package/dist/disableSkillsWire.js +4 -3
- package/dist/displayUntrusted.d.ts +1 -0
- package/dist/displayUntrusted.js +215 -13
- package/dist/engineAgentPanelStore.d.ts +7 -4
- package/dist/engineCapReader.js +1 -1
- package/dist/engineConfigDrift.js +1 -1
- package/dist/engineErrorCodes.d.ts +23 -6
- package/dist/engineErrorCodes.js +36 -11
- package/dist/engineGenerationConvergence.d.ts +39 -0
- package/dist/engineGenerationConvergence.js +95 -0
- package/dist/engineGenerationPort.d.ts +61 -0
- package/dist/engineGenerationPort.js +144 -0
- package/dist/engineHealthFacts.d.ts +23 -0
- package/dist/engineHealthFacts.js +92 -0
- package/dist/engineIdentity.d.ts +4 -0
- package/dist/engineIdentity.js +11 -0
- package/dist/engineNoticeCodes.d.ts +2 -5
- package/dist/engineRowRef.js +4 -0
- package/dist/engineSessionMessages.js +2 -2
- package/dist/engineToolDirectory.d.ts +3 -0
- package/dist/engineToolDirectory.js +6 -4
- package/dist/engineWireFor.d.ts +99 -0
- package/dist/engineWireFor.js +248 -6
- package/dist/engineWireTarget.d.ts +1 -0
- package/dist/engineWireTarget.js +8 -0
- package/dist/env/uiLanguage.js +1 -1
- package/dist/errorSupplementRoles.d.ts +3 -0
- package/dist/errorSupplementRoles.js +37 -0
- package/dist/eventLeg.d.ts +1 -7
- package/dist/eventLeg.js +7 -8
- package/dist/executionLaneCapability.js +2 -2
- package/dist/fileHistoryCaptureCapability.d.ts +0 -3
- package/dist/fileHistoryCaptureCapability.js +3 -7
- package/dist/finalVerifyWire.d.ts +6 -3
- package/dist/finalVerifyWire.js +6 -23
- package/dist/flagInput.d.ts +4 -0
- package/dist/flagInput.js +24 -0
- package/dist/fleet/fleetLedger.js +5 -2
- package/dist/fleet/fleetProjection.d.ts +1 -0
- package/dist/fleet/fleetProjection.js +15 -2
- package/dist/gateVocabulary.js +3 -0
- package/dist/generated/engineFactTables.d.ts +7 -2
- package/dist/generated/engineFactTables.js +79 -0
- package/dist/generated/engineNoticeTables.js +15 -0
- package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
- package/dist/generated/settingsSchemaActiveTiers.js +14 -0
- package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
- package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
- package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
- package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
- package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
- package/dist/generated/settingsSchemaDefaultModel.js +25 -0
- package/dist/generated/settingsSchemaFns.d.ts +66 -0
- package/dist/generated/settingsSchemaFns.js +38 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -0
- package/dist/generated/settingsSchemaMcpRequestEntry.js +156 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
- package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
- package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
- package/dist/generated/settingsSchemaSettingsSources.js +58 -0
- package/dist/generated/settingsSchemaTables.d.ts +3 -0
- package/dist/generated/settingsSchemaTables.js +18 -0
- package/dist/generated/settingsSchemaTypes.d.ts +28 -0
- package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
- package/dist/generated/settingsSchemaUrlPattern.js +183 -0
- package/dist/headlessPermissionModeWire.d.ts +18 -2
- package/dist/headlessPermissionModeWire.js +30 -19
- package/dist/hitl/allowRuleShadow.js +9 -7
- package/dist/hitl/approvalCardReading.d.ts +3 -0
- package/dist/hitl/approvalCardReading.js +17 -0
- package/dist/hitl/approvalCardReasons.js +2 -2
- package/dist/hitl/approvalCompleteParked.js +1 -1
- package/dist/hitl/approvalDelivery.d.ts +87 -0
- package/dist/hitl/approvalDelivery.js +193 -0
- package/dist/hitl/approvalHolds.d.ts +14 -0
- package/dist/hitl/approvalHolds.js +41 -0
- package/dist/hitl/approvalResolution.d.ts +11 -0
- package/dist/hitl/approvalResolution.js +50 -11
- package/dist/hitl/askClassPair.d.ts +8 -2
- package/dist/hitl/askClassPair.js +31 -4
- package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
- package/dist/hitl/askParkAutoReopenBlock.js +117 -0
- package/dist/hitl/askParkRowRouting.js +4 -1
- package/dist/hitl/attributionLadder.d.ts +62 -0
- package/dist/hitl/attributionLadder.js +138 -0
- package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
- package/dist/hitl/automaticAnswerVerdict.js +46 -11
- package/dist/hitl/crashConverged.js +2 -2
- package/dist/hitl/decisionConflict.d.ts +6 -2
- package/dist/hitl/decisionConflict.js +24 -9
- package/dist/hitl/decisionLedger.d.ts +55 -0
- package/dist/hitl/decisionLedger.js +156 -0
- package/dist/hitl/decisionRefusal.d.ts +21 -10
- package/dist/hitl/decisionRefusal.js +100 -55
- package/dist/hitl/decisionSend.d.ts +116 -0
- package/dist/hitl/decisionSend.js +563 -0
- package/dist/hitl/frameRouter.d.ts +1 -0
- package/dist/hitl/frameRouter.js +9 -2
- package/dist/hitl/hitlBridge.d.ts +18 -6
- package/dist/hitl/hitlBridge.js +59 -43
- package/dist/hitl/livePendingAsk.js +4 -3
- package/dist/hitl/noAllowCause.js +1 -1
- package/dist/hitl/parkResolver.js +3 -2
- package/dist/hitl/persistedRulesWire.js +1 -0
- package/dist/hitl/planReviewWire.d.ts +4 -0
- package/dist/hitl/planReviewWire.js +104 -106
- package/dist/hitl/resumeRunningCard.d.ts +3 -2
- package/dist/hitl/resumeRunningCard.js +17 -11
- package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
- package/dist/hitl/sessionPolicyDeliverable.js +65 -35
- package/dist/hitl/sessionPolicyWire.d.ts +13 -3
- package/dist/hitl/sessionPolicyWire.js +81 -16
- package/dist/hitl/standingRows.js +1 -1
- package/dist/hitl/toolApprovalWire.d.ts +9 -10
- package/dist/hitl/toolApprovalWire.js +103 -151
- package/dist/hookMatcherVerdict.d.ts +2 -0
- package/dist/hookMatcherVerdict.js +12 -0
- package/dist/hooksCompactTransition.d.ts +19 -0
- package/dist/hooksCompactTransition.js +41 -0
- package/dist/hooksWireCaps.d.ts +1 -1
- package/dist/hooksWireCaps.js +202 -203
- package/dist/host.d.ts +1 -14
- package/dist/host.js +0 -8
- package/dist/hostCallbackGuard.d.ts +1 -0
- package/dist/hostCallbackGuard.js +1 -1
- package/dist/hostSettingsSource.d.ts +172 -0
- package/dist/hostSettingsSource.js +675 -0
- package/dist/hostTurnSettings.d.ts +114 -19
- package/dist/hostTurnSettings.js +966 -68
- package/dist/httpHookPolicy.d.ts +37 -0
- package/dist/httpHookPolicy.js +176 -0
- package/dist/humanTurn.d.ts +4 -2
- package/dist/humanTurn.js +40 -10
- package/dist/humanTurnRead.js +4 -3
- package/dist/humanTurnSentences.d.ts +10 -0
- package/dist/humanTurnSentences.js +74 -0
- package/dist/i18n/messages.en.d.ts +313 -0
- package/dist/i18n/messages.en.js +326 -13
- package/dist/i18n/messages.zh.js +341 -13
- package/dist/i18n/translate.js +3 -3
- package/dist/index.d.ts +85 -15
- package/dist/index.js +53 -12
- package/dist/inheritEnvCapability.d.ts +4 -1
- package/dist/inheritEnvCapability.js +38 -17
- package/dist/inheritEnvWire.d.ts +2 -1
- package/dist/inheritEnvWire.js +11 -5
- package/dist/injectionLaneNotice.d.ts +5 -0
- package/dist/injectionLaneNotice.js +46 -0
- package/dist/interactiveToolsWire.d.ts +4 -2
- package/dist/interactiveToolsWire.js +5 -5
- package/dist/jsonFaithful.d.ts +20 -0
- package/dist/jsonFaithful.js +152 -0
- package/dist/limitsWire.d.ts +7 -2
- package/dist/limitsWire.js +19 -13
- package/dist/liveInitToolFace.d.ts +6 -1
- package/dist/liveInitToolFace.js +5 -3
- package/dist/liveModelCatalog.d.ts +22 -0
- package/dist/liveModelCatalog.js +132 -18
- package/dist/mcpPanel.js +3 -1
- package/dist/mcpProbeCapability.js +2 -2
- package/dist/mcpReconnect.js +2 -2
- package/dist/mcpStatusSupersetKeys.d.ts +24 -0
- package/dist/mcpStatusSupersetKeys.js +45 -0
- package/dist/mcpToolToggles.d.ts +6 -0
- package/dist/mcpToolToggles.js +47 -0
- package/dist/mcpWireCaps.d.ts +48 -4
- package/dist/mcpWireCaps.js +338 -99
- package/dist/mcpWireTransport.d.ts +4 -0
- package/dist/mcpWireTransport.js +18 -0
- package/dist/memoryComplianceCapability.js +2 -2
- package/dist/memoryOriginCapability.js +2 -2
- package/dist/model/catalogDefault.d.ts +24 -0
- package/dist/model/catalogDefault.js +4 -0
- package/dist/model/liveCatalogShape.js +5 -4
- package/dist/model/modelsPolicy.js +4 -3
- package/dist/model/onboardJudgement.d.ts +1 -0
- package/dist/model/onboardJudgement.js +1 -1
- package/dist/model/subagentModelWord.js +2 -2
- package/dist/modelCapabilityProbe.d.ts +2 -1
- package/dist/modelCapabilityProbe.js +16 -15
- package/dist/modelIdentityResolvability.d.ts +12 -1
- package/dist/modelIdentityResolvability.js +69 -28
- package/dist/modsKernelIdentity.d.ts +10 -0
- package/dist/modsKernelIdentity.js +103 -0
- package/dist/modsKernelTransit.d.ts +8 -0
- package/dist/modsKernelTransit.js +6 -0
- package/dist/notifications.d.ts +30 -12
- package/dist/notifications.js +241 -53
- package/dist/outputStyleSeatCapability.js +2 -2
- package/dist/ownKey.d.ts +37 -0
- package/dist/ownKey.js +238 -2
- package/dist/panelReduce.d.ts +5 -0
- package/dist/panelReduce.js +45 -13
- package/dist/panelStateHolder.d.ts +1 -0
- package/dist/panelStateHolder.js +10 -1
- package/dist/peerFrames.d.ts +1 -1
- package/dist/peerFrames.js +6 -2
- package/dist/peerLaneCapability.js +2 -2
- package/dist/permissionModesCapability.js +4 -4
- package/dist/permissionRuleIssue.d.ts +2 -1
- package/dist/permissionRuleIssue.js +24 -21
- package/dist/permissionRulesWriteCapability.js +2 -2
- package/dist/permissionsAllowGrantCapability.js +2 -2
- package/dist/permissionsDeclaration.d.ts +43 -4
- package/dist/permissionsDeclaration.js +102 -35
- package/dist/pluginHooksWire.d.ts +20 -4
- package/dist/pluginHooksWire.js +101 -60
- package/dist/prepareRefusal.d.ts +9 -0
- package/dist/prepareRefusal.js +90 -0
- package/dist/printInitToolFace.js +2 -2
- package/dist/printModelStatus.js +1 -1
- package/dist/projectMemory.d.ts +32 -0
- package/dist/projectMemory.js +70 -0
- package/dist/promptBlockedCopy.d.ts +2 -1
- package/dist/promptBlockedCopy.js +2 -1
- package/dist/promptDelivery.d.ts +23 -3
- package/dist/promptDelivery.js +169 -30
- package/dist/providerRejection.d.ts +19 -1
- package/dist/providerRejection.js +75 -4
- package/dist/queuedDelivery.d.ts +48 -0
- package/dist/queuedDelivery.js +233 -0
- package/dist/reattachWindow.d.ts +94 -0
- package/dist/reattachWindow.js +127 -0
- package/dist/request/printNotification.d.ts +1 -1
- package/dist/request/printNotification.js +5 -1
- package/dist/request/submissionIdentity.d.ts +37 -0
- package/dist/request/submissionIdentity.js +65 -0
- package/dist/request/taskRequest.d.ts +22 -14
- package/dist/request/taskRequest.js +312 -202
- package/dist/resultFrameKeys.d.ts +1 -0
- package/dist/resultFrameKeys.js +4 -1
- package/dist/resumeRefusalCopy.d.ts +3 -1
- package/dist/resumeRefusalCopy.js +22 -4
- package/dist/retryStatus.d.ts +26 -0
- package/dist/retryStatus.js +133 -28
- package/dist/rewindArchiveCapability.js +2 -2
- package/dist/rewindEngineAction.d.ts +2 -0
- package/dist/rewindEngineAction.js +23 -1
- package/dist/rowKind.d.ts +36 -0
- package/dist/rowKind.js +97 -0
- package/dist/ruleCompileVerdict.d.ts +18 -0
- package/dist/ruleCompileVerdict.js +67 -2
- package/dist/ruleReadings.d.ts +58 -0
- package/dist/ruleReadings.js +132 -0
- package/dist/ruleRefusalSentence.d.ts +8 -0
- package/dist/ruleRefusalSentence.js +64 -0
- package/dist/runCancelContext.d.ts +0 -1
- package/dist/runCancelContext.js +1 -2
- package/dist/runTerminal.d.ts +5 -0
- package/dist/runTerminal.js +52 -17
- package/dist/sandboxWire.d.ts +3 -2
- package/dist/sandboxWire.js +59 -27
- package/dist/scenarioRefusal.d.ts +2 -1
- package/dist/scenarioRefusal.js +6 -6
- package/dist/scenarioSkills.d.ts +20 -0
- package/dist/scenarioSkills.js +72 -0
- package/dist/scenarioWire.d.ts +5 -2
- package/dist/scenarioWire.js +9 -9
- package/dist/sealedKeyCapability.js +2 -2
- package/dist/seam.d.ts +26 -9
- package/dist/seam.js +44 -4
- package/dist/seatContract.d.ts +62 -9
- package/dist/seatContract.js +70 -25
- package/dist/selfOrchestrationDenial.js +1 -1
- package/dist/sessionPolicyCapability.js +2 -2
- package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
- package/dist/sessionRulesChildrenReadLive.js +5 -0
- package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
- package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
- package/dist/sessionSyncFileHistoryCapability.js +2 -2
- package/dist/settingsCredentialKeyPaths.d.ts +8 -0
- package/dist/settingsCredentialKeyPaths.js +274 -0
- package/dist/settingsHooksSalvage.d.ts +1 -0
- package/dist/settingsHooksSalvage.js +7 -1
- package/dist/settingsLayerAdmission.d.ts +4 -0
- package/dist/settingsLayerAdmission.js +16 -0
- package/dist/skillToolListsCapability.js +6 -5
- package/dist/skillsWireCaps.d.ts +14 -3
- package/dist/skillsWireCaps.js +48 -18
- package/dist/slashCommandGate.d.ts +24 -0
- package/dist/slashCommandGate.js +74 -0
- package/dist/slashCommandTable.d.ts +14 -0
- package/dist/slashCommandTable.js +99 -0
- package/dist/sqlEngineCapability.js +2 -2
- package/dist/steerPriorityCapability.js +2 -2
- package/dist/storePostureCapability.js +2 -2
- package/dist/subagent/agentStateDetail.js +1 -1
- package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
- package/dist/subagent/engineDelegatedPrompt.js +38 -7
- package/dist/subagent/engineRowStopGate.js +2 -2
- package/dist/subagent/engineSubagentResume.js +3 -3
- package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
- package/dist/subagent/engineTaskHandleWire.js +10 -0
- package/dist/subagentContentStore.d.ts +1 -0
- package/dist/subagentContentStore.js +135 -27
- package/dist/submitFailure.d.ts +8 -0
- package/dist/submitFailure.js +17 -0
- package/dist/supportFloor.d.ts +1 -0
- package/dist/supportFloor.js +7 -0
- package/dist/terminationIntent.d.ts +55 -0
- package/dist/terminationIntent.js +352 -0
- package/dist/toolHistoryMismatch.d.ts +8 -0
- package/dist/toolHistoryMismatch.js +37 -6
- package/dist/toolResult.d.ts +13 -3
- package/dist/toolResult.js +158 -9
- package/dist/toolResultContent.d.ts +13 -0
- package/dist/toolResultContent.js +82 -7
- package/dist/toolRoster.d.ts +18 -0
- package/dist/toolRoster.js +64 -0
- package/dist/toolsFlagNames.d.ts +8 -0
- package/dist/toolsFlagNames.js +110 -0
- package/dist/turnFailurePresentation.js +41 -96
- package/dist/usageLimitAutoResume.d.ts +74 -0
- package/dist/usageLimitAutoResume.js +227 -0
- package/dist/userAttachmentEnvelope.js +1 -1
- package/dist/userAttachmentSeat.js +5 -5
- package/dist/userInvokedSkillsCapability.js +2 -2
- package/dist/webSearchBackendCapability.js +2 -2
- package/dist/wireErrorTriage.js +99 -50
- package/dist/wireFailureShape.d.ts +25 -1
- package/dist/wireFailureShape.js +92 -5
- package/dist/wireRefusalCopy.d.ts +75 -18
- package/dist/wireRefusalCopy.js +532 -148
- package/dist/wiringFleetDoctor.d.ts +3 -0
- package/dist/wiringFleetDoctor.js +21 -0
- package/dist/workflow.d.ts +2 -1
- package/dist/workflow.js +38 -1
- package/dist/workflowClient.d.ts +2 -7
- package/dist/workflowsJournalCapability.js +2 -2
- package/dist/writeProtectionCapability.js +2 -2
- package/docs/INTEGRATION-CLIENTS.md +1013 -190
- package/package.json +15 -4
package/dist/skillsWireCaps.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { SkillSpec } from '@sema-agent/sdk';
|
|
2
2
|
import { type SkillToolListsReading } from './skillToolListsCapability.js';
|
|
3
|
-
export declare const SKILL_CAPS: {
|
|
4
|
-
readonly content: 1048576;
|
|
5
|
-
};
|
|
6
3
|
export interface SkillCmdLike {
|
|
7
4
|
type?: string;
|
|
8
5
|
name?: string;
|
|
@@ -24,4 +21,18 @@ export interface SkillSpecsOptions {
|
|
|
24
21
|
skillToolLists?: SkillToolListsReading;
|
|
25
22
|
}
|
|
26
23
|
export declare function skillBaseDirOf(skillRoot: string | undefined, platform?: 'posix' | 'win32'): string | undefined;
|
|
24
|
+
export type SkillToolListKey = 'allowedTools' | 'disallowedTools';
|
|
25
|
+
export type SkillToolListsVerdict = {
|
|
26
|
+
readonly kind: 'ok';
|
|
27
|
+
readonly lists: {
|
|
28
|
+
allowedTools?: string[];
|
|
29
|
+
disallowedTools?: string[];
|
|
30
|
+
};
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: 'bad';
|
|
33
|
+
readonly key: SkillToolListKey;
|
|
34
|
+
readonly index?: number;
|
|
35
|
+
readonly detail: string;
|
|
36
|
+
};
|
|
37
|
+
export declare function skillToolListsVerdict(source: object, reading: SkillToolListsReading | undefined): SkillToolListsVerdict;
|
|
27
38
|
export declare function skillCommandsToSpecs(cmds: SkillCmdLike[], resolveBody: (cmd: SkillCmdLike) => string | null, opts?: SkillSpecsOptions): SkillSpecOnWire[];
|
package/dist/skillsWireCaps.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { skillToolListsAvailable } from './skillToolListsCapability.js';
|
|
2
|
-
|
|
2
|
+
import { msg, renderMessage } from './i18n/translate.js';
|
|
3
|
+
import { appendOwnElement } from './ownKey.js';
|
|
3
4
|
export function toCappedSpec(name, description, whenToUse, body) {
|
|
4
5
|
const n = name.trim();
|
|
5
|
-
const c = body.trim()
|
|
6
|
+
const c = body.trim();
|
|
6
7
|
if (!n || !c)
|
|
7
8
|
return null;
|
|
8
9
|
const desc = [description.trim(), whenToUse.trim()]
|
|
@@ -28,14 +29,14 @@ export function skillBaseDirOf(skillRoot, platform = 'posix') {
|
|
|
28
29
|
return undefined;
|
|
29
30
|
return skillRoot;
|
|
30
31
|
}
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
const SKILL_TOOL_LIST_READ_BUDGET = 100_000;
|
|
33
|
+
function readSkillToolList(key, source) {
|
|
33
34
|
const hint = 'The list is the skill’s own tool rule list and is sent exactly as given (entries are never dropped, repaired, reordered or truncated here), ' +
|
|
34
35
|
'so a value that is not a list of strings is refused instead of being silently reduced.';
|
|
35
|
-
const unreadable = () => new TypeError(
|
|
36
|
+
const unreadable = () => new TypeError(`could not be read — reading it (the property, the array length or an entry) threw. ${hint}`);
|
|
36
37
|
let v;
|
|
37
38
|
try {
|
|
38
|
-
v =
|
|
39
|
+
v = source[key];
|
|
39
40
|
}
|
|
40
41
|
catch {
|
|
41
42
|
throw unreadable();
|
|
@@ -50,7 +51,7 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
50
51
|
throw unreadable();
|
|
51
52
|
}
|
|
52
53
|
if (!isArray) {
|
|
53
|
-
throw new TypeError(
|
|
54
|
+
throw new TypeError(`must be an array of strings or absent — got ${v === null ? 'null' : typeof v === 'object' ? 'a non-array object' : `typeof ${typeof v}`}. ${hint}`);
|
|
54
55
|
}
|
|
55
56
|
const list = v;
|
|
56
57
|
let lengthRead;
|
|
@@ -61,7 +62,10 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
61
62
|
throw unreadable();
|
|
62
63
|
}
|
|
63
64
|
if (typeof lengthRead !== 'number' || !Number.isSafeInteger(lengthRead) || lengthRead < 0 || lengthRead > 4_294_967_295) {
|
|
64
|
-
throw new TypeError(
|
|
65
|
+
throw new TypeError(`must be an array of strings or absent — its length is not a valid array length. ${hint}`);
|
|
66
|
+
}
|
|
67
|
+
if (lengthRead > SKILL_TOOL_LIST_READ_BUDGET) {
|
|
68
|
+
throw new TypeError(renderMessage(msg('config.skills.toolListTooMany', { got: String(SKILL_TOOL_LIST_READ_BUDGET) })));
|
|
65
69
|
}
|
|
66
70
|
const n = lengthRead;
|
|
67
71
|
const out = [];
|
|
@@ -74,18 +78,45 @@ function readSkillToolList(skillName, key, cmd) {
|
|
|
74
78
|
throw unreadable();
|
|
75
79
|
}
|
|
76
80
|
if (typeof e !== 'string') {
|
|
77
|
-
throw new TypeError(
|
|
81
|
+
throw Object.assign(new TypeError(`must be an array of strings or absent — the entry at index ${i} is ${e === null ? 'null' : `typeof ${typeof e}`}. ${hint}`), { index: i });
|
|
78
82
|
}
|
|
79
|
-
out
|
|
83
|
+
appendOwnElement(out, e);
|
|
80
84
|
}
|
|
81
85
|
return out;
|
|
82
86
|
}
|
|
87
|
+
function refusalOf(e, key) {
|
|
88
|
+
const index = e.index;
|
|
89
|
+
return { kind: 'bad', key, ...(typeof index === 'number' ? { index } : {}), detail: e.message };
|
|
90
|
+
}
|
|
91
|
+
export function skillToolListsVerdict(source, reading) {
|
|
92
|
+
if (reading === undefined)
|
|
93
|
+
return { kind: 'ok', lists: {} };
|
|
94
|
+
let allowedTools;
|
|
95
|
+
let disallowedTools;
|
|
96
|
+
try {
|
|
97
|
+
allowedTools = readSkillToolList('allowedTools', source);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
return refusalOf(e, 'allowedTools');
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
disallowedTools = readSkillToolList('disallowedTools', source);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
return refusalOf(e, 'disallowedTools');
|
|
107
|
+
}
|
|
108
|
+
const toolListsOn = skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
|
|
109
|
+
const lists = {};
|
|
110
|
+
if (toolListsOn && allowedTools !== undefined)
|
|
111
|
+
lists.allowedTools = allowedTools;
|
|
112
|
+
if (toolListsOn && disallowedTools !== undefined)
|
|
113
|
+
lists.disallowedTools = disallowedTools;
|
|
114
|
+
return { kind: 'ok', lists };
|
|
115
|
+
}
|
|
83
116
|
export function skillCommandsToSpecs(cmds, resolveBody, opts) {
|
|
84
117
|
const specs = [];
|
|
85
118
|
const seen = new Set();
|
|
86
119
|
const reading = opts?.skillToolLists;
|
|
87
|
-
const wired = reading !== undefined;
|
|
88
|
-
const toolListsOn = wired && skillToolListsAvailable(reading ?? { kind: 'unobserved' }) === 'yes';
|
|
89
120
|
for (const cmd of cmds) {
|
|
90
121
|
if (cmd.type !== 'prompt' || cmd.disableModelInvocation)
|
|
91
122
|
continue;
|
|
@@ -97,15 +128,14 @@ export function skillCommandsToSpecs(cmds, resolveBody, opts) {
|
|
|
97
128
|
continue;
|
|
98
129
|
seen.add(spec.name);
|
|
99
130
|
const baseDir = opts?.toolsRunHere === true ? skillBaseDirOf(cmd.skillRoot, opts.platform ?? 'posix') : undefined;
|
|
100
|
-
const
|
|
101
|
-
|
|
131
|
+
const verdict = skillToolListsVerdict(cmd, reading);
|
|
132
|
+
if (verdict.kind === 'bad') {
|
|
133
|
+
throw new TypeError(`skillCommandsToSpecs: skill ${JSON.stringify(spec.name.slice(0, 80))} ${verdict.key} ${verdict.detail}`);
|
|
134
|
+
}
|
|
102
135
|
let wire = spec;
|
|
103
136
|
if (baseDir !== undefined)
|
|
104
137
|
wire = { ...wire, baseDir };
|
|
105
|
-
|
|
106
|
-
wire = { ...wire, allowedTools };
|
|
107
|
-
if (toolListsOn && disallowedTools !== undefined)
|
|
108
|
-
wire = { ...wire, disallowedTools };
|
|
138
|
+
wire = { ...wire, ...verdict.lists };
|
|
109
139
|
specs.push(wire);
|
|
110
140
|
}
|
|
111
141
|
return specs;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Capabilities } from '@sema-agent/sdk';
|
|
2
|
+
import { SLASH_COMMAND_ROSTER_PIN, type SlashCommandBucket, type SlashCommandOverride, type SlashCommandPosture } from './slashCommandTable.js';
|
|
3
|
+
export { SLASH_COMMAND_ROSTER_PIN };
|
|
4
|
+
export type { SlashCommandBucket, SlashCommandOverride, SlashCommandPosture };
|
|
5
|
+
export declare const SLASH_COMMAND_BUCKETS: Readonly<Record<SlashCommandBucket, readonly string[]>>;
|
|
6
|
+
export type SlashCommandGateReason = 'cc-availability' | 'cc-isEnabled' | 'config-deny' | 'capability-absent' | 'capability-degraded' | 'hidden-from-help' | 'allowed';
|
|
7
|
+
export type SlashCommandGateState = 'allowed' | 'degraded' | 'denied';
|
|
8
|
+
export interface SlashCommandGateInput {
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly source?: string;
|
|
11
|
+
readonly ccAvailable?: boolean;
|
|
12
|
+
readonly ccEnabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface SlashCommandVerdict {
|
|
15
|
+
readonly state: SlashCommandGateState;
|
|
16
|
+
readonly visible: boolean;
|
|
17
|
+
readonly degraded: boolean;
|
|
18
|
+
readonly hidden: boolean;
|
|
19
|
+
readonly reason: SlashCommandGateReason;
|
|
20
|
+
readonly requiredCapability?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function slashCommandBucketOf(name: string): SlashCommandBucket | undefined;
|
|
23
|
+
export declare function slashCommandOverrideOf(name: string): SlashCommandOverride | undefined;
|
|
24
|
+
export declare function judgeSlashCommand(command: SlashCommandGateInput, capabilities: Capabilities | undefined): SlashCommandVerdict;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { guardedRead, readOwnDataValue } from './ownKey.js';
|
|
2
|
+
import { SLASH_COMMAND_BUCKET_FLEET_NA, SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK, SLASH_COMMAND_BUCKET_POSTURE_TABLE, SLASH_COMMAND_BUCKET_PURE_UI, SLASH_COMMAND_OVERRIDE_ROWS, SLASH_COMMAND_ROSTER_PIN, } from './slashCommandTable.js';
|
|
3
|
+
export { SLASH_COMMAND_ROSTER_PIN };
|
|
4
|
+
export const SLASH_COMMAND_BUCKETS = Object.freeze({
|
|
5
|
+
pureUI: SLASH_COMMAND_BUCKET_PURE_UI,
|
|
6
|
+
mappableToSdk: SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK,
|
|
7
|
+
fleetNA: SLASH_COMMAND_BUCKET_FLEET_NA,
|
|
8
|
+
});
|
|
9
|
+
const BUCKET_INDEX = new Map([
|
|
10
|
+
...SLASH_COMMAND_BUCKET_PURE_UI.map((n) => [n, 'pureUI']),
|
|
11
|
+
...SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK.map((n) => [n, 'mappableToSdk']),
|
|
12
|
+
...SLASH_COMMAND_BUCKET_FLEET_NA.map((n) => [n, 'fleetNA']),
|
|
13
|
+
]);
|
|
14
|
+
const OVERRIDE_INDEX = new Map(SLASH_COMMAND_OVERRIDE_ROWS);
|
|
15
|
+
export function slashCommandBucketOf(name) {
|
|
16
|
+
return typeof name === 'string' ? BUCKET_INDEX.get(name) : undefined;
|
|
17
|
+
}
|
|
18
|
+
export function slashCommandOverrideOf(name) {
|
|
19
|
+
return typeof name === 'string' ? OVERRIDE_INDEX.get(name) : undefined;
|
|
20
|
+
}
|
|
21
|
+
function capabilityPresent(capabilities, key) {
|
|
22
|
+
try {
|
|
23
|
+
const v = guardedRead(() => readOwnDataValue(capabilities, key));
|
|
24
|
+
if (typeof v === 'boolean')
|
|
25
|
+
return v;
|
|
26
|
+
if (typeof v === 'string')
|
|
27
|
+
return v.length > 0;
|
|
28
|
+
if (Array.isArray(v))
|
|
29
|
+
return v.length > 0;
|
|
30
|
+
return Boolean(v);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function slot(input, key) {
|
|
37
|
+
return guardedRead(() => readOwnDataValue(input, key));
|
|
38
|
+
}
|
|
39
|
+
function verdict(state, hidden, reason, requiredCapability) {
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
state,
|
|
42
|
+
visible: state !== 'denied',
|
|
43
|
+
degraded: state === 'degraded',
|
|
44
|
+
hidden,
|
|
45
|
+
reason,
|
|
46
|
+
...(requiredCapability !== undefined ? { requiredCapability } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export function judgeSlashCommand(command, capabilities) {
|
|
50
|
+
const rawName = slot(command, 'name');
|
|
51
|
+
const name = typeof rawName === 'string' ? rawName : '';
|
|
52
|
+
if (slot(command, 'ccAvailable') === false)
|
|
53
|
+
return verdict('denied', false, 'cc-availability');
|
|
54
|
+
if (slot(command, 'ccEnabled') === false)
|
|
55
|
+
return verdict('denied', false, 'cc-isEnabled');
|
|
56
|
+
const override = OVERRIDE_INDEX.get(name);
|
|
57
|
+
const bucket = BUCKET_INDEX.get(name);
|
|
58
|
+
const bucketPosture = (bucket !== undefined ? SLASH_COMMAND_BUCKET_POSTURE_TABLE[bucket] : undefined) ?? 'allow';
|
|
59
|
+
const explicit = override?.mode;
|
|
60
|
+
const mode = explicit === 'allow' || explicit === 'deny' ? explicit : bucketPosture;
|
|
61
|
+
if (mode === 'deny')
|
|
62
|
+
return verdict('denied', false, 'config-deny');
|
|
63
|
+
const source = slot(command, 'source');
|
|
64
|
+
const builtin = source === undefined || source === 'builtin';
|
|
65
|
+
const unbucketedFallthrough = builtin && bucket === undefined && explicit !== 'allow' && explicit !== 'deny';
|
|
66
|
+
const hidden = override?.hidden === true || unbucketedFallthrough;
|
|
67
|
+
const required = override?.requiredCapability;
|
|
68
|
+
if (required !== undefined && required !== '' && !capabilityPresent(capabilities, required)) {
|
|
69
|
+
if (override?.degradeWhenAbsent === true)
|
|
70
|
+
return verdict('degraded', hidden, 'capability-degraded', required);
|
|
71
|
+
return verdict('denied', false, 'capability-absent', required);
|
|
72
|
+
}
|
|
73
|
+
return verdict('allowed', hidden, hidden ? 'hidden-from-help' : 'allowed', required !== undefined && required !== '' ? required : undefined);
|
|
74
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const SLASH_COMMAND_ROSTER_PIN = "CC 2.1.187";
|
|
2
|
+
export type SlashCommandBucket = 'pureUI' | 'mappableToSdk' | 'fleetNA';
|
|
3
|
+
export type SlashCommandPosture = 'allow' | 'deny';
|
|
4
|
+
export interface SlashCommandOverride {
|
|
5
|
+
readonly mode: 'allow' | 'deny' | 'auto';
|
|
6
|
+
readonly requiredCapability?: string;
|
|
7
|
+
readonly degradeWhenAbsent?: boolean;
|
|
8
|
+
readonly hidden?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const SLASH_COMMAND_BUCKET_POSTURE_TABLE: Readonly<Record<SlashCommandBucket, SlashCommandPosture>>;
|
|
11
|
+
export declare const SLASH_COMMAND_BUCKET_PURE_UI: readonly string[];
|
|
12
|
+
export declare const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK: readonly string[];
|
|
13
|
+
export declare const SLASH_COMMAND_BUCKET_FLEET_NA: readonly string[];
|
|
14
|
+
export declare const SLASH_COMMAND_OVERRIDE_ROWS: readonly (readonly [string, SlashCommandOverride])[];
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export const SLASH_COMMAND_ROSTER_PIN = 'CC 2.1.187';
|
|
2
|
+
export const SLASH_COMMAND_BUCKET_POSTURE_TABLE = Object.freeze({
|
|
3
|
+
pureUI: 'allow',
|
|
4
|
+
mappableToSdk: 'allow',
|
|
5
|
+
fleetNA: 'deny',
|
|
6
|
+
});
|
|
7
|
+
export const SLASH_COMMAND_BUCKET_PURE_UI = Object.freeze([
|
|
8
|
+
'color', 'theme', 'tui', 'brief', 'scroll-speed', 'terminal-setup',
|
|
9
|
+
'help', 'exit', 'copy', 'export', 'diff', 'config',
|
|
10
|
+
'ide', 'add-dir', 'cd', 'powerup', 'feedback', 'btw',
|
|
11
|
+
'advisor', 'fast', 'effort', 'heapdump', 'version', 'stickers',
|
|
12
|
+
'keybindings', 'statusline', 'vim', 'install', 'passes', 'clear',
|
|
13
|
+
'recap',
|
|
14
|
+
]);
|
|
15
|
+
export const SLASH_COMMAND_BUCKET_MAPPABLE_TO_SDK = Object.freeze([
|
|
16
|
+
'init', 'init-verifiers', 'review', 'insights', 'team-onboarding', 'compact',
|
|
17
|
+
'context', 'resume', 'model', 'usage', 'cost', 'permissions',
|
|
18
|
+
'hooks', 'plan', 'memory', 'tasks', 'stop', 'workflows',
|
|
19
|
+
'skills', 'mcp', 'agents', 'plugin', 'reload-plugins', 'rename',
|
|
20
|
+
'branch', 'goal', 'commit-push-pr', 'import', 'explain-usage',
|
|
21
|
+
]);
|
|
22
|
+
export const SLASH_COMMAND_BUCKET_FLEET_NA = Object.freeze([
|
|
23
|
+
'files', 'think-back', 'thinkback-play', 'commit', 'login', 'logout',
|
|
24
|
+
'setup-bedrock', 'setup-vertex', 'upgrade', 'usage-credits', 'extra-usage', 'rate-limit-options',
|
|
25
|
+
'pro-trial-expired', 'desktop', 'session', 'teleport', 'remote-control', 'remote-env',
|
|
26
|
+
'web-setup', 'ultraplan', 'ultrareview', 'install-github-app', 'install-slack-app', 'design-login',
|
|
27
|
+
'autofix-pr', 'mobile', 'tag', 'privacy-settings',
|
|
28
|
+
]);
|
|
29
|
+
export const SLASH_COMMAND_OVERRIDE_ROWS = Object.freeze([
|
|
30
|
+
['status', { mode: 'allow' }],
|
|
31
|
+
['doctor', { mode: 'allow' }],
|
|
32
|
+
['rewind', { mode: 'allow' }],
|
|
33
|
+
['skill-doctor', { mode: 'allow' }],
|
|
34
|
+
['memory-capture', { mode: 'allow' }],
|
|
35
|
+
['init', { mode: 'auto' }],
|
|
36
|
+
['init-verifiers', { mode: 'auto' }],
|
|
37
|
+
['review', { mode: 'auto' }],
|
|
38
|
+
['insights', { mode: 'auto' }],
|
|
39
|
+
['team-onboarding', { mode: 'auto' }],
|
|
40
|
+
['compact', { mode: 'auto', degradeWhenAbsent: true }],
|
|
41
|
+
['context', { mode: 'auto', degradeWhenAbsent: true }],
|
|
42
|
+
['resume', { mode: 'auto', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
|
|
43
|
+
['tasks', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
44
|
+
['stop', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
45
|
+
['workflows', { mode: 'auto', requiredCapability: 'asyncRuns' }],
|
|
46
|
+
['usage', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
|
|
47
|
+
['cost', { mode: 'auto', requiredCapability: 'pricingConfigured', degradeWhenAbsent: true }],
|
|
48
|
+
['stats', { mode: 'allow' }],
|
|
49
|
+
['vim', { mode: 'auto', hidden: true }],
|
|
50
|
+
['statusline', { mode: 'auto', hidden: true }],
|
|
51
|
+
['permissions', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
52
|
+
['plan', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
53
|
+
['goal', { mode: 'auto', requiredCapability: 'approvals', degradeWhenAbsent: true }],
|
|
54
|
+
['hooks', { mode: 'auto', degradeWhenAbsent: true }],
|
|
55
|
+
['memory', { mode: 'auto', requiredCapability: 'memory' }],
|
|
56
|
+
['model', { mode: 'auto' }],
|
|
57
|
+
['skills', { mode: 'auto', degradeWhenAbsent: true }],
|
|
58
|
+
['mcp', { mode: 'auto', degradeWhenAbsent: true }],
|
|
59
|
+
['agents', { mode: 'auto', degradeWhenAbsent: true }],
|
|
60
|
+
['plugin', { mode: 'auto', degradeWhenAbsent: true }],
|
|
61
|
+
['reload-plugins', { mode: 'auto', degradeWhenAbsent: true }],
|
|
62
|
+
['rename', { mode: 'auto', degradeWhenAbsent: true }],
|
|
63
|
+
['branch', { mode: 'auto', degradeWhenAbsent: true }],
|
|
64
|
+
['loops', { mode: 'deny' }],
|
|
65
|
+
['update', { mode: 'deny' }],
|
|
66
|
+
['collab', { mode: 'allow' }],
|
|
67
|
+
['websearch', { mode: 'allow' }],
|
|
68
|
+
['import', { mode: 'auto' }],
|
|
69
|
+
['explain-usage', { mode: 'auto' }],
|
|
70
|
+
['mobile', { mode: 'deny' }],
|
|
71
|
+
['tag', { mode: 'deny' }],
|
|
72
|
+
['files', { mode: 'deny' }],
|
|
73
|
+
['privacy-settings', { mode: 'deny' }],
|
|
74
|
+
['think-back', { mode: 'deny' }],
|
|
75
|
+
['thinkback-play', { mode: 'deny' }],
|
|
76
|
+
['commit', { mode: 'deny' }],
|
|
77
|
+
['login', { mode: 'deny' }],
|
|
78
|
+
['logout', { mode: 'deny' }],
|
|
79
|
+
['setup-bedrock', { mode: 'deny' }],
|
|
80
|
+
['setup-vertex', { mode: 'deny' }],
|
|
81
|
+
['upgrade', { mode: 'deny' }],
|
|
82
|
+
['usage-credits', { mode: 'deny' }],
|
|
83
|
+
['extra-usage', { mode: 'deny' }],
|
|
84
|
+
['rate-limit-options', { mode: 'allow' }],
|
|
85
|
+
['pro-trial-expired', { mode: 'deny' }],
|
|
86
|
+
['desktop', { mode: 'deny' }],
|
|
87
|
+
['session', { mode: 'deny' }],
|
|
88
|
+
['teleport', { mode: 'deny' }],
|
|
89
|
+
['remote-control', { mode: 'deny' }],
|
|
90
|
+
['remote-env', { mode: 'deny' }],
|
|
91
|
+
['web-setup', { mode: 'deny' }],
|
|
92
|
+
['ultraplan', { mode: 'deny' }],
|
|
93
|
+
['ultrareview', { mode: 'deny' }],
|
|
94
|
+
['install-github-app', { mode: 'deny' }],
|
|
95
|
+
['install-slack-app', { mode: 'deny' }],
|
|
96
|
+
['design-login', { mode: 'deny' }],
|
|
97
|
+
['autofix-pr', { mode: 'deny' }],
|
|
98
|
+
['daemon', { mode: 'allow', requiredCapability: 'asyncRuns', degradeWhenAbsent: true }],
|
|
99
|
+
]);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { ownDataField } from './ownKey.js';
|
|
5
5
|
export function projectSqlEngineCapability(caps) {
|
|
@@ -40,7 +40,7 @@ const reader = createEngineCapReader({
|
|
|
40
40
|
name: 'sql',
|
|
41
41
|
project: projectSqlEngineCapability,
|
|
42
42
|
});
|
|
43
|
-
export function observedSqlEngine(baseUrl =
|
|
43
|
+
export function observedSqlEngine(baseUrl = engineWireTargetBaseUrl()) {
|
|
44
44
|
return reader.observed(baseUrl);
|
|
45
45
|
}
|
|
46
46
|
const SQL_DETAIL_MAX = 40;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { ownDataField } from './ownKey.js';
|
|
5
5
|
export function projectSteerPriorityCapability(caps) {
|
|
@@ -26,7 +26,7 @@ const reader = createEngineCapReader({
|
|
|
26
26
|
name: 'fleet.steerPriority',
|
|
27
27
|
project: projectSteerPriorityCapability,
|
|
28
28
|
});
|
|
29
|
-
export function observedSteerPriority(baseUrl =
|
|
29
|
+
export function observedSteerPriority(baseUrl = engineWireTargetBaseUrl()) {
|
|
30
30
|
return reader.observed(baseUrl);
|
|
31
31
|
}
|
|
32
32
|
export function steerPriorityMode(reading) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { capForDisplay } from './fleetTaskDesc.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from './engineWireTarget.js';
|
|
3
3
|
import { storeSeatOf, createEngineCapReader, unreadableReadingDetail } from './engineCapReader.js';
|
|
4
4
|
import { projectSqlEngineCapability } from './sqlEngineCapability.js';
|
|
5
5
|
import { ownDataField } from './ownKey.js';
|
|
@@ -45,7 +45,7 @@ const reader = createEngineCapReader({
|
|
|
45
45
|
name: 'store',
|
|
46
46
|
project: projectStorePostureCapability,
|
|
47
47
|
});
|
|
48
|
-
export function observedStorePosture(baseUrl =
|
|
48
|
+
export function observedStorePosture(baseUrl = engineWireTargetBaseUrl()) {
|
|
49
49
|
return reader.observed(baseUrl);
|
|
50
50
|
}
|
|
51
51
|
function presentView(reading) {
|
|
@@ -4,7 +4,7 @@ function own(v, key) {
|
|
|
4
4
|
return undefined;
|
|
5
5
|
try {
|
|
6
6
|
const d = Object.getOwnPropertyDescriptor(v, key);
|
|
7
|
-
return d !== undefined && 'value'
|
|
7
|
+
return d !== undefined && Object.hasOwn(d, 'value') ? d.value : undefined;
|
|
8
8
|
}
|
|
9
9
|
catch {
|
|
10
10
|
return undefined;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentClient } from '@sema-agent/sdk';
|
|
2
|
+
import type { UiLanguage } from '../env/uiLanguage.js';
|
|
2
3
|
import type { EngineWireInjection } from '../engineWireSdk.js';
|
|
3
4
|
export type DelegatedPromptWireClient = {
|
|
4
5
|
sessions: Pick<AgentClient['sessions'], 'get'>;
|
|
@@ -11,9 +12,17 @@ export declare function delegatedPromptText(content: unknown): string | undefine
|
|
|
11
12
|
export declare function pickDelegatedPrompt(messages: readonly unknown[]): string | undefined;
|
|
12
13
|
type TranscriptWindowReader = (transcriptId: string) => Promise<readonly unknown[] | null>;
|
|
13
14
|
export declare function __setTranscriptWindowReaderForTests(r: TranscriptWindowReader | null): void;
|
|
15
|
+
export declare const DELEGATED_PROMPT_ABSENCE_CAUSES: readonly ["not_owned_after_restart", "not_in_store", "forbidden", "prompt_absent", "unknown"];
|
|
16
|
+
export type DelegatedPromptAbsenceCause = (typeof DELEGATED_PROMPT_ABSENCE_CAUSES)[number];
|
|
17
|
+
export interface DelegatedPromptAbsence {
|
|
18
|
+
readonly cause: DelegatedPromptAbsenceCause;
|
|
19
|
+
readonly text: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function delegatedPromptAbsenceSentence(cause: DelegatedPromptAbsenceCause | string, lang?: UiLanguage): string;
|
|
14
22
|
export interface DelegatedPromptFetch {
|
|
15
23
|
prompt?: string;
|
|
16
24
|
outcome: 'hit' | 'skipped' | 'unreadable' | 'absent';
|
|
25
|
+
absence?: DelegatedPromptAbsence;
|
|
17
26
|
}
|
|
18
27
|
export declare function fetchDelegatedPrompt(taskId: string, opts?: {
|
|
19
28
|
wire?: DelegatedPromptWire;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { stripSystemReminderBlocks } from '../systemReminderTag.js';
|
|
2
2
|
import { hostLog } from '../host.js';
|
|
3
3
|
import { isSessionIdPathSegment } from '../sessionIdSegment.js';
|
|
4
|
+
import { msg, renderMessage } from '../i18n/translate.js';
|
|
5
|
+
import { readThrownSlot } from '../wireFailureShape.js';
|
|
4
6
|
import { clientHasVerbs, engineWireFor, INJECTED_WIRE_SETTLE_MS, settleInjected } from '../engineWireFor.js';
|
|
5
7
|
import { resolveOwnerContext } from './engineSubagentResume.js';
|
|
6
8
|
import { panelAnchorOf } from '../panelReduce.js';
|
|
@@ -22,7 +24,7 @@ export function __resetEngineDelegatedPromptForTests() {
|
|
|
22
24
|
clearEnginePanelAnchors();
|
|
23
25
|
promptHydrateInFlight.clear();
|
|
24
26
|
}
|
|
25
|
-
const promptHydrateInFlight = new
|
|
27
|
+
const promptHydrateInFlight = new Map();
|
|
26
28
|
function roleOf(entry) {
|
|
27
29
|
if (typeof entry !== 'object' || entry === null)
|
|
28
30
|
return undefined;
|
|
@@ -113,13 +115,38 @@ async function readTranscriptWindow(transcriptId, sessionKey, injectedWire) {
|
|
|
113
115
|
const msgs = rec.messages;
|
|
114
116
|
return Array.isArray(msgs) ? msgs : null;
|
|
115
117
|
}
|
|
118
|
+
export const DELEGATED_PROMPT_ABSENCE_CAUSES = Object.freeze(['not_owned_after_restart', 'not_in_store', 'forbidden', 'prompt_absent', 'unknown']);
|
|
119
|
+
const ABSENCE_KEY = {
|
|
120
|
+
not_owned_after_restart: 'session.subagent.delegatedPrompt.absence.notOwnedAfterRestart',
|
|
121
|
+
not_in_store: 'session.subagent.delegatedPrompt.absence.notInStore',
|
|
122
|
+
forbidden: 'session.subagent.delegatedPrompt.absence.forbidden',
|
|
123
|
+
prompt_absent: 'session.subagent.delegatedPrompt.absence.promptAbsent',
|
|
124
|
+
unknown: 'session.subagent.delegatedPrompt.absence.unknown',
|
|
125
|
+
};
|
|
126
|
+
export function delegatedPromptAbsenceSentence(cause, lang) {
|
|
127
|
+
const known = typeof cause === 'string' && Object.hasOwn(ABSENCE_KEY, cause);
|
|
128
|
+
return renderMessage(msg(known ? ABSENCE_KEY[cause] : ABSENCE_KEY.unknown), lang);
|
|
129
|
+
}
|
|
130
|
+
function absenceOf(cause) {
|
|
131
|
+
return Object.freeze({ cause, text: delegatedPromptAbsenceSentence(cause) });
|
|
132
|
+
}
|
|
133
|
+
function absenceOfThrown(e) {
|
|
134
|
+
const status = readThrownSlot(e, 'status');
|
|
135
|
+
if (status === 404)
|
|
136
|
+
return absenceOf('not_in_store');
|
|
137
|
+
if (status === 401 || status === 403)
|
|
138
|
+
return absenceOf('forbidden');
|
|
139
|
+
return absenceOf('unknown');
|
|
140
|
+
}
|
|
116
141
|
export async function fetchDelegatedPrompt(taskId, opts) {
|
|
117
|
-
if (promptHydrateInFlight.has(taskId))
|
|
118
|
-
|
|
142
|
+
if (promptHydrateInFlight.has(taskId)) {
|
|
143
|
+
const settled = promptHydrateInFlight.get(taskId);
|
|
144
|
+
return settled ? { outcome: 'skipped', absence: settled } : { outcome: 'skipped' };
|
|
145
|
+
}
|
|
119
146
|
const transcriptId = getEngineTranscriptId(taskId);
|
|
120
147
|
if (!isSessionIdPathSegment(transcriptId))
|
|
121
|
-
return { outcome: 'skipped' };
|
|
122
|
-
promptHydrateInFlight.
|
|
148
|
+
return { outcome: 'skipped', absence: absenceOf(transcriptId === undefined ? 'not_owned_after_restart' : 'unknown') };
|
|
149
|
+
promptHydrateInFlight.set(taskId, null);
|
|
123
150
|
let msgs = null;
|
|
124
151
|
try {
|
|
125
152
|
msgs = await readTranscriptWindow(transcriptId, resolveOwnerContext(taskId).key, opts?.wire);
|
|
@@ -127,14 +154,18 @@ export async function fetchDelegatedPrompt(taskId, opts) {
|
|
|
127
154
|
catch (e) {
|
|
128
155
|
promptHydrateInFlight.delete(taskId);
|
|
129
156
|
hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId} read failed: ${String(e).slice(0, 160)}`);
|
|
130
|
-
return { outcome: 'unreadable' };
|
|
157
|
+
return { outcome: 'unreadable', absence: absenceOfThrown(e) };
|
|
131
158
|
}
|
|
132
159
|
const prompt = msgs ? pickDelegatedPrompt(msgs) : undefined;
|
|
133
160
|
if (!prompt) {
|
|
134
161
|
if (msgs === null)
|
|
135
162
|
promptHydrateInFlight.delete(taskId);
|
|
136
163
|
hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId}: ${msgs === null ? 'transcript unreadable (retryable)' : 'no delegated user message (final)'}`);
|
|
137
|
-
|
|
164
|
+
if (msgs === null)
|
|
165
|
+
return { outcome: 'unreadable', absence: absenceOf('unknown') };
|
|
166
|
+
const settled = absenceOf('prompt_absent');
|
|
167
|
+
promptHydrateInFlight.set(taskId, settled);
|
|
168
|
+
return { outcome: 'absent', absence: settled };
|
|
138
169
|
}
|
|
139
170
|
hostLog('debug', `[delegated-prompt] ${taskId} <- transcript ${transcriptId} (${prompt.length} chars) head=${JSON.stringify(prompt.slice(0, 60))}`);
|
|
140
171
|
return { prompt, outcome: 'hit' };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { engineCapTrue } from '../engineCapsCache.js';
|
|
2
|
-
import {
|
|
2
|
+
import { engineWireTargetBaseUrl } from '../engineWireTarget.js';
|
|
3
3
|
import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
4
4
|
export const engineOwnedRowIds = new Set();
|
|
5
5
|
export const fleetViewStubRowIds = new Set();
|
|
@@ -7,7 +7,7 @@ export function isEngineViewRow(taskId) {
|
|
|
7
7
|
return engineOwnedRowIds.has(taskId) || fleetViewStubRowIds.has(taskId);
|
|
8
8
|
}
|
|
9
9
|
export function engineTaskHandlesCapable(sessionKey = DEFAULT_SESSION_KEY, capsBaseUrl) {
|
|
10
|
-
return engineCapTrue(capsBaseUrl ??
|
|
10
|
+
return engineCapTrue(capsBaseUrl ?? engineWireTargetBaseUrl(sessionKey), 'taskHandles');
|
|
11
11
|
}
|
|
12
12
|
export function engineRowNeedsStopConfirm(taskId, sessionKey, capsBaseUrl) {
|
|
13
13
|
return isEngineViewRow(taskId) && engineTaskHandlesCapable(sessionKey ?? DEFAULT_SESSION_KEY, capsBaseUrl);
|
|
@@ -5,13 +5,13 @@ import { RESUME_SESSION_NOT_FOUND } from '../engineErrorCodes.js';
|
|
|
5
5
|
import { displayUntrusted } from '../displayUntrusted.js';
|
|
6
6
|
import { engineCapTrue } from '../engineCapsCache.js';
|
|
7
7
|
import { clientHasVerbs, engineWireFor, INJECTED_WIRE_SETTLE_MS, noAnswerDetailFrom, sendOnce, settleInjected } from '../engineWireFor.js';
|
|
8
|
-
import {
|
|
8
|
+
import { engineWireTargetBaseUrl } from '../engineWireTarget.js';
|
|
9
9
|
import { activeEngineRunId, engineSessionParamFor } from '../engineSessionParam.js';
|
|
10
10
|
import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
11
11
|
import { getBgParentRunOwner, parentToolCallIdOf, } from '../subagentContentStore.js';
|
|
12
12
|
export const SUBAGENT_RESUME_CAP = 'subagentResume';
|
|
13
13
|
export function subagentResumeAvailable(baseUrl, sessionKey = DEFAULT_SESSION_KEY) {
|
|
14
|
-
return engineCapTrue(baseUrl ??
|
|
14
|
+
return engineCapTrue(baseUrl ?? engineWireTargetBaseUrl(sessionKey), SUBAGENT_RESUME_CAP);
|
|
15
15
|
}
|
|
16
16
|
export function resolveSubagentContinueTarget(rowId, displayName) {
|
|
17
17
|
const precise = parentToolCallIdOf(rowId);
|
|
@@ -149,7 +149,7 @@ export async function resumeSettledSubagent(facade, runId, target, content, opts
|
|
|
149
149
|
}
|
|
150
150
|
const warnedRetainWithoutWake = new Set();
|
|
151
151
|
export function auditRetainWithoutWake(input) {
|
|
152
|
-
const baseUrl = input.baseUrl ??
|
|
152
|
+
const baseUrl = input.baseUrl ?? engineWireTargetBaseUrl(input.sessionKey ?? DEFAULT_SESSION_KEY);
|
|
153
153
|
if (!engineCapTrue(baseUrl, SUBAGENT_RESUME_CAP))
|
|
154
154
|
return undefined;
|
|
155
155
|
if (input.retainRequested === false)
|
|
@@ -13,6 +13,7 @@ export interface EngineTaskOutputResult {
|
|
|
13
13
|
status?: string;
|
|
14
14
|
stoppedBy?: string;
|
|
15
15
|
partialResult?: boolean;
|
|
16
|
+
exitCode?: number;
|
|
16
17
|
}
|
|
17
18
|
export declare function __resetTaskHandleWireForTests(): void;
|
|
18
19
|
export declare function fetchEngineTaskOutput(handle: string, opts?: {
|
|
@@ -6,6 +6,7 @@ import { engineSessionParamFor } from '../engineSessionParam.js';
|
|
|
6
6
|
import { resolveOwnerContext } from './engineSubagentResume.js';
|
|
7
7
|
import { engineTaskHandlesCapable } from './engineRowStopGate.js';
|
|
8
8
|
import { noteBgOwnerAbsence } from './subagentOwnerAbsence.js';
|
|
9
|
+
import { guardedRead, readOwnDataValue } from '../ownKey.js';
|
|
9
10
|
function usableTaskOutputClient(client) {
|
|
10
11
|
return clientHasVerbs(client, [['runs', 'taskOutput']]);
|
|
11
12
|
}
|
|
@@ -27,6 +28,13 @@ function sessionOf(ctx) {
|
|
|
27
28
|
const s = ctx.record?.sessionId ?? engineSessionParamFor(ctx.key);
|
|
28
29
|
return s !== undefined ? { session: s } : {};
|
|
29
30
|
}
|
|
31
|
+
function exitCodeOfTaskOutput(output) {
|
|
32
|
+
const details = guardedRead(() => readOwnDataValue(output, 'details'));
|
|
33
|
+
if (typeof details !== 'object' || details === null)
|
|
34
|
+
return undefined;
|
|
35
|
+
const code = guardedRead(() => readOwnDataValue(details, 'exitCode'));
|
|
36
|
+
return typeof code === 'number' && Number.isInteger(code) ? code : undefined;
|
|
37
|
+
}
|
|
30
38
|
const accumulated = new Map();
|
|
31
39
|
export function __resetTaskHandleWireForTests() {
|
|
32
40
|
accumulated.clear();
|
|
@@ -67,11 +75,13 @@ export async function fetchEngineTaskOutput(handle, opts) {
|
|
|
67
75
|
if (engineWireDebugEnabled()) {
|
|
68
76
|
hostLog('debug', `[task-handle] output ${handle} via run ${runId}: ok fresh=${fresh.length}b merged=${merged.length}b status=${typeof out.status === 'string' ? out.status : '-'}`);
|
|
69
77
|
}
|
|
78
|
+
const exitCode = exitCodeOfTaskOutput(out);
|
|
70
79
|
return {
|
|
71
80
|
content: merged,
|
|
72
81
|
...(typeof out.status === 'string' ? { status: out.status } : {}),
|
|
73
82
|
...(typeof out.stoppedBy === 'string' ? { stoppedBy: out.stoppedBy } : {}),
|
|
74
83
|
...(out.partial_result === true ? { partialResult: true } : {}),
|
|
84
|
+
...(exitCode !== undefined ? { exitCode } : {}),
|
|
75
85
|
};
|
|
76
86
|
}
|
|
77
87
|
catch (e) {
|
|
@@ -44,6 +44,7 @@ export declare const SUBAGENT_CONTENT_STORE_DEFAULTS: Readonly<SubagentContentSt
|
|
|
44
44
|
export declare function configureSubagentContentStore(next: Partial<SubagentContentStoreConfig>): void;
|
|
45
45
|
export declare function subagentContentStoreConfig(): SubagentContentStoreConfig;
|
|
46
46
|
export declare function __resetSubagentContentStoreConfigForTests(): void;
|
|
47
|
+
export declare function bindSubagentIdentityReader(fn: (id: string) => readonly string[] | undefined): void;
|
|
47
48
|
export declare function registerSubagentContentAlias(parentToolCallId: string, taskId: string): void;
|
|
48
49
|
export declare function registerSubagentAlias(parentToolCallId: string, taskId: string): void;
|
|
49
50
|
export declare function publishSubagentContentEvent(ev: SubagentContentEvent): void;
|