@qilin-agent/client-ui-deliverables 3.1.3 → 3.1.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/README.i18n.yaml CHANGED
@@ -5,54 +5,54 @@
5
5
  /:
6
6
  en: 91a4da87e2e078ed
7
7
  zh: 8d489c6cdf208c4d
8
- /qilin-client-ui-deliverables:
9
- en: d9e6d3ea4b5cbbac
10
- zh: 25b1fd8af2a4968c
11
- /qilin-client-ui-deliverables/summary:
8
+ /qilin-agent-client-ui-deliverables:
9
+ en: 526218e958a05884
10
+ zh: 1db97342024d5de2
11
+ /qilin-agent-client-ui-deliverables/summary:
12
12
  en: a17b97d16803f911
13
13
  zh: ad80cf4bcb5a8018
14
- /qilin-client-ui-deliverables/table-of-contents:
14
+ /qilin-agent-client-ui-deliverables/table-of-contents:
15
15
  en: d152484eb41ac6b4
16
16
  zh: 09388d293f9be9cb
17
- /qilin-client-ui-deliverables/use-this-package:
17
+ /qilin-agent-client-ui-deliverables/use-this-package:
18
18
  en: bec3addae05b0c63
19
19
  zh: 82ca127bb0db9db6
20
- /qilin-client-ui-deliverables/use-this-package/explicit-deliveries:
20
+ /qilin-agent-client-ui-deliverables/use-this-package/explicit-deliveries:
21
21
  en: 6f99703dbe5bd915
22
22
  zh: 474a5887e41a61e6
23
- /qilin-client-ui-deliverables/use-this-package/the-changed-files-card:
23
+ /qilin-agent-client-ui-deliverables/use-this-package/the-changed-files-card:
24
24
  en: 264e3d8c2c3308a0
25
25
  zh: 268655df9cc8ceb9
26
- /qilin-client-ui-deliverables/use-this-package/the-review-tab:
26
+ /qilin-agent-client-ui-deliverables/use-this-package/the-review-tab:
27
27
  en: 3841abce6e33c564
28
28
  zh: 31175cf69c33b0c9
29
- /qilin-client-ui-deliverables/use-this-package/inline-code-links:
30
- en: e36ccef8bf908ea4
31
- zh: 30e11327a55e5dfa
32
- /qilin-client-ui-deliverables/understand-the-implementation:
33
- en: 5e81e43b907c01ee
34
- zh: d61a3c369ffad8d1
35
- /qilin-client-ui-deliverables/further-exploration:
29
+ /qilin-agent-client-ui-deliverables/use-this-package/inline-code-links:
30
+ en: ef13aac8ac36a5c3
31
+ zh: d785795c6d9a31ec
32
+ /qilin-agent-client-ui-deliverables/understand-the-implementation:
33
+ en: aa53866b7fa34726
34
+ zh: 2c1ad12c8c9f9d0d
35
+ /qilin-agent-client-ui-deliverables/further-exploration:
36
36
  en: 7fbb38158f458cd4
37
37
  zh: e6bec53bc5f4fb58
38
- /qilin-client-ui-deliverables/model-experience:
38
+ /qilin-agent-client-ui-deliverables/model-experience:
39
39
  en: 215e7ba838619b7b
40
40
  zh: a311da3843709f90
41
- /qilin-client-ui-deliverables/model-experience/clickable-file-reference-guidance:
41
+ /qilin-agent-client-ui-deliverables/model-experience/clickable-file-reference-guidance:
42
42
  en: eb244aa21a4e5210
43
43
  zh: e3450addfa19cea5
44
- /qilin-client-ui-deliverables/model-experience/clickable-file-reference-guidance/what-the-model-sees:
44
+ /qilin-agent-client-ui-deliverables/model-experience/clickable-file-reference-guidance/what-the-model-sees:
45
45
  en: b191a86a061cbb07
46
46
  zh: 1e080b8fedb3a4f8
47
- /qilin-client-ui-deliverables/model-experience/clickable-file-reference-guidance/token-effect:
47
+ /qilin-agent-client-ui-deliverables/model-experience/clickable-file-reference-guidance/token-effect:
48
48
  en: b6c79433affb56a6
49
49
  zh: a084318c814aa03c
