@antelopejs/dms-ai 0.5.0 → 0.6.1

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.
Files changed (70) hide show
  1. package/README.md +2 -2
  2. package/dist/constants/pages.d.ts +2 -0
  3. package/dist/constants/pages.js +3 -1
  4. package/dist/constants/pages.js.map +1 -1
  5. package/dist/frontend-module.d.ts +2 -0
  6. package/dist/frontend-module.js +18 -0
  7. package/dist/frontend-module.js.map +1 -0
  8. package/dist/index.js +2 -12
  9. package/dist/index.js.map +1 -1
  10. package/dist/pages/activity/page.d.ts +1 -0
  11. package/dist/pages/activity/page.js +13 -0
  12. package/dist/pages/activity/page.js.map +1 -1
  13. package/dist/pages/meta.d.ts +2 -0
  14. package/dist/pages/meta.js +3 -1
  15. package/dist/pages/meta.js.map +1 -1
  16. package/dist/pages/overview/insights.js +0 -2
  17. package/dist/pages/overview/insights.js.map +1 -1
  18. package/dist/pages/overview/page.d.ts +1 -1
  19. package/dist/pages/overview/page.js +12 -11
  20. package/dist/pages/overview/page.js.map +1 -1
  21. package/dist/pages/settings/availability.d.ts +1 -1
  22. package/dist/pages/settings/availability.js +19 -5
  23. package/dist/pages/settings/availability.js.map +1 -1
  24. package/dist/pages/settings/page.js +1 -1
  25. package/dist/pages/settings/page.js.map +1 -1
  26. package/dist/pages/skills/page.js +7 -0
  27. package/dist/pages/skills/page.js.map +1 -1
  28. package/dist/routes/activity.js +5 -2
  29. package/dist/routes/activity.js.map +1 -1
  30. package/dist/routes/list-query.d.ts +1 -0
  31. package/dist/routes/list-query.js +9 -0
  32. package/dist/routes/list-query.js.map +1 -1
  33. package/dist/routes/metric-shapes.js +7 -4
  34. package/dist/routes/metric-shapes.js.map +1 -1
  35. package/dist/routes/metrics.d.ts +2 -2
  36. package/dist/routes/metrics.js +10 -6
  37. package/dist/routes/metrics.js.map +1 -1
  38. package/dist/routes/settings.d.ts +1 -1
  39. package/dist/routes/settings.js +4 -15
  40. package/dist/routes/settings.js.map +1 -1
  41. package/dist/sidecar/index.d.ts +1 -0
  42. package/dist/sidecar/index.js +1 -0
  43. package/dist/sidecar/index.js.map +1 -1
  44. package/dist/sidecar/settings-values.d.ts +3 -0
  45. package/dist/sidecar/settings-values.js +21 -0
  46. package/dist/sidecar/settings-values.js.map +1 -0
  47. package/dist/types/metrics.d.ts +2 -0
  48. package/frontend-vue/app/chat/components/ConversationDrawer.vue +2 -1
  49. package/frontend-vue/app/chat/components/PanelHeader.vue +3 -1
  50. package/frontend-vue/app/chat/utils/markdown.ts +36 -20
  51. package/frontend-vue/app/components/ActivityDetail.vue +2 -5
  52. package/frontend-vue/app/components/ChatPanel.vue +3 -1
  53. package/frontend-vue/app/components/SkillDetail.vue +72 -26
  54. package/frontend-vue/app/views/RowStepper.vue +1 -1
  55. package/frontend-vue/app/views/types.ts +0 -10
  56. package/frontend-vue/i18n/locales/dms-ai-pages-en-GB.json +16 -3
  57. package/frontend-vue/i18n/locales/dms-ai-pages-fr-FR.json +16 -3
  58. package/frontend-vue/i18n/locales/dms-ai-views-en-GB.json +1 -0
  59. package/frontend-vue/i18n/locales/dms-ai-views-fr-FR.json +1 -0
  60. package/frontend-vue/package.json +1 -1
  61. package/frontend-vue/tests/chat/markdown.test.ts +69 -0
  62. package/frontend-vue/tests/i18n-views.test.ts +63 -0
  63. package/frontend-vue/tests/panel-header-height.test.ts +40 -0
  64. package/package.json +4 -3
  65. package/sidecar/dist/metrics/aggregate.js +29 -7
  66. package/sidecar/dist/metrics/aggregate.js.map +1 -1
  67. package/sidecar/dist/metrics/types.d.ts +2 -0
  68. package/sidecar/dist/server/http.js +2 -0
  69. package/sidecar/dist/server/http.js.map +1 -1
  70. package/skills/dms-ai/SKILL.md +1 -0
