gsd-pi 2.76.0-dev.4100bd590 → 2.76.0-dev.76f9a2dc5

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 (112) hide show
  1. package/dist/resource-loader.d.ts +1 -1
  2. package/dist/resource-loader.js +2 -8
  3. package/dist/resources/extensions/gsd/auto/phases.js +4 -1
  4. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  5. package/dist/resources/extensions/gsd/auto-model-selection.js +13 -2
  6. package/dist/resources/extensions/gsd/auto-start.js +12 -7
  7. package/dist/resources/extensions/gsd/auto.js +4 -1
  8. package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
  9. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  10. package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
  11. package/dist/resources/extensions/gsd/safety/file-change-validator.js +1 -1
  12. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  13. package/dist/web/standalone/.next/BUILD_ID +1 -1
  14. package/dist/web/standalone/.next/app-path-routes-manifest.json +20 -20
  15. package/dist/web/standalone/.next/build-manifest.json +2 -2
  16. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  17. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  18. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  26. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/index.html +1 -1
  34. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app-paths-manifest.json +20 -20
  41. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  42. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  43. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  44. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  45. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  46. package/package.json +1 -1
  47. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  48. package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
  49. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  50. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
  51. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
  52. package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
  53. package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
  54. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
  55. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
  56. package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
  57. package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
  58. package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
  59. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  60. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  61. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  62. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
  63. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  64. package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
  65. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  66. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
  67. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  68. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
  69. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
  70. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
  71. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  72. package/packages/pi-coding-agent/dist/core/model-registry.js +76 -10
  73. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  74. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  75. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  76. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  77. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  78. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  79. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
  80. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  81. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  82. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  83. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  84. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  85. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
  86. package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
  87. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
  88. package/packages/pi-coding-agent/src/core/model-registry.ts +86 -10
  89. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  90. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
  91. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  92. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  93. package/scripts/link-workspace-packages.cjs +1 -0
  94. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  95. package/src/resources/extensions/gsd/auto/phases.ts +4 -0
  96. package/src/resources/extensions/gsd/auto/session.ts +7 -1
  97. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -1
  98. package/src/resources/extensions/gsd/auto-start.ts +12 -7
  99. package/src/resources/extensions/gsd/auto.ts +4 -1
  100. package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
  101. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  102. package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
  103. package/src/resources/extensions/gsd/safety/file-change-validator.ts +1 -1
  104. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  105. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +33 -3
  106. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +38 -0
  107. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
  108. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +20 -0
  109. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  110. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  111. /package/dist/web/standalone/.next/static/{YnUwu2WWaT0_hyTLUF4nq → UMCfv_sVnLXawpUAjvArc}/_buildManifest.js +0 -0
  112. /package/dist/web/standalone/.next/static/{YnUwu2WWaT0_hyTLUF4nq → UMCfv_sVnLXawpUAjvArc}/_ssgManifest.js +0 -0
@@ -2,7 +2,7 @@ import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
2
2
  import { theme } from "../theme/theme.js";
3
3
  import { formatTimestamp, type TimestampFormat } from "./timestamp.js";
4
4
 
5
- type FrameTone = "assistant" | "user" | "compaction";
5
+ type FrameTone = "assistant" | "user" | "compaction" | "skill";
6
6
 