50
- /qilin-client-ui-deliverables/model-experience/clickable-file-reference-guidance/kv-cache-effect:
50
+ /qilin-agent-client-ui-deliverables/model-experience/clickable-file-reference-guidance/kv-cache-effect:
51
51
  en: 52626a05acc8b320
52
52
  zh: 6a8e62b0d47d5297
53
- /qilin-client-ui-deliverables/known-limitations-and-deferred-work:
53
+ /qilin-agent-client-ui-deliverables/known-limitations-and-deferred-work:
54
54
  en: 7cf1624dbf46ec53
55
55
  zh: 4cf51dd265f1965f
56
- /qilin-client-ui-deliverables/known-limitations-and-deferred-work/dev-note:
56
+ /qilin-agent-client-ui-deliverables/known-limitations-and-deferred-work/dev-note:
57
57
  en: e67f633dc6fe7773
58
58
  zh: 3bb0c20c93f16f98
package/README.md CHANGED
@@ -46,7 +46,7 @@ A row opens the turn's `changes-review` tab, addressed by the viewed Session and
46
46
 
47
47
  ### Inline-code links
48
48
 
49
- The closing prose links produced or delivered paths: an inline-code token resolves by exact path, or by being exactly the basename of exactly one such path — a basename two paths share stays inert rather than guessing, so a mention can never open the wrong file. A resolved mention keeps its code chip and takes the markdown sheet's link language, with the full path as its title.
49
+ The closing prose links produced or delivered paths: an inline-code token resolves by exact target, by an exact argument recorded for that target, or by a unique basename. Every matching fact must identify the same file; ambiguous arguments and basenames stay inert. No suffix or current-directory guess is used. A resolved mention keeps its code chip and takes the markdown sheet's link language, with the full path as its title.
50
50
 
51
51
  -----
52
52
 
@@ -56,7 +56,7 @@ The closing prose links produced or delivered paths: an inline-code token resolv
56
56
  <details>
57
57
  <summary>Implementation internals — click to expand</summary>
58
58
 