@@ -40,12 +40,12 @@ let AIMetricsController = class AIMetricsController extends (0, interface_api_1.
40
40
  const period = { from, to, compareFrom, compareTo };
41
41
  return (0, sidecar_1.readSidecar)(`/metrics/series${(0, sidecar_1.buildQuery)(period)}`, EMPTY_CHART);
42
42
  }
43
- allowed(from, to) {
44
- const period = { from, to };
43
+ allowed(from, to, compareFrom, compareTo) {
44
+ const period = { from, to, compareFrom, compareTo };
45
45
  return readMetric("/metrics/allowed", period, EMPTY_ALLOWED, metric_shapes_1.allowedPayload);
46
46
  }
47
- topTools(from, to, limit) {
48
- const params = { from, to, limit };
47
+ topTools(from, to, limit, compareFrom, compareTo) {
48
+ const params = { from, to, compareFrom, compareTo, limit };
49
49
  return readMetric("/metrics/top-tools", params, EMPTY_TOOLS, metric_shapes_1.topToolsPayload);
50
50
  }
51
51
  usage(days) {
@@ -81,8 +81,10 @@ __decorate([
81
81
  (0, interface_api_1.Get)("allowed"),
82
82
  __param(0, (0, interface_api_1.Parameter)("from", "query")),
83
83
  __param(1, (0, interface_api_1.Parameter)("to", "query")),
84
+ __param(2, (0, interface_api_1.Parameter)("compareFrom", "query")),
85
+ __param(3, (0, interface_api_1.Parameter)("compareTo", "query")),
84
86
  __metadata("design:type", Function),
85
- __metadata("design:paramtypes", [String, String]),
87
+ __metadata("design:paramtypes", [String, String, String, String]),
86
88
  __metadata("design:returntype", Promise)
87
89
  ], AIMetricsController.prototype, "allowed", null);
88
90
  __decorate([
@@ -90,8 +92,10 @@ __decorate([
90
92
  __param(0, (0, interface_api_1.Parameter)("from", "query")),
91
93
  __param(1, (0, interface_api_1.Parameter)("to", "query")),
92
94
  __param(2, (0, interface_api_1.Parameter)("limit", "query")),
95
+ __param(3, (0, interface_api_1.Parameter)("compareFrom", "query")),
96
+ __param(4, (0, interface_api_1.Parameter)("compareTo", "query")),
93
97
  __metadata("design:type", Function),
94
- __metadata("design:paramtypes", [String, String, String]),
98
+ __metadata("design:paramtypes", [String, String, String, String, String]),
95
99
  __metadata("design:returntype", Promise)
96
100
  ], AIMetricsController.prototype, "topTools", null);
97
101
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/routes/metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/routes/metrics.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- type SettingsBody = Record<string, unknown>;
1
+ import { type SettingsBody } from "../sidecar/settings-values";
2
2
  declare const AISettingsController_base: import("@antelopejs/interface-api").ControllerClass<object>;
3
3
  export declare class AISettingsController extends AISettingsController_base {
4
4
  getSettings(): Promise<unknown>;
@@ -16,35 +16,24 @@ exports.AISettingsController = void 0;
16
16
  const interface_api_1 = require("@antelopejs/interface-api");
17
17
  const auth_1 = require("@antelopejs/interface-dms/auth");
18
18
  const module_1 = require("../constants/module");
19
+ const settings_values_1 = require("../sidecar/settings-values");
19
20
  const sidecar_results_1 = require("./sidecar-results");
20
21
  const SETTINGS_PATH = "/settings";
21
- const NUMERIC_SETTINGS = [
22
- "requestTimeoutMinutes",
23
- "checkpointRetentionDays",
24
- ];
25
22
  const READ_ONLY_SETTINGS = [
26
23
  "builderAvailable",
27
24
  "providers",
28
25
  "alwaysAskDeletions",
26
+ "defaults",
29
27
  ];
30
28
  const ALWAYS_ASK_DELETIONS = true;
31
- function withNumbersAs(settings, convert) {
32
- const converted = { ...settings };
33
- for (const key of NUMERIC_SETTINGS) {
34
- if (converted[key] !== undefined && converted[key] !== null) {
35
- converted[key] = convert(converted[key]);
36
- }
37
- }
38
- return converted;
39
- }
40
29
  function formSettings(settings) {
41
30
  return {
42
- ...withNumbersAs(settings, String),
31
+ ...(0, settings_values_1.asFormValues)(settings),
43
32
  alwaysAskDeletions: ALWAYS_ASK_DELETIONS,
44
33
  };
45
34
  }
46
35
  function sidecarUpdate(body) {
47
- const update = withNumbersAs(body, Number);
36
+ const update = (0, settings_values_1.withNumbersAs)(body, Number);
48
37
  for (const key of READ_ONLY_SETTINGS)
49
38
  delete update[key];
50
39
  return update;
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAA2E;AAC3E,yDAA+D;AAC/D,gDAAmD;AACnD,uDAA0C;AAE1C,MAAM,aAAa,GAAG,WAAW,CAAC;AAGlC,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAGX,MAAM,kBAAkB,GAAG;IACzB,kBAAkB;IAClB,WAAW;IACX,oBAAoB;CACZ,CAAC;AAGX,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAIlC,SAAS,aAAa,CACpB,QAAsB,EACtB,OAAoC;IAEpC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,SAAS,YAAY,CAAC,QAAsB;IAC1C,OAAO;QACL,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClC,kBAAkB,EAAE,oBAAoB;KACzC,CAAC;AACJ,CAAC;AAGD,SAAS,aAAa,CAAC,IAAkB;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,kBAAkB;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AASM,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,IAAA,0BAAU,EAAC,qBAAY,CAAC;IAEhE,WAAW;QACT,OAAO,IAAA,uBAAK,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;IAGD,cAAc,CAAa,IAAmB;QAC5C,OAAO,IAAA,uBAAK,EAAC,aAAa,EAAE,YAAY,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAbY,oDAAoB;AAE/B;IADC,IAAA,mBAAG,EAAC,aAAa,CAAC;;;;uDAGlB;AAGD;IADC,IAAA,mBAAG,EAAC,aAAa,CAAC;IACH,WAAA,IAAA,wBAAQ,GAAE,CAAA;;;;0DAKzB;+BAZU,oBAAoB;IADhC,IAAA,oBAAa,GAAE;GACH,oBAAoB,CAahC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAA2E;AAC3E,yDAA+D;AAC/D,gDAAmD;AACnD,gEAIoC;AACpC,uDAA0C;AAE1C,MAAM,aAAa,GAAG,WAAW,CAAC;AAGlC,MAAM,kBAAkB,GAAG;IACzB,kBAAkB;IAClB,WAAW;IACX,oBAAoB;IACpB,UAAU;CACF,CAAC;AAGX,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAGlC,SAAS,YAAY,CAAC,QAAsB;IAC1C,OAAO;QACL,GAAG,IAAA,8BAAY,EAAC,QAAQ,CAAC;QACzB,kBAAkB,EAAE,oBAAoB;KACzC,CAAC;AACJ,CAAC;AAGD,SAAS,aAAa,CAAC,IAAkB;IACvC,MAAM,MAAM,GAAG,IAAA,+BAAa,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,kBAAkB;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC;AAChB,CAAC;AASM,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,IAAA,0BAAU,EAAC,qBAAY,CAAC;IAEhE,WAAW;QACT,OAAO,IAAA,uBAAK,EAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;IAGD,cAAc,CAAa,IAAmB;QAC5C,OAAO,IAAA,uBAAK,EAAC,aAAa,EAAE,YAAY,EAAE;YACxC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAbY,oDAAoB;AAE/B;IADC,IAAA,mBAAG,EAAC,aAAa,CAAC;;;;uDAGlB;AAGD;IADC,IAAA,mBAAG,EAAC,aAAa,CAAC;IACH,WAAA,IAAA,wBAAQ,GAAE,CAAA;;;;0DAKzB;+BAZU,oBAAoB;IADhC,IAAA,oBAAa,GAAE;GACH,oBAAoB,CAahC"}
@@ -1,2 +1,3 @@
1
1
  export * from "./http-client";
2
2
  export * from "./query";
3
+ export * from "./settings-values";
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./http-client"), exports);
18
18
  __exportStar(require("./query"), exports);
19
+ __exportStar(require("./settings-values"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sidecar/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sidecar/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,0CAAwB;AACxB,oDAAkC"}
@@ -0,0 +1,3 @@
1
+ export type SettingsBody = Record<string, unknown>;
2
+ export declare function withNumbersAs(settings: SettingsBody, convert: (value: unknown) => unknown): SettingsBody;
3
+ export declare function asFormValues(settings: SettingsBody): SettingsBody;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.withNumbersAs = withNumbersAs;
4
+ exports.asFormValues = asFormValues;
5
+ const NUMERIC_SETTINGS = [
6
+ "requestTimeoutMinutes",
7
+ "checkpointRetentionDays",
8
+ ];
9
+ function withNumbersAs(settings, convert) {
10
+ const converted = { ...settings };
11
+ for (const key of NUMERIC_SETTINGS) {
12
+ if (converted[key] !== undefined && converted[key] !== null) {
13
+ converted[key] = convert(converted[key]);
14
+ }
15
+ }
16
+ return converted;
17
+ }
18
+ function asFormValues(settings) {
19
+ return withNumbersAs(settings, String);
20
+ }
21
+ //# sourceMappingURL=settings-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-values.js","sourceRoot":"","sources":["../../src/sidecar/settings-values.ts"],"names":[],"mappings":";;AASA,sCAWC;AAGD,oCAEC;AArBD,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,yBAAyB;CACjB,CAAC;AAEX,SAAgB,aAAa,CAC3B,QAAsB,EACtB,OAAoC;IAEpC,MAAM,SAAS,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAGD,SAAgB,YAAY,CAAC,QAAsB;IACjD,OAAO,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -31,6 +31,7 @@ export interface TopListItem {
31
31
  title: string;
32
32
  description?: string;
33
33
  value: number;
34
+ delta?: number;
34
35
  icon?: string;
35
36
  }
36
37
  export interface TopListPayload {
@@ -39,6 +40,7 @@ export interface TopListPayload {
39
40
  interface CountedValue {
40
41
  id: string;
41
42
  value: number;
43
+ delta?: number;
42
44
  }
43
45
  export interface AllowedBreakdown {
44
46
  items: CountedValue[];
@@ -297,11 +297,12 @@ function onKeydown(event: KeyboardEvent): void {
297
297
  box-shadow: var(--dms-shadow-modal);
298
298
  }
299
299
 
300
+ /* Matches the panel header it covers (see PanelHeader). */
300
301
  .cb-drawer__head {
301
302
  display: flex;
302
303
  align-items: center;
303
304
  gap: 8px;
304
- height: 52px;
305
+ height: var(--ui-header-height);
305
306
  padding: 0 8px 0 14px;
306
307
  border-bottom: 1px solid var(--ui-border);
307
308
  }
@@ -147,12 +147,14 @@ const moreItems = computed(() => [
147
147
  </template>
148
148
 
149
149
  <style scoped>
150
+ /* Same height as the DMS navbar beside the panel, so both bottom borders
151
+ line up: the navbar sizes itself (border included) with this variable. */
150
152
  .cb__head {
151
153
  display: flex;
152
154
  flex: none;
153
155
  align-items: center;
154
156
  gap: 10px;
155
- height: 52px;
157
+ height: var(--ui-header-height);
156
158
  padding: 0 8px 0 14px;
157
159
  border-bottom: 1px solid var(--ui-border);
158
160
  }
@@ -48,19 +48,27 @@ const LINK_REL = "noopener noreferrer";
48
48
  const NEWLINES = /\r\n?/g;
49
49
  const LINE_BREAK = "\n";
50
50
 
51
- const md = new MarkdownIt({
52
- html: false,
53
- linkify: true,
54
- breaks: true,
55
- });
56
-
57
- md.validateLink = (url) => SAFE_URL.test(url.trim());
58
-
59
- md.renderer.rules.link_open = (tokens, idx, options, _env, self) => {
60
- tokens[idx].attrSet("target", LINK_TARGET);
61
- tokens[idx].attrSet("rel", LINK_REL);
62
- return self.renderToken(tokens, idx, options);
63
- };
51
+ /**
52
+ * The parser shared by every renderer: no raw HTML, safe links opening in a
53
+ * new tab, images shown as links. `breaks` alone differs between them.
54
+ */
55
+ function createParser(breaks: boolean): MarkdownIt {
56
+ const parser = new MarkdownIt({ html: false, linkify: true, breaks });
57
+ parser.validateLink = (url) => SAFE_URL.test(url.trim());
58
+ parser.renderer.rules.link_open = (tokens, idx, options, _env, self) => {
59
+ tokens[idx].attrSet("target", LINK_TARGET);
60
+ tokens[idx].attrSet("rel", LINK_REL);
61
+ return self.renderToken(tokens, idx, options);
62
+ };
63
+ parser.renderer.rules.image = (tokens, idx, options, env, self) => {
64
+ const token = tokens[idx];
65
+ const src = token.attrGet("src") ?? "";
66
+ const alt = self.renderInlineAsText(token.children ?? [], options, env);
67
+ const label = parser.utils.escapeHtml(imageLinkLabel(alt, src));
68
+ return `<a href="${parser.utils.escapeHtml(src)}" target="${LINK_TARGET}" rel="${LINK_REL}">${label}</a>`;
69
+ };
70
+ return parser;
71
+ }
64
72
 
65
73
  function imageDestination(src: string): string {
66
74
  try {
@@ -75,13 +83,11 @@ function imageLinkLabel(alt: string, src: string): string {
75
83
  return alt ? `${alt} (${destination})` : destination;
76
84
  }
77
85
 
78
- md.renderer.rules.image = (tokens, idx, options, env, self) => {
79
- const token = tokens[idx];
80
- const src = token.attrGet("src") ?? "";
81
- const alt = self.renderInlineAsText(token.children ?? [], options, env);
82
- const label = md.utils.escapeHtml(imageLinkLabel(alt, src));
83
- return `<a href="${md.utils.escapeHtml(src)}" target="${LINK_TARGET}" rel="${LINK_REL}">${label}</a>`;
84
- };
86
+ // A chat message keeps every newline the model wrote as a line break.
87
+ const md = createParser(true);
88
+ // A document (a SKILL.md) is hard-wrapped at a fixed column: a single newline
89
+ // inside a paragraph is a CommonMark soft break, rendered as a space.
90
+ const documentMd = createParser(false);
85
91
 
86
92
  let purifier: Purifier | null = null;
87
93
 
@@ -109,6 +115,16 @@ export function renderMarkdown(source: string): string {
109
115
  return sanitize(md.render(normalize(source)));
110
116
  }
111
117
 
118
+ /**
119
+ * A Markdown document (a SKILL.md) as sanitized HTML. Unlike
120
+ * {@link renderMarkdown}, a single newline inside a paragraph is a space, so a
121
+ * hard-wrapped source reflows to the reader's width; a blank line still starts
122
+ * a new paragraph.
123
+ */
124
+ export function renderDocument(source: string): string {
125
+ return sanitize(documentMd.render(normalize(source)));
126
+ }
127
+
112
128
  interface TopLevelBlock {
113
129
  tokens: Token[];
114
130
  startLine: number;
@@ -9,11 +9,8 @@ import { useAiData } from "../views/composables/useAiData";
9
9
  import { useAssistant } from "../views/composables/useAssistant";
10
10
  import { useViewFormat } from "../views/composables/useViewFormat";
11
11
  import { AI_PAGES, AI_ROUTES, CHANGE_SET_QUERY_KEY } from "../views/constants";
12
- import type {
13
- ActivityDetailPayload,
14
- ActivityRow,
15
- RowNavigation,
16
- } from "../views/types";
12
+ import type { RowNavigation } from "#dms-ui/app/types/row-navigation";
13
+ import type { ActivityDetailPayload, ActivityRow } from "../views/types";
17
14
  import {
18
15
  activityOutput,
19
16
  argumentItems,
@@ -173,9 +173,11 @@ onMounted(() => {
173
173
  color: var(--ui-text-muted);
174
174
  }
175
175
 
176
+ /* Sits where the panel header's close button does: centred in a header
177
+ as tall as the DMS navbar (28px is the small square button height). */
176
178
  .dms-ai-panel-close {
177
179
  position: absolute;
178
- top: 11px;
180
+ top: calc((var(--ui-header-height) - 28px) / 2);
179
181
  right: 8px;
180
182
  }
181
183
 
@@ -1,15 +1,25 @@
1
1
  <script setup lang="ts">
2
+ import type { Tone } from "#dms-ui/app/types/tone";
2
3
  import { computed } from "vue";
3
- import { renderMarkdown } from "../chat/utils/markdown";
4
- import RowStepper from "../views/RowStepper.vue";
4
+ import { renderDocument } from "../chat/utils/markdown";
5
5
  import { useAssistant } from "../views/composables/useAssistant";
6
6
  import { useViewFormat } from "../views/composables/useViewFormat";
7
- import type { RowNavigation, SkillRow } from "../views/types";
7
+ import type { SkillRow } from "../views/types";
8
8
  import { skillLook } from "../views/utils/skills";
9
9
 
10
10
  interface Props {
11
11
  rowData?: SkillRow;
12
- navigation?: RowNavigation;
12
+ }
13
+
14
+ /** A fact of the skill: a status pill, an identifier (mono) or plain text. */
15
+ interface SkillFact {
16
+ id: string;
17
+ label: string;
18
+ value: string;
19
+ type?: "status" | "mono";
20
+ tone?: Tone;
21
+ /** Draws a button copying the value. */
22
+ copy?: boolean;
13
23
  }
14
24
 
15
25
  const props = defineProps<Props>();
@@ -20,9 +30,9 @@ const assistant = useAssistant();
20
30
 
21
31
  const skill = computed(() => props.rowData);
22
32
  const look = computed(() => (skill.value ? skillLook(skill.value) : null));
23
- const html = computed(() => renderMarkdown(skill.value?.body ?? ""));
33
+ const html = computed(() => renderDocument(skill.value?.body ?? ""));
24
34
 
25
- const facts = computed(() => {
35
+ const facts = computed<SkillFact[]>(() => {
26
36
  const current = skill.value;
27
37
  if (!current || !look.value) return [];
28
38
  return [
@@ -30,14 +40,21 @@ const facts = computed(() => {
30
40
  id: "source",
31
41
  label: t("dms_ai.views.skills.source_label"),
32
42
  value: t(`dms_ai.views.skills.source.${current.source}`),
33
- type: "status" as const,
43
+ type: "status",
34
44
  tone: look.value.badgeTone,
35
45
  },
46
+ {
47
+ id: "qualified",
48
+ label: t("dms_ai.views.skills.qualified_name_label"),
49
+ value: current.qualifiedName,
50
+ type: "mono",
51
+ copy: true,
52
+ },
36
53
  {
37
54
  id: "origin",
38
55
  label: t("dms_ai.views.skills.origin_label"),
39
56
  value: current.origin,
40
- type: "mono" as const,
57
+ type: "mono",
41
58
  copy: true,
42
59
  },
43
60
  {
@@ -67,22 +84,6 @@ function openLastConversation(): void {
67
84
 
68
85
  <template>
69
86
  <div v-if="skill && look" class="flex min-h-full flex-col gap-5">
70
- <RowStepper v-if="props.navigation" :navigation="props.navigation" />
71
-
72
- <header class="flex items-start gap-3">
73
- <DmsIconWell :icon="look.icon" :tone="look.tone" size="lg" />
74
- <div class="min-w-0 flex-1">
75
- <h3
76
- class="text-highlighted truncate font-mono text-[15px] font-semibold"
77
- >
78
- {{ skill.name }}
79
- </h3>
80
- <p class="text-dimmed mt-0.5 truncate font-mono text-[11.5px]">
81
- {{ skill.qualifiedName }}
82
- </p>
83
- </div>
84
- </header>
85
-
86
87
  <DmsBanner
87
88
  v-if="skill.isShadowed"
88
89
  size="sm"
@@ -95,9 +96,38 @@ function openLastConversation(): void {
95
96
  "
96
97
  />
97
98
 
98
- <DmsKeyValueList :items="facts" />
99
+ <!-- The drawer's header names the skill. The facts read as a record
100
+ drawer's fields: the DMS form row, a label column beside a
101
+ left-aligned value once the drawer is wide enough, the label above
102
+ it on a phone. -->
103
+ <div class="grid gap-3">
104
+ <DmsFieldRow
105
+ v-for="fact in facts"
106
+ :key="fact.id"
107
+ :label="fact.label"
108
+ layout="form"
109
+ spacing="list"
110
+ :inset="false"
111
+ >
112
+ <div class="flex min-w-0 items-center gap-1.5 text-[13px]">
113
+ <DmsStatusPill
114
+ v-if="fact.type === 'status'"
115
+ :tone="fact.tone ?? 'neutral'"
116
+ :label="fact.value"
117
+ />
118
+ <span
119
+ v-else
120
+ class="text-highlighted wrap-anywhere min-w-0"
121
+ :class="fact.type === 'mono' && 'font-mono text-[12.5px]'"
122
+ >
123
+ {{ fact.value }}
124
+ </span>
125
+ <DmsCopyButton v-if="fact.copy" :value="fact.value" class="-my-1" />
126
+ </div>
127
+ </DmsFieldRow>
128
+ </div>
99
129
 
100
- <p class="text-muted text-[13px] leading-relaxed">
130
+ <p class="text-muted max-w-[76ch] text-[13px] leading-relaxed">
101
131
  {{ skill.description }}
102
132
  </p>
103
133
 
@@ -185,4 +215,20 @@ function openLastConversation(): void {
185
215
  color: var(--ui-primary);
186
216
  text-decoration: underline;
187
217
  }
218
+ /* Running text keeps a readable measure in the wide sheet; code and tables
219
+ may use the whole width. */
220
+ .dms-ai-skill-doc :deep(:is(p, ul, ol, blockquote, h1, h2, h3, h4, h5, h6)) {
221
+ max-width: 76ch;
222
+ }
223
+ .dms-ai-skill-doc :deep(table) {
224
+ margin: 0 0 8px;
225
+ border-collapse: collapse;
226
+ display: block;
227
+ overflow-x: auto;
228
+ }
229
+ .dms-ai-skill-doc :deep(:is(th, td)) {
230
+ padding: 4px 8px;
231
+ border: 1px solid var(--ui-border);
232
+ text-align: start;
233
+ }
188
234
  </style>
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import type { RowNavigation } from "./types";
2
+ import type { RowNavigation } from "#dms-ui/app/types/row-navigation";
3
3
 
4
4
  interface Props {
5
5
  navigation: RowNavigation;
@@ -170,16 +170,6 @@ export interface SkillRow {
170
170
  icon?: string;
171
171
  }
172
172
 
173
- /** What a DMS row drawer hands its component to step through the rows. */
174
- export interface RowNavigation {
175
- index: number;
176
- total: number;
177
- hasPrev: boolean;
178
- hasNext: boolean;
179
- prev: () => void;
180
- next: () => void;
181
- }
182
-
183
173
  /** One fact of a change set, a row of a DmsKeyValueList. */
184
174
  export interface Fact {
185
175
  id: string;
@@ -28,6 +28,10 @@
28
28
  },
29
29
  "blocks": {
30
30
  "overview": {
31
+ "toolbar": {
32
+ "name": "Toolbar",
33
+ "description": "When the Overview last read its figures, a refresh, and the period"
34
+ },
31
35
  "period": {
32
36
  "name": "Period",
33
37
  "description": "Picks the period the Overview's figures cover"
@@ -80,11 +84,11 @@
80
84
  },
81
85
  "activity_chart": {
82
86
  "name": "Activity chart",
83
- "description": "Actions per day, compared with the previous period",
87
+ "description": "Actions per day, against the chosen comparison",
84
88
  "title": "Activity",
85
89
  "caption": "Actions over the selected period",
86
90
  "primary": "Actions",
87
- "comparison": "Previous period"
91
+ "comparison": "Comparison"
88
92
  },
89
93
  "allowed": {
90
94
  "name": "How actions were allowed",
@@ -133,6 +137,14 @@
133
137
  }
134
138
  },
135
139
  "activity": {
140
+ "toolbar": {
141
+ "name": "Toolbar",
142
+ "description": "When the audit log was last read, a refresh, and the period"
143
+ },
144
+ "period": {
145
+ "name": "Period",
146
+ "description": "Picks the period the audit log covers"
147
+ },
136
148
  "log": {
137
149
  "name": "Audit log",
138
150
  "description": "Every tool call, how it was allowed and what came out"
@@ -561,7 +573,8 @@
561
573
  },
562
574
  "detail": {
563
575
  "open": "Details",
564
- "title": "Skill detail"
576
+ "title": "Skill detail",
577
+ "position": "Skill {index} of {total}"
565
578
  },
566
579
  "empty": {
567
580
  "title": "No skills loaded",
@@ -28,6 +28,10 @@
28
28
  },
29
29
  "blocks": {
30
30
  "overview": {
31
+ "toolbar": {
32
+ "name": "Barre d'outils",
33
+ "description": "Quand la vue d'ensemble a lu ses chiffres, un rafraîchissement et la période"
34
+ },
31
35
  "period": {
32
36
  "name": "Période",
33
37
  "description": "Choisit la période couverte par les chiffres de la vue d'ensemble"
@@ -80,11 +84,11 @@
80
84
  },
81
85
  "activity_chart": {
82
86
  "name": "Graphique d'activité",
83
- "description": "Actions par jour, comparées à la période précédente",
87
+ "description": "Actions par jour, face à la comparaison choisie",
84
88
  "title": "Activité",
85
89
  "caption": "Actions sur la période choisie",
86
90
  "primary": "Actions",
87
- "comparison": "Période précédente"
91
+ "comparison": "Comparaison"
88
92
  },
89
93
  "allowed": {
90
94
  "name": "Comment les actions ont été autorisées",
@@ -133,6 +137,14 @@
133
137
  }
134
138
  },
135
139
  "activity": {
140
+ "toolbar": {
141
+ "name": "Barre d'outils",
142
+ "description": "Quand le journal d'audit a été lu, un rafraîchissement et la période"
143
+ },
144
+ "period": {
145
+ "name": "Période",
146
+ "description": "Choisit la période couverte par le journal d'audit"
147
+ },
136
148
  "log": {
137
149
  "name": "Journal d'audit",
138
150
  "description": "Chaque appel d'outil, comment il a été autorisé et son résultat"
@@ -561,7 +573,8 @@
561
573
  },
562
574
  "detail": {
563
575
  "open": "Détails",
564
- "title": "Détail de la skill"
576
+ "title": "Détail de la skill",
577
+ "position": "Skill {index} sur {total}"
565
578
  },
566
579
  "empty": {
567
580
  "title": "Aucune skill chargée",
@@ -131,6 +131,7 @@
131
131
  "uses": "{count} use | {count} uses",
132
132
  "never_used": "never used",
133
133
  "source_label": "Source",
134
+ "qualified_name_label": "Full name",
134
135
  "origin_label": "Origin",
135
136
  "used_label": "Used",
136
137
  "used_value": "{count}× · 30 days",
@@ -131,6 +131,7 @@
131
131
  "uses": "{count} utilisation | {count} utilisations",
132
132
  "never_used": "jamais utilisée",
133
133
  "source_label": "Source",
134
+ "qualified_name_label": "Nom complet",
134
135
  "origin_label": "Origine",
135
136
  "used_label": "Utilisée",
136
137
  "used_value": "{count}× · 30 jours",
@@ -6,7 +6,7 @@
6
6
  "license": "Apache-2.0",
7
7
  "packageManager": "pnpm@10.6.5",
8
8
  "engines": {
9
- "@antelopejs/dms-frontend": ">=0.6.3 <0.8.0"
9
+ "@antelopejs/dms-frontend": ">=0.9.0 <0.10.0"
10
10
  },
11
11
  "scripts": {
12
12
  "build": "pnpm --dir \"${DMS_FRONTEND_WORKSPACE:?Set DMS_FRONTEND_WORKSPACE to the generated Inertia workspace}\" build",