7
7
  function trimOuterBlankLines(lines: string[]): string[] {
8
8
  let start = 0;
@@ -25,14 +25,14 @@ export function renderChatFrame(
25
25
  ): string[] {
26
26
  const outerWidth = Math.max(20, width);
27
27
  const contentWidth = Math.max(1, outerWidth - 2); // "│ " + content
28
+ const isPurple = opts.tone === "compaction" || opts.tone === "skill";
28
29
  const borderColor =
29
30
  opts.tone === "user"
30
31
  ? "border"
31
- : opts.tone === "compaction"
32
+ : isPurple
32
33
  ? "customMessageLabel"
33
34
  : "borderAccent";
34
- const borderMuted =
35
- opts.tone === "compaction" ? "customMessageLabel" : "borderMuted";
35
+ const borderMuted = isPurple ? "customMessageLabel" : "borderMuted";
36
36
  const border = (s: string) => theme.fg(borderColor, s);
37
37
  const leftRaw = `• ${opts.label}`;
38
38
  const rightRaw =
@@ -47,7 +47,7 @@ export function renderChatFrame(
47
47
  const labelColor =
48
48
  opts.tone === "user"
49
49
  ? "border"
50
- : opts.tone === "compaction"
50
+ : isPurple
51
51
  ? "customMessageLabel"
52
52
  : "borderAccent";
53
53
  const dashIdx = left.indexOf(" - ");
@@ -71,7 +71,7 @@ export function renderChatFrame(
71
71
  const bodyColor =
72
72
  opts.tone === "user"
73
73
  ? "userMessageText"
74
- : opts.tone === "compaction"
74
+ : isPurple
75
75
  ? "customMessageText"
76
76
  : "assistantMessageText";
77
77
  const bodyLines = (sourceLines.length > 0 ? sourceLines : [""]).map((line) => {
@@ -12,7 +12,7 @@ import {
12
12
  type TUI,
13
13
  } from "@gsd/pi-tui";
14
14
  import type { AuthStorage } from "../../../core/auth-storage.js";
15
- import { getDiscoverableProviders } from "../../../core/model-discovery.js";
15
+ import { getDiscoverableProviders, getDiscoveryAdapter } from "../../../core/model-discovery.js";
16
16
  import { providerDisplayName } from "./model-selector.js";
17
17
  import type { ModelRegistry } from "../../../core/model-registry.js";
18
18
  import { ModelsJsonWriter } from "../../../core/models-json-writer.js";
@@ -102,12 +102,21 @@ export class ProviderManagerComponent extends Container implements Focusable {
102
102
 
103
103
  this.providers = Array.from(providerNames)
104
104
  .sort()
105
- .map((name) => ({
106
- name,
107
- hasAuth: this.authStorage.hasAuth(name),
108
- supportsDiscovery: discoverableSet.has(name),
109
- modelCount: providerModelCounts.get(name) ?? 0,
110
- }));
105
+ .map((name) => {
106
+ const providerApis = new Set(
107
+ allModels
108
+ .filter((m) => m.provider === name)
109
+ .map((m) => m.api)
110
+ .filter((api): api is string => typeof api === "string" && api.length > 0),
111
+ );
112
+ return {
113
+ name,
114
+ hasAuth: this.authStorage.hasAuth(name),
115
+ supportsDiscovery:
116
+ discoverableSet.has(name) || getDiscoveryAdapter(name, providerApis).supportsDiscovery,
117
+ modelCount: providerModelCounts.get(name) ?? 0,
118
+ };
119
+ });
111
120
  this.clampSelectedIndex();
112
121
  }
113
122
 
@@ -1,55 +1,69 @@
1
- import { Box, Markdown, type MarkdownTheme, Text } from "@gsd/pi-tui";
1
+ // GSD / pi-coding-agent Skill invocation message component
2
+ import { Container, Markdown, type MarkdownTheme, Text } from "@gsd/pi-tui";
2
3
  import type { ParsedSkillBlock } from "../../../core/agent-session.js";
3
4
  import { getMarkdownTheme, theme } from "../theme/theme.js";
5
+ import { renderChatFrame } from "./chat-frame.js";
4
6
  import { editorKey } from "./keybinding-hints.js";
5
7
 
6
8
  /**
7
- * Component that renders a skill invocation message with collapsed/expanded state.
8
- * Uses same background color as custom messages for visual consistency.
9
- * Only renders the skill block itself - user message is rendered separately.
9
+ * Renders a skill invocation in the shared chat-frame style (top rule,
10
+ * `• skill - <name>` header, `│ ` body margin) with purple border/label
11
+ * matching compaction so it visually aligns with user/assistant messages.
10
12
  */
11
- export class SkillInvocationMessageComponent extends Box {
13
+ export class SkillInvocationMessageComponent extends Container {
12
14
  private expanded = false;
13
15
  private skillBlock: ParsedSkillBlock;
14
16
  private markdownTheme: MarkdownTheme;
15
17
 
16
18
  constructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) {
17
- super(1, 1, (t) => theme.bg("customMessageBg", t));
19
+ super();
18
20
  this.skillBlock = skillBlock;
19
21
  this.markdownTheme = markdownTheme;
20
- this.updateDisplay();
22
+ this.rebuild();
21
23
  }
22
24
 
23
25
  setExpanded(expanded: boolean): void {
24
- this.expanded = expanded;
25
- this.updateDisplay();
26
+ if (this.expanded !== expanded) {
27
+ this.expanded = expanded;
28
+ this.rebuild();
29
+ }
26
30
  }
27
31
 
28
32
  override invalidate(): void {
29
33
  super.invalidate();
30
- this.updateDisplay();
34
+ this.rebuild();
31
35
  }
32
36
 
33
- private updateDisplay(): void {
37
+ private rebuild(): void {
34
38
  this.clear();
35
39
 
36
40
  if (this.expanded) {
37
- // Expanded: label + skill name header + full content
38
- const label = theme.fg("customMessageLabel", theme.bold("[skill]"));
39
- this.addChild(new Text(label, 0, 0));
40
- const header = `**${this.skillBlock.name}**\n\n`;
41
41
  this.addChild(
42
- new Markdown(header + this.skillBlock.content, 0, 0, this.markdownTheme, {
42
+ new Markdown(this.skillBlock.content, 0, 0, this.markdownTheme, {
43
43
  color: (text: string) => theme.fg("customMessageText", text),
44
44
  }),
45
45
  );
46
46
  } else {
47
- // Collapsed: single line - [skill] name (hint to expand)
48
- const line =
49
- theme.fg("customMessageLabel", theme.bold("[skill]") + " ") +
50
- theme.fg("customMessageText", this.skillBlock.name) +
51
- theme.fg("dim", ` (${editorKey("expandTools")} to expand)`);
52
- this.addChild(new Text(line, 0, 0));
47
+ this.addChild(
48
+ new Text(
49
+ theme.fg("dim", `(${editorKey("expandTools")} to expand)`),
50
+ 0,
51
+ 0,
52
+ ),
53
+ );
53
54
  }
54
55
  }
56
+
57
+ override render(width: number): string[] {
58
+ const frameWidth = Math.max(20, width);
59
+ const contentWidth = Math.max(1, frameWidth - 4);
60
+ const lines = super.render(contentWidth);
61
+ const framed = renderChatFrame(lines, frameWidth, {
62
+ label: `skill - ${this.skillBlock.name}`,
63
+ tone: "skill",
64
+ timestampFormat: "date-time-iso",
65
+ showTimestamp: false,
66
+ });
67
+ return framed.length > 0 ? ["", ...framed] : framed;
68
+ }
55
69
  }