59
- The Node half registers the static `ui:deliverable-file-references` system-prompt section described under [Model Experience](#model-experience). Explicit Markdown links use the shared [Markdown renderer](../ui-primitives/README.md); inline-code matching remains limited to produced or delivered files. The browser half registers a wrapper around the changed-files card and explicit deliveries into the chat view's `conversation.chat.turnTail` list alongside other feature artifacts. `deliverablesDefinition` folds the sequence of each Turn's latest validated `workspace/changes` announcement into `DeliverablesTurnData.changes`, whose summary the card reads from the Host and caches until the connection is replaced, its `deliverables/presented` events into deliveries, and the successful first-party mutation calls of `write`, `edit`, and mutating `str_replace_editor` commands into produced paths from their validated raw arguments; the produced paths feed only the prose mention resolver. Reads, deletes, unsupported tools, malformed calls, malformed events, and failed results contribute nothing. Each row opens `qilin-resource://changes-review/session/<sessionId>/<seq>/<turn>` through `ctx.sidebarRight.openResource` with the file's index as the `changes-review` navigation parameter; the package registers the `changes-review` tab type at the `builtin` band for that pattern and its body under the keyed `sidebar.right.pane.tab` seat with an exclusive store of per-tab choices, and the body reads the summary and the comparisons through the authenticated routes into stores cleared on connection replacement. The package also provides the `chatFileMentions` service the chat view consults per closing message; composing the plugin out removes every surface and leaves the view's empty list at zero cost.
59
+ The Node half registers the static `ui:deliverable-file-references` system-prompt section described under [Model Experience](#model-experience). Explicit Markdown links use the shared [Markdown renderer](../ui-primitives/README.md); inline-code matching remains limited to produced or delivered files. The browser half registers a wrapper around the changed-files card and explicit deliveries into the chat view's `conversation.chat.turnTail` list alongside other feature artifacts. `deliverablesDefinition` folds the sequence of each Turn's latest validated `workspace/changes` announcement into `DeliverablesTurnData.changes`, whose summary the card reads from the Host and caches until the connection is replaced, its `deliverables/presented` events into deliveries, and the successful first-party mutation calls of `write`, `edit`, and mutating `str_replace_editor` commands into produced paths from their recorded absolute targets, falling back to validated raw arguments for legacy results; the produced paths feed only the prose mention resolver. Reads, deletes, unsupported tools, malformed calls, malformed events, and failed results contribute nothing. Each row opens `qilin-resource://changes-review/session/<sessionId>/<seq>/<turn>` through `ctx.sidebarRight.openResource` with the file's index as the `changes-review` navigation parameter; the package registers the `changes-review` tab type at the `builtin` band for that pattern and its body under the keyed `sidebar.right.pane.tab` seat with an exclusive store of per-tab choices, and the body reads the summary and the comparisons through the authenticated routes into stores cleared on connection replacement. The package also provides the `chatFileMentions` service the chat view consults per closing message; composing the plugin out removes every surface and leaves the view's empty list at zero cost.
60
60
 
61
61
  Native opening uses an authenticated POST addressed by the viewed Session, event sequence, and original file index; the review tab's native open of a changed file uses the same coordinates. For a declaration the Host reads the viewed Session header with the event and passes its cwd, or the deployment workspace root when absent, to `workspaceFiles.stat`; for a changed file it passes the working directory the served summary carries. This uses the same composed filesystem as Sidebar previews and does not activate an Agent, including for child Sessions. Native actions require the canonical process path to map from a Host path back to that same process path. Providers without this mapping return 422, after which the review tab hides its native open; a same-named Host file is insufficient. The same configured desktop availability governs metadata and execution. Edits affect subsequent opens; deletion returns an error. No file-content copy or attachment is created. Plugin disposal cancels and awaits pending native-open requests.
62
62
 
package/README.zh.md CHANGED
@@ -46,7 +46,7 @@ Web 的 `standard`、`ptc` 与 `cordis` preset 提供 `present` 用于声明交
46
46
 
47
47
  ### 行内代码链接
48
48
 
49
- 收尾正文链接产出或已交付的路径:行内代码 token 按精确路径解析,或当它恰好等于其中某条路径的 basename 且该路径唯一时解析——两条路径共享同一 basename 时保持不可点击而不作猜测,因此提及绝不打开错误的文件。解析成功的提及保留代码标签,并采用 Markdown 样式表的链接样式,完整路径作为其 `title`。
49
+ 收尾正文链接产出或已交付的路径:行内代码 token 按精确目标、按为该目标记录的精确参数、或按唯一 basename 解析;所有命中的事实必须指向同一个文件,参数或 basename 有歧义时保持不可点击。不使用后缀猜测,也不使用当前目录猜测。解析成功的提及保留代码标签,并采用 Markdown 样式表的链接样式,完整路径作为其 `title`。
50
50
 
51
51
  -----
52
52
 
@@ -56,7 +56,7 @@ Web 的 `standard`、`ptc` 与 `cordis` preset 提供 `present` 用于声明交
56
56
  <details>
57
57
  <summary>实现细节——点击展开</summary>
58
58
 
59
- Node 半部注册[模型体验](#model-experience)所述的静态 `ui:deliverable-file-references` 系统提示词段。显式 Markdown 链接使用共享的 [Markdown 渲染器](../ui-primitives/README.zh.md);行内代码匹配仍仅限产出或交付文件。浏览器半部把组合改动文件卡片与显式交付的包装组件注册进 chat 视图的 `conversation.chat.turnTail` 列表,与其他功能产物并列。`deliverablesDefinition` 把每个轮次最新且通过校验的 `workspace/changes` 宣告的序号折叠进 `DeliverablesTurnData.changes`,卡片按它向 Host 读取摘要并缓存到连接被替换为止,把 `deliverables/presented` 事件折叠为交付,并根据 `write`、`edit` 和有修改作用的 `str_replace_editor` 命令中经过校验的原始参数把成功的第一方修改调用折叠为产出路径;产出路径只供正文提及解析器使用。读取、删除、不受支持的工具、格式错误的调用、格式错误的事件和失败结果不贡献任何条目。每一行通过 `ctx.sidebarRight.openResource` 打开 `qilin-resource://changes-review/session/<sessionId>/<seq>/<turn>`,并以文件下标作为 `changes-review` 的导航参数;本包在 `builtin` 档为该模式注册 `changes-review` tab 类型,把其 body 连同一个按 tab 保存选择的独占 store 注册到按键的 `sidebar.right.pane.tab` 座位下,body 通过经过认证的路由把摘要和对比读进连接更换时清空的 store。本包还提供 chat 视图按收尾消息查询的 `chatFileMentions` 服务;把插件组合出去会移除全部表面,视图的空列表以零成本留下。
59
+ Node 半部注册[模型体验](#model-experience)所述的静态 `ui:deliverable-file-references` 系统提示词段。显式 Markdown 链接使用共享的 [Markdown 渲染器](../ui-primitives/README.zh.md);行内代码匹配仍仅限产出或交付文件。浏览器半部把组合改动文件卡片与显式交付的包装组件注册进 chat 视图的 `conversation.chat.turnTail` 列表,与其他功能产物并列。`deliverablesDefinition` 把每个轮次最新且通过校验的 `workspace/changes` 宣告的序号折叠进 `DeliverablesTurnData.changes`,卡片按它向 Host 读取摘要并缓存到连接被替换为止,把 `deliverables/presented` 事件折叠为交付,并根据 `write`、`edit` 和有修改作用的 `str_replace_editor` 命令记录的绝对目标(旧结果回落到经过校验的原始参数)把成功的第一方修改调用折叠为产出路径;产出路径只供正文提及解析器使用。读取、删除、不受支持的工具、格式错误的调用、格式错误的事件和失败结果不贡献任何条目。每一行通过 `ctx.sidebarRight.openResource` 打开 `qilin-resource://changes-review/session/<sessionId>/<seq>/<turn>`,并以文件下标作为 `changes-review` 的导航参数;本包在 `builtin` 档为该模式注册 `changes-review` tab 类型,把其 body 连同一个按 tab 保存选择的独占 store 注册到按键的 `sidebar.right.pane.tab` 座位下,body 通过经过认证的路由把摘要和对比读进连接更换时清空的 store。本包还提供 chat 视图按收尾消息查询的 `chatFileMentions` 服务;把插件组合出去会移除全部表面,视图的空列表以零成本留下。
60
60
 
61
61
  原生打开使用经过认证的 POST,通过当前查看的会话、事件序号和原始文件索引定位声明;review tab 对改动文件的原生打开使用同一组坐标。对声明,Host 读取事件及当前查看的会话 header,将其中的 cwd 传给 `workspaceFiles.stat`,未记录 cwd 时使用部署的工作目录;对改动文件,传的是所提供摘要携带的工作目录。它与侧栏预览使用同一组合文件系统,无需启动 Agent,子会话也适用。原生操作要求规范化的进程路径能从 Host 路径映射回同一进程路径。提供方没有这种映射时返回 422,之后 review tab 隐藏原生打开;Host 上存在同名文件并不足够。同一份桌面可用性配置同时约束信息查询和实际执行。编辑会影响后续打开的内容;删除后返回错误。不创建文件内容副本或附件。插件释放时取消并等待进行中的原生打开请求。
62
62
 
package/lib/client.js CHANGED
@@ -800,9 +800,10 @@ window.__ModuleLoader__.load({
800
800
  //#region lib/types/client/turn-deliverables.js
801
801
  /**
802
802
  * Turn-scoped produced-file Definition and readers. Client-only and
803
- * model-free: produced paths come from successful first-party mutation calls,
804
- * changed files from the Host's recorded git summary, and deliveries from
805
- * `present`; never from presentation data or the closing prose.
803
+ * model-free: produced paths come from successful first-party mutation calls and
804
+ * their recorded file targets, changed files from the Host's recorded git
805
+ * summary, and deliveries from `present`; never from presentation data or
806
+ * the closing prose.
806
807
  */
807
808
  /**
808
809
  * Extract the path from a supported first-party mutation call. Session
@@ -846,6 +847,12 @@ window.__ModuleLoader__.load({
846
847
  function pathValue(value) {
847
848
  return typeof value === "string" && value.trim().length > 0 ? value : null;
848
849
  }
850
+ /** Resolve a settled mutation from recorded metadata, retaining legacy argument paths. */
851
+ function mutationResultPath(argumentPath, meta) {
852
+ if (!isRecord(meta) || !Object.hasOwn(meta, "path")) return argumentPath;
853
+ if (typeof meta.path === "string" && isAbsoluteWorkspacePath(meta.path)) return meta.path;
854
+ return isAbsoluteWorkspacePath(argumentPath) ? argumentPath : null;
855
+ }
849
856
  /** Narrow parsed JSON to an argument object. */
850
857
  function isRecord(value) {
851
858
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -853,9 +860,10 @@ window.__ModuleLoader__.load({
853
860
  /**
854
861
  * Files produced by one Turn data value.
855
862
  *
856
- * The source is the arguments of successful `write`, `edit`, and mutating
857
- * `str_replace_editor` calls, not the closing prose: a produced file must be
858
- * listed whether or not the model remembered to name it. Reads, unsupported
863
+ * The source is successful `write`, `edit`, and mutating
864
+ * `str_replace_editor` calls and their recorded absolute targets; legacy
865
+ * results use arguments. A produced file must be listed whether or not the
866
+ * model remembered to name it. Reads, unsupported
859
867
  * tools, malformed calls, and failed results contribute nothing. Paths keep
860
868
  * first-seen order and appear once, so a file written and then edited in the
861
869
  * same turn is one entry.
@@ -955,12 +963,15 @@ window.__ModuleLoader__.load({
955
963
  if (match.event.type !== "tool/result") return context.state;
956
964
  if (match.event.data.message.isError === true) return context.state;
957
965
  const callId = String(match.event.data.message.source.callId);
958
- const path = context.state.calls.get(callId);
959
- return path === null || path === void 0 ? context.state : {
966
+ const argumentPath = context.state.calls.get(callId);
967
+ if (argumentPath === null || argumentPath === void 0) return context.state;
968
+ const path = mutationResultPath(argumentPath, match.event.data.meta);
969
+ return path === null ? context.state : {
960
970
  ...context.state,
961
971
  produced: [...context.state.produced, {
962
972
  seq: match.event.seq,
963
- path
973
+ path,
974
+ ...path === argumentPath ? {} : { argumentPath }
964
975
  }]
965
976
  };
966
977
  },
@@ -999,17 +1010,20 @@ window.__ModuleLoader__.load({
999
1010
  }
1000
1011
  /**
1001
1012
  * Resolves inline-code references against one turn's produced or delivered
1002
- * paths. Exact paths resolve directly; a basename resolves only when exactly
1003
- * one supplied path has that basename. Ambiguous and unknown tokens stay inert.
1013
+ * paths and explicit mutation arguments. A reference resolves only when every
1014
+ * exact or basename match identifies one target. Ambiguous and unknown tokens stay inert.
1004
1015
  * @param paths - The turn's produced or delivered paths, already deduplicated.
1005
1016
  * @param openFile - The chat view's file opener.
1006
1017
  * @param label - Localizes the accessible open-label for a resolved path.
1018
+ * @param operations - successful mutations whose literal arguments may name the same canonical targets.
1007
1019
  * @returns The resolver MarkdownText consumes; the full path rides `title`,
1008
1020
  * the same disambiguator the row's chips carry.
1009
1021
  */
1010
- function producedFileMentions(paths, openFile, label) {
1022
+ function producedFileMentions(paths, openFile, label, operations = []) {
1011
1023
  return { resolve(value) {
1012
- const path = paths.includes(value) ? value : onlyPathWithBasename(paths, value);
1024
+ const matches = new Set(paths.filter((path) => path === value || basename(path) === value));
1025
+ for (const operation of operations) if (operation.argumentPath === value) matches.add(operation.path);
1026
+ const path = matches.size === 1 ? matches.values().next().value : void 0;
1013
1027
  if (path === void 0) return void 0;
1014
1028
  return {
1015
1029
  open: () => {
@@ -1020,11 +1034,6 @@ window.__ModuleLoader__.load({
1020
1034
  };
1021
1035
  } };
1022
1036
  }
1023
- /** The single supplied path whose basename is exactly `value`, else undefined. */
1024
- function onlyPathWithBasename(paths, value) {
1025
- const matches = paths.filter((path) => basename(path) === value);
1026
- return matches.length === 1 ? matches[0] : void 0;
1027
- }
1028
1037
  //#endregion
1029
1038
  //#region \0qilin-css:/home/runner/work/QiLin/QiLin/packages/client/ui-deliverables/src/client/Deliverables.module.css.mjs
1030
1039
  const css$1 = "._2Q7zSW_root{--deliverable-fill:var(--qilin-static-neutral-50);--deliverable-hover:var(--qilin-static-neutral-100);flex-direction:column;gap:16px;min-width:0;margin-top:4px;display:flex;container-type:inline-size}._2Q7zSW_root[data-after-changes=true]{margin-top:0}body[data-ds-dark-theme] ._2Q7zSW_root{--deliverable-fill:var(--qilin-static-neutral-850);--deliverable-hover:var(--qilin-static-neutral-800)}._2Q7zSW_hostStatus{color:var(--qilin-alias-label-secondary);align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}._2Q7zSW_presented{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;min-width:0;display:grid}._2Q7zSW_presented[data-single=true]{grid-template-columns:minmax(0,1fr)}._2Q7zSW_file{box-sizing:border-box;border:.5px solid var(--qilin-alias-border-l1);background:var(--deliverable-fill);min-width:0;height:60px;color:var(--qilin-alias-label-primary);border-radius:18px;align-items:center;gap:10px;padding:8px 10px;transition:background-color .12s;display:flex;position:relative;overflow:hidden}._2Q7zSW_file:hover{background:var(--deliverable-hover)}._2Q7zSW_cardPreview{z-index:1;border-radius:inherit;cursor:pointer;background:0 0;border:0;width:100%;padding:0;position:absolute;inset:0}._2Q7zSW_cardPreview:focus-visible{box-shadow:inset 0 0 0 2px var(--qilin-focus-ring-color,var(--qilin-alias-state-business-primary));outline:none}._2Q7zSW_fileIcon{z-index:2;box-sizing:border-box;pointer-events:none;border:.5px solid var(--qilin-alias-border-l1);background:var(--deliverable-fill);width:40px;height:40px;color:var(--qilin-alias-link);border-radius:10px;flex:none;place-items:center;display:grid;position:relative;overflow:hidden}._2Q7zSW_fileBody{z-index:2;pointer-events:none;flex:1;justify-content:space-between;align-items:center;gap:12px;min-width:0;display:flex;position:relative}._2Q7zSW_details{flex-direction:column;flex:1;justify-content:center;gap:2px;min-width:0;display:flex}._2Q7zSW_fileName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;line-height:20px;overflow:hidden}._2Q7zSW_description{color:var(--qilin-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:400;line-height:16px;overflow:hidden}._2Q7zSW_description[data-error=true]{color:var(--qilin-alias-state-error-primary)}._2Q7zSW_previewHint,._2Q7zSW_file:hover ._2Q7zSW_secondaryText{display:none}._2Q7zSW_file:hover ._2Q7zSW_previewHint{display:inline}._2Q7zSW_split{box-sizing:border-box;pointer-events:auto;border:.5px solid var(--qilin-alias-border-l3);background:var(--qilin-alias-button-floating-fill);border-radius:10px;flex:none;align-items:stretch;height:28px;display:inline-flex;overflow:hidden}._2Q7zSW_menuAnchor{align-self:stretch}._2Q7zSW_open,._2Q7zSW_chevron{color:var(--qilin-alias-label-primary);cursor:pointer;font-family:var(--qilin-font-family);background:0 0;border:0;justify-content:center;align-items:center;display:inline-flex}._2Q7zSW_open{padding:4px 8px;font-size:12px;line-height:18px}._2Q7zSW_chevron{border-left:.5px solid var(--qilin-alias-border-l3);color:var(--qilin-alias-label-secondary);padding:4px 5px}._2Q7zSW_open:hover,._2Q7zSW_open:focus-visible,._2Q7zSW_chevron:hover:not(:disabled),._2Q7zSW_chevron:focus-visible{background:var(--qilin-alias-interactive-bg-hover)}._2Q7zSW_chevron:disabled{color:var(--qilin-alias-label-dimmed);cursor:not-allowed}._2Q7zSW_menuActionIcon{width:16px;height:16px;display:block}._2Q7zSW_toggle{min-width:0;color:var(--qilin-alias-label-tertiary);cursor:pointer;font:inherit;background:0 0;border:0;border-radius:8px;align-self:center;align-items:center;gap:4px;padding:1px 11px;font-size:12px;line-height:18px;display:inline-flex}._2Q7zSW_toggle:hover{background:var(--qilin-alias-interactive-bg-hover)}._2Q7zSW_toggle svg{flex:none;width:14px;height:14px}@container (width<=620px){._2Q7zSW_presented{grid-template-columns:minmax(0,1fr)}}@media (pointer:coarse){._2Q7zSW_split{min-height:44px}._2Q7zSW_open,._2Q7zSW_chevron{min-width:44px}}";
@@ -2212,7 +2221,7 @@ window.__ModuleLoader__.load({
2212
2221
  const paths = selectProducedFiles(owner);
2213
2222
  const presented = presentedForClosing(owner);
2214
2223
  if (paths === null && presented.length === 0) return void 0;
2215
- return producedFileMentions([...new Set([...paths ?? [], ...presented.map((file) => file.path)])], owner.openFile, (path) => t("presented.previewButton", { name: path }));
2224
+ return producedFileMentions([...new Set([...paths ?? [], ...presented.map((file) => file.path)])], owner.openFile, (path) => t("presented.previewButton", { name: path }), owner.turn.data.get("deliverables")?.produced.filter((operation) => operation.seq <= owner.seq));
2216
2225
  } });
2217
2226
  }
2218
2227
  //#endregion
@@ -10,6 +10,7 @@ export interface PresentedPath extends PresentedFile {
10
10
  interface ProducedPath {
11
11
  readonly seq: number;
12
12
  readonly path: string;
13
+ readonly argumentPath?: string;
13
14
  }
14
15
  /** The latest `workspace/changes` announcement of one Turn; the Host serves its summary by this sequence. */
15
16
  export interface ChangesTurnData {
@@ -34,9 +35,10 @@ interface DeliverablesState extends DeliverablesTurnData {
34
35
  /**
35
36
  * Files produced by one Turn data value.
36
37
  *
37
- * The source is the arguments of successful `write`, `edit`, and mutating
38
- * `str_replace_editor` calls, not the closing prose: a produced file must be
39
- * listed whether or not the model remembered to name it. Reads, unsupported
38
+ * The source is successful `write`, `edit`, and mutating
39
+ * `str_replace_editor` calls and their recorded absolute targets; legacy
40
+ * results use arguments. A produced file must be listed whether or not the
41
+ * model remembered to name it. Reads, unsupported
40
42
  * tools, malformed calls, and failed results contribute nothing. Paths keep
41
43
  * first-seen order and appear once, so a file written and then edited in the
42
44
  * same turn is one entry.
@@ -72,13 +74,14 @@ export declare function presentedForClosing(owner: TurnTailOwnerProps): Presente
72
74
  export { basename } from '../presented.ts';
73
75
  /**
74
76
  * Resolves inline-code references against one turn's produced or delivered
75
- * paths. Exact paths resolve directly; a basename resolves only when exactly
76
- * one supplied path has that basename. Ambiguous and unknown tokens stay inert.
77
+ * paths and explicit mutation arguments. A reference resolves only when every
78
+ * exact or basename match identifies one target. Ambiguous and unknown tokens stay inert.
77
79
  * @param paths - The turn's produced or delivered paths, already deduplicated.
78
80
  * @param openFile - The chat view's file opener.
79
81
  * @param label - Localizes the accessible open-label for a resolved path.
82
+ * @param operations - successful mutations whose literal arguments may name the same canonical targets.
80
83
  * @returns The resolver MarkdownText consumes; the full path rides `title`,
81
84
  * the same disambiguator the row's chips carry.
82
85
  */
83
- export declare function producedFileMentions(paths: readonly string[], openFile: (path: string) => void, label: (path: string) => string): MarkdownFileMentions;
86
+ export declare function producedFileMentions(paths: readonly string[], openFile: (path: string) => void, label: (path: string) => string, operations?: readonly Pick<ProducedPath, 'path' | 'argumentPath'>[]): MarkdownFileMentions;
84
87
  //# sourceMappingURL=turn-deliverables.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qilin-agent/client-ui-deliverables",
3
3
  "description": "Changed-files card with per-file comparison tabs, delivery cards, and clickable final-response file references for Web",
4
- "version": "3.1.3",
4
+ "version": "3.1.4",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -50,33 +50,33 @@
50
50
  "devDependencies": {
51
51
  "@types/react": "~18.3.1",
52
52
  "react": "^18.2.0",
53
- "@qilin-agent/api-remotes": "3.1.3",
54
- "@qilin-agent/client-connection": "3.1.3",
55
- "@qilin-agent/client-locale": "3.1.3",
56
- "@qilin-agent/client-store": "3.1.3",
57
- "@qilin-agent/client-test-runtime": "3.1.3",
58
- "@qilin-agent/client-ui-chat": "3.1.3",
59
- "@qilin-agent/client-ui-conversation": "3.1.3",
60
- "@qilin-agent/client-ui-dockkit": "3.1.3",
61
- "@qilin-agent/client-ui-renderer": "3.1.3",
62
- "@qilin-agent/client-ui-slots": "3.1.3",
53
+ "@qilin-agent/api-remotes": "3.1.4",
54
+ "@qilin-agent/client-connection": "3.1.4",
55
+ "@qilin-agent/client-store": "3.1.4",
56
+ "@qilin-agent/client-test-runtime": "3.1.4",
57
+ "@qilin-agent/client-locale": "3.1.4",
58
+ "@qilin-agent/client-ui-dockkit": "3.1.4",
59
+ "@qilin-agent/client-ui-conversation": "3.1.4",
60
+ "@qilin-agent/client-ui-chat": "3.1.4",
61
+ "@qilin-agent/client-ui-renderer": "3.1.4",
62
+ "@qilin-agent/client-ui-sidebar-right": "3.1.4",
63
+ "@qilin-agent/client-ui-slots": "3.1.4",
64
+ "@qilin-agent/session": "3.1.4",
63
65
  "@qilin-agent/kylin": "~4.0.3",
64
- "@qilin-agent/client-ui-primitives": "3.1.3",
65
- "@qilin-agent/session": "3.1.3",
66
- "@qilin-agent/client-ui-sidebar-right": "3.1.3",
67
- "@qilin-agent/system-prompt": "3.1.3",
68
- "@qilin-agent/session-query": "3.1.3",
69
- "@qilin-agent/llm": "3.1.3",
70
- "@qilin-agent/client-ui-tool": "3.1.3",
71
- "@qilin-agent/tool-present": "3.1.3",
72
- "@qilin-agent/workspace-changes": "3.1.3",
73
- "@qilin-agent/api-session-controller": "3.1.3",
74
- "@qilin-agent/util-workspace-path": "3.1.3",
75
- "@qilin-agent/api-workspace-files": "3.1.3",
76
- "@qilin-agent/fs": "3.1.3",
77
- "@qilin-agent/sandbox-policy": "3.1.3",
78
- "@qilin-agent/fs-local": "3.1.3",
79
- "@qilin-agent/agent": "3.1.3"
66
+ "@qilin-agent/session-query": "3.1.4",
67
+ "@qilin-agent/llm": "3.1.4",
68
+ "@qilin-agent/client-ui-tool": "3.1.4",
69
+ "@qilin-agent/client-ui-primitives": "3.1.4",
70
+ "@qilin-agent/workspace-changes": "3.1.4",
71
+ "@qilin-agent/util-workspace-path": "3.1.4",
72
+ "@qilin-agent/tool-present": "3.1.4",
73
+ "@qilin-agent/system-prompt": "3.1.4",
74
+ "@qilin-agent/api-session-controller": "3.1.4",
75
+ "@qilin-agent/api-workspace-files": "3.1.4",
76
+ "@qilin-agent/fs": "3.1.4",
77
+ "@qilin-agent/fs-local": "3.1.4",
78
+ "@qilin-agent/agent": "3.1.4",
79
+ "@qilin-agent/sandbox-policy": "3.1.4"
80
80
  },
81
81
  "files": [
82
82
  "lib/index.js",
@@ -84,7 +84,7 @@
84
84
  "lib/types/**/*.d.ts"
85
85
  ],
86
86
  "dependencies": {
87
- "@qilin-agent/typert-protocol": "3.1.3"
87
+ "@qilin-agent/typert-protocol": "3.1.4"
88
88
  },
89
89
  "scripts": {
90
90
  "bundle": "tsdown",