@sema-agent/client-core 0.11.16 → 0.11.17
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/README.md +1 -1
- package/dist/adapt.js +19 -0
- package/dist/engineAgentPanelStore.d.ts +6 -0
- package/dist/fleetAgentPanelProjection.d.ts +3 -0
- package/dist/fleetAgentPanelProjection.js +8 -1
- package/dist/hitl/askGateWire.js +6 -5
- package/dist/hitl/toolApprovalWire.d.ts +11 -0
- package/dist/hitl/toolApprovalWire.js +15 -1
- package/dist/notifications.d.ts +3 -1
- package/dist/notifications.js +21 -2
- package/dist/toolResult.js +8 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ Renamed from **`@sema-agent/wire-cc-adapter`** (0.1.x, deprecated — see *Migra
|
|
|
23
23
|
|
|
24
24
|
## Scope
|
|
25
25
|
|
|
26
|
-
**Version:** 0.11.
|
|
26
|
+
**Version:** 0.11.17
|
|
27
27
|
|
|
28
28
|
- **Today** — the adapter seam, the whole `adapt()` pipeline (all 14 A-layer arms plus the
|
|
29
29
|
B/D/E tool-card layers), the notification/caps/model families, the adapter kernel (stream driver
|
package/dist/adapt.js
CHANGED
|
@@ -705,6 +705,11 @@ class WireToCcAdapterImpl {
|
|
|
705
705
|
// 代价是失去 for-await 的隐式 cleanup ⇒ finally 里手动 return()(T58,少了它 = SSE 不拆)。
|
|
706
706
|
const iterator = frames[Symbol.asyncIterator]();
|
|
707
707
|
let iteratorDone = false;
|
|
708
|
+
// R1(clay 五报 07-31):retry 覆盖层的四个清除点全在 turn 边界,缺「重试成功→清」的转移 ——
|
|
709
|
+
// 引擎重试成功那一刻什么都不发(BrainStatusPhase 无恢复终态,候 core [2163]),所以恢复只能由
|
|
710
|
+
// 「主 lane 又有内容在流」这个事实来证明。挂旗后首个主 lane 内容帧即清,CC 同位 = 重试循环
|
|
711
|
+
// 退出即 onRetryStatus(null)(pretty220 finally 清)。
|
|
712
|
+
let retryOverlayActive = false;
|
|
708
713
|
try {
|
|
709
714
|
for (;;) {
|
|
710
715
|
const nextPromise = iterator.next();
|
|
@@ -755,6 +760,19 @@ class WireToCcAdapterImpl {
|
|
|
755
760
|
const m = rawFrame;
|
|
756
761
|
if (m === null || typeof m !== 'object')
|
|
757
762
|
continue;
|
|
763
|
+
if (retryOverlayActive &&
|
|
764
|
+
(m.type === 'stream_event' ||
|
|
765
|
+
m.type === 'assistant' ||
|
|
766
|
+
m.type === 'tool_end_result' ||
|
|
767
|
+
m.type === 'turn_usage') &&
|
|
768
|
+
typeof m.parentToolCallId !== 'string' &&
|
|
769
|
+
// stream_event 的子流标记在 event 里(:1230 thinking 臂同款判位),帧顶层没有。
|
|
770
|
+
typeof m.event?.parentToolCallId !== 'string') {
|
|
771
|
+
// 恢复即清:主 lane 内容帧到达 = 引擎那次重试已成功;子流帧(parentToolCallId)不算证据
|
|
772
|
+
// (主 brain 仍可能在退避等待,#47 矩阵 #5 同族判别)。
|
|
773
|
+
retryOverlayActive = false;
|
|
774
|
+
yield chrome({ kind: 'retry_status', laneProof: MAIN, status: null });
|
|
775
|
+
}
|
|
758
776
|
if (m.type === 'stream_event' && !messageStartEmitted) {
|
|
759
777
|
messageStartEmitted = true;
|
|
760
778
|
yield chrome({
|
|
@@ -1362,6 +1380,7 @@ class WireToCcAdapterImpl {
|
|
|
1362
1380
|
...(typeof m.retryInSec === 'number' ? { retryInSec: m.retryInSec } : {}),
|
|
1363
1381
|
}, ctx.now()),
|
|
1364
1382
|
});
|
|
1383
|
+
retryOverlayActive = true;
|
|
1365
1384
|
break;
|
|
1366
1385
|
}
|
|
1367
1386
|
default:
|
|
@@ -88,6 +88,12 @@ export type EngineAgentPanelEvent = {
|
|
|
88
88
|
* 修「详情页 Prompt 段恒空」。缺席 ⇒ 维持现状(诚实留白)。
|
|
89
89
|
*/
|
|
90
90
|
transcriptId?: string;
|
|
91
|
+
/**
|
|
92
|
+
* server 1.250 起行帧带的 launch 真锚(epoch ms)。R4(clay 五报 07-31):此前投影层丢弃它,
|
|
93
|
+
* 详情页 elapsed 只能锚「壳建行时刻」(createTaskStateBase 的 Date.now())——遗留/重挂行上
|
|
94
|
+
* 渲出 1h+ 假时长。消费端拿到即覆盖行的 startTime;缺席 ⇒ 老引擎,维持现状。
|
|
95
|
+
*/
|
|
96
|
+
startedAt?: number;
|
|
91
97
|
} | {
|
|
92
98
|
kind: 'end';
|
|
93
99
|
taskId: string;
|
|
@@ -17,6 +17,9 @@ export interface FleetAgentRowLike {
|
|
|
17
17
|
toolName: string;
|
|
18
18
|
target?: string;
|
|
19
19
|
};
|
|
20
|
+
/** server 1.250 起行带的 launch 真锚(epoch ms)。R4(clay 五报 07-31):此前投影载荷丢弃它,
|
|
21
|
+
* 详情页 elapsed 只能锚「壳建行时刻」——遗留行上渲出 1h+ 的假时长。缺席=老引擎,消费端保持现状。 */
|
|
22
|
+
startedAt?: number;
|
|
20
23
|
}
|
|
21
24
|
/** 行从投影集消失多久之后按 completed 兜底 settle(重连空窗 / snapshot 清表远小于此)。 */
|
|
22
25
|
export declare const ABSENT_SETTLE_MS = 30000;
|
|
@@ -80,6 +80,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
80
80
|
// 🔴 三态直取:`row.toolUses` 缺席就是 undefined,这里**不许**兜 0(见 FleetAgentRowLike 注)。
|
|
81
81
|
const toolUses = typeof row.toolUses === 'number' ? row.toolUses : undefined;
|
|
82
82
|
const transcriptId = row.transcriptId || undefined;
|
|
83
|
+
const startedAt = typeof row.startedAt === 'number' && row.startedAt > 0 ? row.startedAt : undefined;
|
|
83
84
|
const currentTool = currentToolKeyOf(row.currentTool) !== undefined ? row.currentTool : undefined;
|
|
84
85
|
const currentToolKey = currentToolKeyOf(row.currentTool);
|
|
85
86
|
const prev = seen.get(taskId);
|
|
@@ -89,7 +90,8 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
89
90
|
// 终态行也把最后一拍的累计工具数/转录锚带上:详情页在行翻终态后仍要显示真计数与
|
|
90
91
|
// 委派 prompt,而终态帧常常是这一行**唯一**带全 usage 的一帧(bg lane 只在活动边界发行帧)。
|
|
91
92
|
if ((toolUses !== undefined && prev?.toolUses !== toolUses) ||
|
|
92
|
-
(transcriptId !== undefined && prev?.transcriptId !== transcriptId)
|
|
93
|
+
(transcriptId !== undefined && prev?.transcriptId !== transcriptId) ||
|
|
94
|
+
(startedAt !== undefined && prev?.startedAt !== startedAt)) {
|
|
93
95
|
publishEngineAgentPanelEvent({
|
|
94
96
|
kind: 'fleet-row',
|
|
95
97
|
taskId,
|
|
@@ -98,6 +100,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
98
100
|
totalTokens: tokens,
|
|
99
101
|
...(toolUses !== undefined ? { toolUses } : {}),
|
|
100
102
|
...(transcriptId !== undefined ? { transcriptId } : {}),
|
|
103
|
+
...(startedAt !== undefined ? { startedAt } : {}),
|
|
101
104
|
});
|
|
102
105
|
}
|
|
103
106
|
publishEngineAgentPanelEvent({
|
|
@@ -111,6 +114,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
111
114
|
tokens,
|
|
112
115
|
toolUses: toolUses !== undefined ? toolUses : prev?.toolUses,
|
|
113
116
|
transcriptId: transcriptId !== undefined ? transcriptId : prev?.transcriptId,
|
|
117
|
+
startedAt: startedAt !== undefined ? startedAt : prev?.startedAt,
|
|
114
118
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
115
119
|
lastSeenAt: nowMs,
|
|
116
120
|
settled: true,
|
|
@@ -127,6 +131,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
127
131
|
prev.tokens !== tokens ||
|
|
128
132
|
(toolUses !== undefined && prev.toolUses !== toolUses) ||
|
|
129
133
|
(transcriptId !== undefined && prev.transcriptId !== transcriptId) ||
|
|
134
|
+
(startedAt !== undefined && prev.startedAt !== startedAt) ||
|
|
130
135
|
(currentToolKey !== undefined && prev.currentToolKey !== currentToolKey)) {
|
|
131
136
|
publishEngineAgentPanelEvent({
|
|
132
137
|
kind: 'fleet-row',
|
|
@@ -137,6 +142,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
137
142
|
// 🔴 缺席即不落键(消费端据「键在不在」判三态)。
|
|
138
143
|
...(toolUses !== undefined ? { toolUses } : {}),
|
|
139
144
|
...(transcriptId !== undefined ? { transcriptId } : {}),
|
|
145
|
+
...(startedAt !== undefined ? { startedAt } : {}),
|
|
140
146
|
...(currentTool !== undefined ? { currentTool } : {}),
|
|
141
147
|
});
|
|
142
148
|
}
|
|
@@ -146,6 +152,7 @@ export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
|
146
152
|
tokens,
|
|
147
153
|
toolUses: toolUses !== undefined ? toolUses : prev?.toolUses,
|
|
148
154
|
transcriptId: transcriptId !== undefined ? transcriptId : prev?.transcriptId,
|
|
155
|
+
startedAt: startedAt !== undefined ? startedAt : prev?.startedAt,
|
|
149
156
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
150
157
|
lastSeenAt: nowMs,
|
|
151
158
|
settled: false,
|
package/dist/hitl/askGateWire.js
CHANGED
|
@@ -2,7 +2,7 @@ import { HitlBridge } from './hitlBridge.js';
|
|
|
2
2
|
import { publishQuestionFrame, registerLocalQuestionResponder, hasQuestionOverlay, } from '../liveQuestionStore.js';
|
|
3
3
|
import { hostLog } from '../host.js';
|
|
4
4
|
import { createSessionSlot, DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
5
|
-
import {
|
|
5
|
+
import { isToolApprovalGate, toolNameIsFsWrite, surfaceFsApprovalAndDecide, isToolApprovalFrame, isFromSubagent, surfaceToolApprovalFrameAndRespond, } from './toolApprovalWire.js';
|
|
6
6
|
import { classifierDenyFromToolEnd } from '../classifierVerdictWire.js';
|
|
7
7
|
// W1(design/161):sessionKey → 注册表;零参 API = DEFAULT_SESSION_KEY 兼容层(cli 装配不动)。
|
|
8
8
|
const hostSurfaceByKey = createSessionSlot();
|
|
@@ -69,8 +69,9 @@ function isAskGatePark(result) {
|
|
|
69
69
|
typeof r.taskId === 'string' &&
|
|
70
70
|
r.taskId.length > 0);
|
|
71
71
|
}
|
|
72
|
-
/** done
|
|
73
|
-
*
|
|
72
|
+
/** done 帧的工具审批 park 形状([816] 放宽腿 + [2150] Bash 半场):status suspended +
|
|
73
|
+
* checkpointGate 指 fs 写三件 / Bash / 一等 kind==='tool_approval'(超集谓词 isToolApprovalGate,
|
|
74
|
+
* decide 腿对两族同构、卡形归壳分发)。Ask gate 恒先判(问答 overlay 原路)。 */
|
|
74
75
|
function isFsApprovalPark(result) {
|
|
75
76
|
const r = result;
|
|
76
77
|
return (!!r &&
|
|
@@ -78,7 +79,7 @@ function isFsApprovalPark(result) {
|
|
|
78
79
|
typeof r.taskId === 'string' &&
|
|
79
80
|
r.taskId.length > 0 &&
|
|
80
81
|
!isAskTool(r.checkpointGate?.toolName) &&
|
|
81
|
-
|
|
82
|
+
isToolApprovalGate(r.checkpointGate));
|
|
82
83
|
}
|
|
83
84
|
/** 把 wire 答案({answers:[{header,selected,note?}]})折回 CC 卡片的 Record<question,string> 形状
|
|
84
85
|
* (multiSelect 与对话框同款 ", " lossy join;note → annotations.notes)。 */
|
|
@@ -477,7 +478,7 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
|
477
478
|
park = { gate: 'ask' };
|
|
478
479
|
break;
|
|
479
480
|
}
|
|
480
|
-
if (ev.gate &&
|
|
481
|
+
if (ev.gate && isToolApprovalGate(ev.gate) && realTaskId) {
|
|
481
482
|
park = { gate: 'fs' };
|
|
482
483
|
break;
|
|
483
484
|
}
|
|
@@ -6,6 +6,17 @@ export declare function isFsApprovalGate(gate: {
|
|
|
6
6
|
toolName?: unknown;
|
|
7
7
|
} | undefined | null): boolean;
|
|
8
8
|
export declare function toolNameIsFsWrite(name: string): boolean;
|
|
9
|
+
/** shell 执行工具判定(Bash)。[2150] S1 半场:引擎对 Bash 发 durable park 时,fs 谓词不认 ⇒
|
|
10
|
+
* park 落「其余 gate 透传」= run 留 suspended、session 锁死(r1 E5 fail-stuck 实例)。 */
|
|
11
|
+
export declare function toolNameIsShellExec(name: string): boolean;
|
|
12
|
+
/** 工具审批 gate 判定(durable park 分诊用的**超集**谓词):一等 kind / fs 写三件 / shell 执行。
|
|
13
|
+
* decide 腿(approvals.decide)对两族同构;卡形分发归壳 ApprovalCardPort(toolForName 已含
|
|
14
|
+
* bash → BashPermissionRequest 映射,sema-cli a35e2b2)。`isFsApprovalGate` 保留原语义不动
|
|
15
|
+
* (公开面消费者按 fs 写理解它,把 Bash 塞进去是撒谎)。 */
|
|
16
|
+
export declare function isToolApprovalGate(gate: {
|
|
17
|
+
kind?: unknown;
|
|
18
|
+
toolName?: unknown;
|
|
19
|
+
} | undefined | null): boolean;
|
|
9
20
|
export type FsApprovalOutcome = {
|
|
10
21
|
kind: 'decided';
|
|
11
22
|
gatedCallId?: string;
|
|
@@ -15,6 +15,20 @@ export function toolNameIsFsWrite(name) {
|
|
|
15
15
|
const n = name.replace(/[\s_-]+/g, '').toLowerCase();
|
|
16
16
|
return (n === 'write' || n === 'filewrite' || n === 'edit' || n === 'fileedit' || n === 'multiedit' || n === 'notebookedit');
|
|
17
17
|
}
|
|
18
|
+
/** shell 执行工具判定(Bash)。[2150] S1 半场:引擎对 Bash 发 durable park 时,fs 谓词不认 ⇒
|
|
19
|
+
* park 落「其余 gate 透传」= run 留 suspended、session 锁死(r1 E5 fail-stuck 实例)。 */
|
|
20
|
+
export function toolNameIsShellExec(name) {
|
|
21
|
+
return name.replace(/[\s_-]+/g, '').toLowerCase() === 'bash';
|
|
22
|
+
}
|
|
23
|
+
/** 工具审批 gate 判定(durable park 分诊用的**超集**谓词):一等 kind / fs 写三件 / shell 执行。
|
|
24
|
+
* decide 腿(approvals.decide)对两族同构;卡形分发归壳 ApprovalCardPort(toolForName 已含
|
|
25
|
+
* bash → BashPermissionRequest 映射,sema-cli a35e2b2)。`isFsApprovalGate` 保留原语义不动
|
|
26
|
+
* (公开面消费者按 fs 写理解它,把 Bash 塞进去是撒谎)。 */
|
|
27
|
+
export function isToolApprovalGate(gate) {
|
|
28
|
+
if (isFsApprovalGate(gate))
|
|
29
|
+
return true;
|
|
30
|
+
return typeof gate?.toolName === 'string' && toolNameIsShellExec(gate.toolName);
|
|
31
|
+
}
|
|
18
32
|
/** 结构等值(键序无关深比较)——updatedInput「真编辑过」判定用。zod parse 会产新引用与重排,
|
|
19
33
|
* 引用比较/JSON.stringify 串比较都会假报「编辑过」。 */
|
|
20
34
|
export function structurallyEqual(a, b) {
|
|
@@ -115,7 +129,7 @@ export async function surfaceFsApprovalAndDecide(deps, taskId, argsByCall, signa
|
|
|
115
129
|
try {
|
|
116
130
|
const rows = (await deps.client.approvals.list(signal ? { signal } : undefined)).pending;
|
|
117
131
|
pending =
|
|
118
|
-
rows.find(r => r.taskId === taskId && typeof r.toolName === 'string' && toolNameIsFsWrite(r.toolName)) ??
|
|
132
|
+
rows.find(r => r.taskId === taskId && typeof r.toolName === 'string' && (toolNameIsFsWrite(r.toolName) || toolNameIsShellExec(r.toolName))) ??
|
|
119
133
|
rows.find(r => r.taskId === taskId);
|
|
120
134
|
}
|
|
121
135
|
catch (e) {
|
package/dist/notifications.d.ts
CHANGED
|
@@ -182,9 +182,11 @@ type BgTaskStatusProbe = (taskId: string) => Promise<{
|
|
|
182
182
|
terminal: boolean;
|
|
183
183
|
status: string;
|
|
184
184
|
} | null>;
|
|
185
|
+
/** 委派 prompt 取件口(行消费端建行/详情页兜底用)。未登记 ⇒ undefined(诚实缺席)。 */
|
|
186
|
+
export declare function outstandingBgTaskPrompt(taskId: string): string | undefined;
|
|
185
187
|
export declare function installBgTaskStatusProbe(probe: BgTaskStatusProbe): void;
|
|
186
188
|
/** bridge 在 Agent async_launched 回执(structured type:'agent')经过时登记。幂等;已通知不再登记。 */
|
|
187
|
-
export declare function registerOutstandingBgTask(taskId: string, description: string): void;
|
|
189
|
+
export declare function registerOutstandingBgTask(taskId: string, description: string, prompt?: string): void;
|
|
188
190
|
export declare function isOwnWorkflowRun(runId: string): boolean;
|
|
189
191
|
/** 本壳亲手启动过的 workflow run 列表(Set 插入序 = 启动序;/workflows 命令的目标 run 选择用,
|
|
190
192
|
* cmd-workflows.tsx——fleet source 无行可选时的兜底 id 源)。 */
|
package/dist/notifications.js
CHANGED
|
@@ -388,12 +388,31 @@ export function installWorkflowStatusProbe(probe) {
|
|
|
388
388
|
}
|
|
389
389
|
const outstandingBgTasks = new Map();
|
|
390
390
|
let bgStatusProbe = null;
|
|
391
|
+
/**
|
|
392
|
+
* R4(clay 五报 07-31)委派 prompt 台账:`async_launched` 回执带全 {task_id, description, prompt}
|
|
393
|
+
* 三件,但此前 prompt 只进消息 payload(ctrl+o expand 那条腿),任务行/详情页(↓ manage)取不到,
|
|
394
|
+
* 只能绕道等引擎 running 期不发的 transcriptId 去转录读面捞 ⇒ Prompt 节恒空。
|
|
395
|
+
* 这里按行 id 记一份(与 fleet 行 rowIdTail 同 keyspace),行消费端建行时取用。
|
|
396
|
+
* 与 outstandingBgTasks 分开存:后者随通知摘除,prompt 在行的整个生命周期都要可取。
|
|
397
|
+
* process-lifetime 有界:bg 子代数量 = 人手派发量级,不设逐出。
|
|
398
|
+
*/
|
|
399
|
+
const bgTaskPrompts = new Map();
|
|
400
|
+
/** 委派 prompt 取件口(行消费端建行/详情页兜底用)。未登记 ⇒ undefined(诚实缺席)。 */
|
|
401
|
+
export function outstandingBgTaskPrompt(taskId) {
|
|
402
|
+
return bgTaskPrompts.get(taskId);
|
|
403
|
+
}
|
|
391
404
|
export function installBgTaskStatusProbe(probe) {
|
|
392
405
|
bgStatusProbe = probe;
|
|
393
406
|
}
|
|
394
407
|
/** bridge 在 Agent async_launched 回执(structured type:'agent')经过时登记。幂等;已通知不再登记。 */
|
|
395
|
-
export function registerOutstandingBgTask(taskId, description) {
|
|
396
|
-
if (!taskId
|
|
408
|
+
export function registerOutstandingBgTask(taskId, description, prompt) {
|
|
409
|
+
if (!taskId)
|
|
410
|
+
return;
|
|
411
|
+
// prompt 台账先记(与 watcher 登记的幂等早退解耦:重复回执/已通知任务的 prompt 仍要可取)。
|
|
412
|
+
if (typeof prompt === 'string' && prompt.length > 0 && !bgTaskPrompts.has(taskId)) {
|
|
413
|
+
bgTaskPrompts.set(taskId, prompt);
|
|
414
|
+
}
|
|
415
|
+
if (notifiedRunIds.has(taskId) || outstandingBgTasks.has(taskId))
|
|
397
416
|
return;
|
|
398
417
|
outstandingBgTasks.set(taskId, { registeredAt: Date.now(), description });
|
|
399
418
|
ensureWatchTimer();
|
package/dist/toolResult.js
CHANGED
|
@@ -75,6 +75,13 @@ export const STRUCTURED_DETAIL_TYPES = new Set([
|
|
|
75
75
|
'fork',
|
|
76
76
|
'enter-plan-mode',
|
|
77
77
|
'exit-plan-mode',
|
|
78
|
+
// core 2.7.0 跟车四型(engine-vocab 等值门抓获,[dep-bump-follow-on] 计数钉族):本表只判
|
|
79
|
+
// 「structured 在场」,switch 认不得的照旧走 text 回落 —— 加型=让正则反解对新卡退位,不加型
|
|
80
|
+
// =把引擎的结构化当裸对象。
|
|
81
|
+
'file_unchanged',
|
|
82
|
+
'worktree',
|
|
83
|
+
'monitor-start',
|
|
84
|
+
'path_not_in_root',
|
|
78
85
|
]);
|
|
79
86
|
/** structured 在场判别:顶层 `type` ∈ 白名单 ⇒ 返回该 type,否则 undefined(= 不在场)。 */
|
|
80
87
|
export function structuredDetailType(structured) {
|
|
@@ -610,7 +617,7 @@ modelText) {
|
|
|
610
617
|
if (agentId === undefined || typeof s.description !== 'string' || typeof s.prompt !== 'string') {
|
|
611
618
|
return null;
|
|
612
619
|
}
|
|
613
|
-
registerOutstandingBgTask(agentId, s.description);
|
|
620
|
+
registerOutstandingBgTask(agentId, s.description, s.prompt);
|
|
614
621
|
return {
|
|
615
622
|
toolUseResult: {
|
|
616
623
|
isAsync: true,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sema-agent/client-core",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.17",
|
|
4
4
|
"description": "Client-side session runtime shared by every sema human client (TUI / web / desktop): sema wire frames (AgentEvent) -> CC session vocabulary (SDKMessage) with dual-plane output (transcript/chrome), deterministic transcript ids, lane discipline as a type, and the notification/dedup ledgers. Every CC-skin shape is collected here so the wire itself stays neutral. Blackboard [1832] design axioms; [1651]/[1652]/[1653] signed seam design. Renamed from @sema-agent/wire-cc-adapter (0.1.x).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|