@agimon-ai/po-help 0.0.0-alpha.80 → 0.0.0-alpha.82

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 CHANGED
@@ -32,6 +32,16 @@ Deactivation removes Help-only capabilities from future prompts, catalogs, and c
32
32
 
33
33
  Use named routes under `src/extensions/workspaces/sessions/(backend)/resource/` and `tool/`. Root files own shared state and lifecycle. Do not create a second tool registry inside Help or add executable callbacks to the documentation descriptor.
34
34
 
35
+ ### Human starter guides
36
+
37
+ The session `help.guides` typed data slot supplies human-readable starter guides on web and native. Help, Artifacts, Calendar, Goal, and Author each own two README-grounded guides. These are independent of Help-only agent skills and diagnostic tools; contributing guidance does not activate a mode or grant permissions.
38
+
39
+ Contribute a shared plain-data module under the owning fill's `_lib/`, then thin `fill/<Label>.help.guides.web.ts` and `.native.ts` routes using each platform's `defineFill`. Set `slot: 'help.guides'`, a stable fill `id`, deterministic `order`, and `data`. No dependency on the optional Help package is needed: locally check the structural data with `satisfies`. Builds regenerate routed entries; never edit generated entries by hand.
40
+
41
+ The v1 data shape is `{ version: 1, label, guides }`. Each guide has a stable `id`, `question`, plain-text `answer`, and optional `keywords` and numeric `order`. Labels and IDs are at most 80 characters, questions 240, answers 4,000, with at most 64 guides and 16 keywords of at most 64 characters each. Keep IDs unique within a set and all text nonempty. Invalid sets are rejected as a whole. Answers do not render Markdown or executable callbacks.
42
+
43
+ Keep wording grounded in the owning README and preserve approved question, answer, keyword, and ordering changes in contract tests. Runtime modules must never import story fixtures. The approved fixtures are test and story evidence only.
44
+
35
45
  ### Skills
36
46
 
37
47
  For the server, declare a normal skill resource with `HELP_WHEN`, a useful description, and `path: packageResourcePath(import.meta.url, 'src/prompts/<name>/SKILL.md')`. Its reader returns the same file. Validate required content and report unavailable resources rather than registering empty successful guidance. Keep package documents lazy; eager context is only for small live activation instructions.
@@ -1,9 +1,273 @@
1
- import { defineNativePlugin, defineToolRenderer } from "@agimon-ai/po-core/native";
1
+ import { defineDockFace, defineFill, defineNativePlugin, defineSlotFile, defineToolRenderer } from "@agimon-ai/po-core/native";
2
2
  import { View } from "react-native-unistyles/components/native/View";
3
3
  import { Text } from "react-native-unistyles/components/native/Text";
4
- import { Badge, CheckIcon, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SectionLabel, collapseLines, fontOf, toolTone } from "@agimon-ai/po-native-components";
5
- import { StyleSheet } from "react-native-unistyles";
4
+ import { Pressable } from "react-native-unistyles/components/native/Pressable";
5
+ import { FlatList } from "react-native-unistyles/components/native/FlatList";
6
+ import { Badge, CheckIcon, ChevronDownIcon, ChevronRightIcon, EmptyState, Input, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SectionLabel, SheetList, collapseLines, fontOf, toolTone } from "@agimon-ai/po-native-components";
7
+ import { useState } from "react";
8
+ import { StyleSheet, useUnistyles } from "react-native-unistyles";
6
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
+ //#region src/types/helpGuides.ts
11
+ const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
12
+ const text$1 = (value, limit) => {
13
+ if (typeof value !== "string") return null;
14
+ const trimmed = value.trim();
15
+ return trimmed.length > 0 && trimmed.length <= limit ? trimmed : null;
16
+ };
17
+ /** Reject the whole fill so the registry can identify the faulty contributor. */
18
+ function parseHelpGuideSet(input) {
19
+ if (!record(input) || input.version !== 1) return null;
20
+ const label = text$1(input.label, 80);
21
+ if (!label || !Array.isArray(input.guides) || input.guides.length > 64) return null;
22
+ const guides = [];
23
+ const ids = /* @__PURE__ */ new Set();
24
+ for (const raw of input.guides) {
25
+ if (!record(raw)) return null;
26
+ const id = text$1(raw.id, 80);
27
+ const question = text$1(raw.question, 240);
28
+ const answer = text$1(raw.answer, 4e3);
29
+ if (!id || !question || !answer || ids.has(id)) return null;
30
+ if (raw.order !== void 0 && (typeof raw.order !== "number" || !Number.isFinite(raw.order))) return null;
31
+ let keywords;
32
+ if (raw.keywords !== void 0) {
33
+ if (!Array.isArray(raw.keywords) || raw.keywords.length > 16) return null;
34
+ keywords = [];
35
+ for (const keyword of raw.keywords) {
36
+ const parsed = text$1(keyword, 64);
37
+ if (!parsed) return null;
38
+ keywords.push(parsed);
39
+ }
40
+ }
41
+ ids.add(id);
42
+ guides.push({
43
+ id,
44
+ question,
45
+ answer,
46
+ ...keywords === void 0 ? {} : { keywords },
47
+ ...raw.order === void 0 ? {} : { order: raw.order }
48
+ });
49
+ }
50
+ return {
51
+ version: 1,
52
+ label,
53
+ guides
54
+ };
55
+ }
56
+ const helpGuidesSlot = {
57
+ slot: "help.guides",
58
+ parse: parseHelpGuideSet
59
+ };
60
+ //#endregion
61
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/_lib/helpGuidesView.ts
62
+ /** Preserve registry group order; sort and filter guides without mutating contributions. */
63
+ function helpGuidesView(fills, query) {
64
+ const tokens = query.toLowerCase().trim().split(/\s+/).filter(Boolean);
65
+ return fills.flatMap((fill) => {
66
+ const guides = fill.data.guides.filter((guide) => {
67
+ const searchable = [
68
+ fill.data.label,
69
+ guide.question,
70
+ guide.answer,
71
+ ...guide.keywords ?? []
72
+ ].join(" ").toLowerCase();
73
+ return tokens.every((token) => searchable.includes(token));
74
+ }).sort((a, b) => (a.order ?? 0) - (b.order ?? 0) || a.question.localeCompare(b.question));
75
+ return guides.length ? [{
76
+ ...fill,
77
+ data: {
78
+ ...fill.data,
79
+ guides
80
+ }
81
+ }] : [];
82
+ });
83
+ }
84
+ //#endregion
85
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/_components/HelpGuidesPanel.native.tsx
86
+ function HelpGuidesFace(props) {
87
+ return /* @__PURE__ */ jsx(HelpGuidesPanel, {
88
+ fills: props.slotData(helpGuidesSlot),
89
+ header: props.dockHeader,
90
+ sheet: true
91
+ }, props.sessionId);
92
+ }
93
+ function HelpGuidesPanel({ fills, initialQuery = "", initialExpanded, header, sheet = false }) {
94
+ const { theme } = useUnistyles();
95
+ const [query, setQuery] = useState(initialQuery);
96
+ const [open, setOpen] = useState(initialExpanded ? JSON.stringify(initialExpanded) : "");
97
+ const groups = helpGuidesView(fills, query);
98
+ const hasGuides = fills.some((fill) => fill.data.guides.length);
99
+ const List = sheet ? SheetList : FlatList;
100
+ return /* @__PURE__ */ jsx(View, {
101
+ style: styles$1.panel,
102
+ children: /* @__PURE__ */ jsx(List, {
103
+ ...sheet ? { embedded: true } : {},
104
+ style: styles$1.list,
105
+ data: groups,
106
+ keyExtractor: (group) => JSON.stringify([group.pluginId, group.id]),
107
+ keyboardShouldPersistTaps: "handled",
108
+ ListHeaderComponent: /* @__PURE__ */ jsxs(Fragment, { children: [header, /* @__PURE__ */ jsx(View, {
109
+ style: styles$1.search,
110
+ children: /* @__PURE__ */ jsx(Input, {
111
+ accessibilityLabel: "Search help",
112
+ placeholder: "Search help",
113
+ placeholderTextColor: theme.colors.dim,
114
+ value: query,
115
+ onChangeText: setQuery,
116
+ autoCapitalize: "none"
117
+ })
118
+ })] }),
119
+ ListEmptyComponent: /* @__PURE__ */ jsx(View, {
120
+ style: styles$1.empty,
121
+ children: /* @__PURE__ */ jsx(EmptyState, {
122
+ title: hasGuides ? "No matching guides" : "No help guides yet",
123
+ description: hasGuides ? "Try a different word or a package name." : "Guides from this session’s plugins will appear here."
124
+ })
125
+ }),
126
+ ListFooterComponent: /* @__PURE__ */ jsx(View, { style: styles$1.footer }),
127
+ renderItem: ({ item: group, index: groupIndex }) => /* @__PURE__ */ jsxs(View, {
128
+ style: [styles$1.group, groupIndex === 0 && styles$1.firstGroup],
129
+ children: [/* @__PURE__ */ jsx(Text, {
130
+ accessibilityRole: "header",
131
+ style: styles$1.heading,
132
+ children: group.data.label
133
+ }), group.data.guides.map((guide, index) => {
134
+ const key = JSON.stringify([
135
+ group.pluginId,
136
+ group.id,
137
+ guide.id
138
+ ]);
139
+ const expanded = key === open;
140
+ return /* @__PURE__ */ jsxs(View, {
141
+ style: index ? styles$1.separated : void 0,
142
+ children: [/* @__PURE__ */ jsxs(Pressable, {
143
+ accessibilityRole: "button",
144
+ accessibilityLabel: guide.question,
145
+ accessibilityState: { expanded },
146
+ "aria-expanded": expanded,
147
+ onPress: () => setOpen(expanded ? "" : key),
148
+ style: styles$1.trigger,
149
+ children: [/* @__PURE__ */ jsx(Text, {
150
+ style: styles$1.question,
151
+ children: guide.question
152
+ }), expanded ? /* @__PURE__ */ jsx(ChevronDownIcon, { size: 16 }) : /* @__PURE__ */ jsx(ChevronRightIcon, { size: 16 })]
153
+ }), expanded ? /* @__PURE__ */ jsx(Text, {
154
+ selectable: true,
155
+ style: styles$1.answer,
156
+ children: guide.answer
157
+ }) : null]
158
+ }, key);
159
+ })]
160
+ })
161
+ })
162
+ });
163
+ }
164
+ const styles$1 = StyleSheet.create((theme) => ({
165
+ panel: {
166
+ flex: 1,
167
+ backgroundColor: theme.colors.rail,
168
+ uni__dependencies: [0]
169
+ },
170
+ list: { flex: 1 },
171
+ search: {
172
+ padding: theme.spacing(3),
173
+ borderBottomWidth: 1,
174
+ borderBottomColor: theme.colors["border-soft"],
175
+ uni__dependencies: [0]
176
+ },
177
+ empty: {
178
+ padding: theme.spacing(3),
179
+ uni__dependencies: [0]
180
+ },
181
+ footer: {
182
+ height: theme.spacing(3),
183
+ uni__dependencies: [0]
184
+ },
185
+ group: {
186
+ marginHorizontal: theme.spacing(3),
187
+ marginTop: theme.spacing(5),
188
+ gap: theme.spacing(1),
189
+ uni__dependencies: [0]
190
+ },
191
+ firstGroup: {
192
+ marginTop: theme.spacing(3),
193
+ uni__dependencies: [0]
194
+ },
195
+ heading: {
196
+ fontFamily: fontOf(theme.fontFamily.sans),
197
+ color: theme.colors.hi,
198
+ fontSize: theme.fontSize.lg,
199
+ fontWeight: theme.fontWeight.semibold,
200
+ lineHeight: theme.lineHeight.lg,
201
+ uni__dependencies: [0]
202
+ },
203
+ trigger: {
204
+ minHeight: 44,
205
+ flexDirection: "row",
206
+ alignItems: "center",
207
+ gap: theme.spacing(2),
208
+ paddingVertical: theme.spacing(2),
209
+ uni__dependencies: [0]
210
+ },
211
+ question: {
212
+ flex: 1,
213
+ fontFamily: fontOf(theme.fontFamily.sans),
214
+ color: theme.colors.hi,
215
+ fontSize: theme.fontSize.base,
216
+ fontWeight: theme.fontWeight.medium,
217
+ lineHeight: theme.lineHeightRelaxed.base,
218
+ uni__dependencies: [0]
219
+ },
220
+ answer: {
221
+ fontFamily: fontOf(theme.fontFamily.sans),
222
+ color: theme.colors.text,
223
+ fontSize: theme.fontSize.base,
224
+ lineHeight: theme.lineHeightRelaxed.base,
225
+ paddingBottom: theme.spacing(2),
226
+ uni__dependencies: [0]
227
+ },
228
+ separated: {
229
+ borderTopWidth: 1,
230
+ borderTopColor: theme.colors["border-soft"],
231
+ uni__dependencies: [0]
232
+ }
233
+ }));
234
+ //#endregion
235
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/help.native.tsx
236
+ var help_native_default = defineDockFace({
237
+ id: "help",
238
+ label: "Help",
239
+ order: 50,
240
+ requiredMinorMode: "help",
241
+ panel: HelpGuidesFace,
242
+ ownsScroll: true
243
+ });
244
+ //#endregion
245
+ //#region src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.native.ts
246
+ var Help_help_guides_native_default = defineFill({
247
+ slot: "help.guides",
248
+ id: "Help",
249
+ order: 0,
250
+ data: {
251
+ version: 1,
252
+ label: "Help",
253
+ guides: [{
254
+ id: "about",
255
+ question: "What does Help mode do?",
256
+ order: 0,
257
+ answer: "Help adds package guidance and read-only diagnostics for your setup. It does not change configuration or grant extra permissions.",
258
+ keywords: ["setup", "diagnostics"]
259
+ }, {
260
+ id: "toggle",
261
+ question: "How do I turn Help on or off?",
262
+ order: 1,
263
+ answer: "Use the minor-mode menu, or send /minor help. Help is additive: other tools and modes keep their existing rules."
264
+ }]
265
+ }
266
+ });
267
+ //#endregion
268
+ //#region src/extensions/workspaces/sessions/(frontend)/slot/guides.native.ts
269
+ var guides_native_default = defineSlotFile(helpGuidesSlot);
270
+ //#endregion
7
271
  //#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts
8
272
  const ACTIVATIONS = /* @__PURE__ */ new Set([
9
273
  "inactive",
@@ -614,9 +878,23 @@ const via = (identity, value) => value === void 0 ? void 0 : {
614
878
  };
615
879
  const nativePlugin = defineNativePlugin({
616
880
  id: "help",
617
- session: { get toolRenderers() {
618
- return [via({ tools: ["help_status"] }, help_status_native_default)];
619
- } }
881
+ session: {
882
+ get dockFaces() {
883
+ return [via({ id: "help" }, help_native_default)];
884
+ },
885
+ get fills() {
886
+ return [via({
887
+ slot: "help.guides",
888
+ id: "help"
889
+ }, Help_help_guides_native_default)];
890
+ },
891
+ get slots() {
892
+ return [via({ slot: "help.guides" }, guides_native_default)];
893
+ },
894
+ get toolRenderers() {
895
+ return [via({ tools: ["help_status"] }, help_status_native_default)];
896
+ }
897
+ }
620
898
  });
621
899
  //#endregion
622
900
  export { nativePlugin };
@@ -1 +1 @@
1
- {"version":3,"file":"native.mjs","names":["ToolMessageRenderProps","Badge","CheckIcon","collapseLines","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","SectionLabel","toolTone","PoNativeTheme","StyleSheet","HELP_LIST_LIMIT","HELP_PREVIEW_LINES","HelpCapabilityRow","helpFigures","helpHasDetail","helpHeadline","helpOutputLines","helpStateNote","HelpStatusView","helpToolView","SetupReportView","DEFAULT_SUMMARY","HelpStatusCard","toolName","output","running","isError","tone","view","kind","lines","length","styles","sans","error","join","expanded","shown","map","line","index","String","text","hidden","ReportCard","ReturnType","figures","note","undefined","summary","primary","body","small","dim","figure","label","value","warning","hi","StatusDetail","packages","section","entry","packageName","row","mono","name","stage","faint","trail","scope","reason","previous","diagnostics","code","source","skills","tools","truncated","CapabilityList","rows","slice","active","chip","SetupDetail","selection","majorMode","domains","domain","profile","wrapRow","item","checks","check","area","passed","problemCount","guidance","skipped","limitations","TABULAR","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","flexShrink","maxWidth","color","colors","flexWrap","textAlign","rowGap","width","paddingRight","fontFamily","fontSize","base","lineHeight","sm","lg","fontWeight","semibold","fontVariant","yellow","red","toolHelpStatus"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/HelpStatusCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/help-status.native.tsx","../../generated/native.ts"],"sourcesContent":["/**\n * The help_status and diagnose_setup reports as the card's view models. Both\n * tools return their report as JSON text; a field that is missing or\n * malformed is left out, and output that does not parse keeps its raw lines.\n */\n\n/** How many lines of unparsed output the card shows before \"N more lines\", as the web card does. */\nexport const HELP_PREVIEW_LINES = 12;\n\n/** How many names a capability list shows on expand before \"and N more\". */\nexport const HELP_LIST_LIMIT = 10;\n\nexport type HelpActivation = 'inactive' | 'activating' | 'active' | 'degraded';\n\nexport interface HelpCapabilityRow {\n name: string;\n source?: string;\n active: boolean;\n reason?: string;\n}\n\nexport interface HelpDiagnosticRow {\n code: string;\n source?: string;\n}\n\nexport interface HelpPackageFailureRow {\n packageName: string;\n scope?: string;\n stage?: string;\n reason?: string;\n previous?: string;\n}\n\nexport interface HelpStatusView {\n kind: 'status';\n activation: HelpActivation;\n /** Null while the session is still resolving its skills. */\n skillCount: number | null;\n toolCount?: number;\n skills: HelpCapabilityRow[];\n tools: HelpCapabilityRow[];\n diagnostics: HelpDiagnosticRow[];\n packages: HelpPackageFailureRow[];\n truncated: boolean;\n}\n\nexport interface SetupCheckRow {\n area: string;\n passed: boolean;\n problemCount?: number;\n guidance?: string;\n}\n\nexport interface SetupReportView {\n kind: 'setup';\n passed: boolean;\n majorMode?: string;\n domains: string[];\n profile?: string;\n checks: SetupCheckRow[];\n skipped: string[];\n limitations?: string;\n}\n\nexport interface HelpTextView {\n kind: 'text';\n lines: string[];\n}\n\nexport type HelpToolView = HelpStatusView | SetupReportView | HelpTextView;\n\nexport interface HelpFigure {\n label: string;\n value: string;\n tone: 'text' | 'warning' | 'error';\n}\n\nconst ACTIVATIONS: ReadonlySet<string> = new Set(['inactive', 'activating', 'active', 'degraded']);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n\nconst text = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n\nconst records = (value: unknown): Record<string, unknown>[] => (Array.isArray(value) ? value.filter(isRecord) : []);\n\n/** The tool's output as lines, blank lines dropped, as the web card shows them. */\nexport function helpOutputLines(output: string): string[] {\n return output.split('\\n').filter((line) => line.trim() !== '');\n}\n\nfunction capabilities(value: unknown): HelpCapabilityRow[] {\n return records(value).flatMap((raw) => {\n const name = text(raw.name);\n if (name === undefined) return [];\n const source = text(raw.source);\n const reason = text(raw.reason);\n return [{ name, active: raw.active === true, ...(source ? { source } : {}), ...(reason ? { reason } : {}) }];\n });\n}\n\nfunction parseStatus(raw: Record<string, unknown>): HelpStatusView | null {\n const activation = text(raw.activation);\n if (activation === undefined || !ACTIVATIONS.has(activation)) return null;\n const counts = isRecord(raw.counts) ? raw.counts : {};\n const toolCount = count(counts.tools);\n return {\n kind: 'status',\n activation: activation as HelpActivation,\n skillCount: count(counts.skills) ?? null,\n ...(toolCount === undefined ? {} : { toolCount }),\n skills: capabilities(raw.skills),\n tools: capabilities(raw.tools),\n diagnostics: records(raw.diagnostics).flatMap((entry) => {\n const code = text(entry.code);\n if (code === undefined) return [];\n const source = text(entry.source);\n return [{ code, ...(source ? { source } : {}) }];\n }),\n packages: records(raw.packages).flatMap((entry) => {\n const packageName = text(entry.packageName);\n if (packageName === undefined) return [];\n const fields = { scope: text(entry.scope), stage: text(entry.stage), reason: text(entry.reason) };\n const previous = text(entry.previous);\n return [\n {\n packageName,\n ...Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined)),\n ...(previous && previous !== 'none' ? { previous } : {}),\n },\n ];\n }),\n truncated: raw.truncated === true,\n };\n}\n\nfunction parseSetup(raw: Record<string, unknown>): SetupReportView | null {\n const status = text(raw.status);\n if (status !== 'checks-passed' && status !== 'issues-found') return null;\n const selection = isRecord(raw.appliedSelection) ? raw.appliedSelection : {};\n const majorMode = text(selection.majorMode);\n const profile = text(selection.profile);\n const limitations = text(raw.limitations);\n return {\n kind: 'setup',\n passed: status === 'checks-passed',\n ...(majorMode ? { majorMode } : {}),\n domains: Array.isArray(selection.domains) ? selection.domains.flatMap((value) => text(value) ?? []) : [],\n ...(profile ? { profile } : {}),\n checks: records(raw.checks).flatMap((entry) => {\n const area = text(entry.area);\n if (area === undefined) return [];\n const problemCount = count(entry.problemCount);\n const guidance = text(entry.guidance);\n return [\n {\n area,\n passed: entry.status === 'passed',\n ...(problemCount === undefined ? {} : { problemCount }),\n ...(guidance ? { guidance } : {}),\n },\n ];\n }),\n skipped: Array.isArray(raw.skipped) ? raw.skipped.flatMap((value) => text(value) ?? []) : [],\n ...(limitations ? { limitations } : {}),\n };\n}\n\n/** The report a help diagnostic tool returned, or its raw lines when the output is not a report. */\nexport function helpToolView(output: string): HelpToolView {\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { kind: 'text', lines: helpOutputLines(output) };\n }\n if (isRecord(parsed)) {\n const view = parseStatus(parsed) ?? parseSetup(parsed);\n if (view !== null) return view;\n }\n return { kind: 'text', lines: helpOutputLines(output) };\n}\n\nconst plural = (n: number, word: string) => `${String(n)} ${word}${n === 1 ? '' : 's'}`;\n\n/** The header's primary piece: what the report concluded. */\nexport function helpHeadline(view: HelpStatusView | SetupReportView): string {\n if (view.kind === 'setup') {\n if (view.passed) return 'Checks passed';\n const failed = view.checks.filter((check) => !check.passed).length;\n return failed > 0 ? `${plural(failed, 'area')} failed` : 'Issues found';\n }\n const label: Record<HelpActivation, string> = {\n inactive: 'Help off',\n activating: 'Help activating',\n active: 'Help active',\n degraded: 'Help degraded',\n };\n return label[view.activation];\n}\n\n/** The key figures shown while the card is collapsed. */\nexport function helpFigures(view: HelpStatusView | SetupReportView): HelpFigure[] {\n if (view.kind === 'setup') {\n const failed = view.checks.filter((check) => !check.passed).length;\n return [\n {\n label: 'Checks passed',\n value: `${String(view.checks.length - failed)}/${String(view.checks.length)}`,\n tone: 'text',\n },\n { label: 'Failed', value: String(failed), tone: failed > 0 ? 'error' : 'text' },\n ...(view.skipped.length > 0\n ? [{ label: 'Skipped', value: String(view.skipped.length), tone: 'warning' as const }]\n : []),\n ];\n }\n if (view.activation === 'inactive') return [];\n return [\n { label: 'Skills', value: view.skillCount === null ? 'pending' : String(view.skillCount), tone: 'text' },\n ...(view.toolCount === undefined ? [] : [{ label: 'Tools', value: String(view.toolCount), tone: 'text' as const }]),\n ...(view.diagnostics.length > 0\n ? [{ label: 'Diagnostics', value: String(view.diagnostics.length), tone: 'warning' as const }]\n : []),\n ...(view.packages.length > 0\n ? [{ label: 'Failed packages', value: String(view.packages.length), tone: 'error' as const }]\n : []),\n ];\n}\n\n/** A quiet sentence for the states that have no figures to explain themselves. */\nexport function helpStateNote(view: HelpStatusView): string | undefined {\n if (view.activation === 'inactive') return 'Help mode is off in this session.';\n if (view.activation === 'activating') return 'Skills are counted once the session is ready.';\n return undefined;\n}\n\n/** Whether the card has detail to show on expand. */\nexport function helpHasDetail(view: HelpStatusView | SetupReportView): boolean {\n if (view.kind === 'setup') return view.checks.length > 0 || view.skipped.length > 0 || view.limitations !== undefined;\n return (\n view.skills.length > 0 ||\n view.tools.length > 0 ||\n view.diagnostics.length > 0 ||\n view.packages.length > 0 ||\n view.truncated\n );\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n CheckIcon,\n collapseLines,\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SectionLabel,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n HELP_LIST_LIMIT,\n HELP_PREVIEW_LINES,\n type HelpCapabilityRow,\n helpFigures,\n helpHasDetail,\n helpHeadline,\n helpOutputLines,\n helpStateNote,\n type HelpStatusView,\n helpToolView,\n type SetupReportView,\n} from '../_lib/helpStatusView';\n\n/** The web card's summary, kept while there is no report to summarise. */\nconst DEFAULT_SUMMARY = 'Help diagnostics';\n\n/**\n * The help_status and diagnose_setup timeline item on native. The web card\n * prints the tool's JSON as lines; here the report is laid out instead: the\n * outcome in the header, key figures in the body, and the lists on expand.\n * Output that does not parse keeps the web card's raw lines. A failed call\n * shows only its reason in red; the header carries the failure.\n */\nexport function HelpStatusCard({ toolName, output, running, isError }: ToolMessageRenderProps) {\n const tone = toolTone({ running, isError });\n const view = running || isError ? null : helpToolView(output);\n if (view !== null && view.kind !== 'text') return <ReportCard toolName={toolName} tone={tone} view={view} />;\n const lines = view?.lines ?? helpOutputLines(output);\n if (isError) {\n return (\n <MessageItem tone={tone}>\n <MessageItemHeader title={toolName}>{DEFAULT_SUMMARY}</MessageItemHeader>\n {lines.length > 0 ? (\n <MessageItemBody>\n <Text selectable style={[styles.sans, styles.error]}>\n {lines.join('\\n')}\n </Text>\n </MessageItemBody>\n ) : null}\n </MessageItem>\n );\n }\n return (\n <MessageItem tone={tone} expandable={lines.length > HELP_PREVIEW_LINES}>\n {({ expanded }) => {\n const shown = collapseLines(lines, HELP_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={toolName}>{DEFAULT_SUMMARY}</MessageItemHeader>\n {shown.shown.length > 0 || running ? (\n <MessageItemBody>\n {shown.shown.map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={[styles.sans, styles.text]}>\n {line}\n </Text>\n ))}\n {shown.hidden > 0 ? <MessageItemStatus expands>{shown.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">Inspecting this session</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nfunction ReportCard({\n toolName,\n tone,\n view,\n}: {\n toolName: string;\n tone: ReturnType<typeof toolTone>;\n view: HelpStatusView | SetupReportView;\n}) {\n const figures = helpFigures(view);\n const note = view.kind === 'status' ? helpStateNote(view) : undefined;\n return (\n <MessageItem tone={tone} expandable={helpHasDetail(view)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {helpHeadline(view)}\n </Text>\n </View>\n </MessageItemHeader>\n <MessageItemBody testID={`tool-result-${toolName}`} style={styles.body}>\n {note !== undefined ? <Text style={[styles.small, styles.dim]}>{note}</Text> : null}\n {figures.length > 0 ? (\n <View style={styles.figures}>\n {figures.map((figure) => (\n <View key={figure.label} style={styles.figure}>\n <Text numberOfLines={1} style={[styles.small, styles.dim]}>\n {figure.label}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n styles.value,\n figure.tone === 'error' ? styles.error : figure.tone === 'warning' ? styles.warning : styles.hi,\n ]}\n >\n {figure.value}\n </Text>\n </View>\n ))}\n </View>\n ) : null}\n {expanded ? view.kind === 'status' ? <StatusDetail view={view} /> : <SetupDetail view={view} /> : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n\nfunction StatusDetail({ view }: { view: HelpStatusView }) {\n return (\n <>\n {view.packages.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Failed packages</SectionLabel>\n {view.packages.map((entry, index) => (\n <View key={`${entry.packageName}-${String(index)}`} style={styles.entry}>\n <View style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, styles.text, styles.name]}>\n {entry.packageName}\n </Text>\n {entry.stage !== undefined ? (\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.trail]}>\n {entry.stage}\n {entry.scope !== undefined ? ` · ${entry.scope}` : ''}\n </Text>\n ) : null}\n </View>\n {entry.reason !== undefined ? (\n <Text selectable style={[styles.small, styles.error]}>\n {entry.reason}\n </Text>\n ) : null}\n {entry.previous !== undefined ? (\n <Text style={[styles.small, styles.faint]}>Previous build {entry.previous}</Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n {view.diagnostics.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Diagnostics</SectionLabel>\n {view.diagnostics.map((entry, index) => (\n <View key={`${entry.code}-${String(index)}`} style={styles.row}>\n <Badge tone=\"yellow\" size=\"xs\">\n {entry.code}\n </Badge>\n {entry.source !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"head\" style={[styles.mono, styles.dim, styles.trail]}>\n {entry.source}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n <CapabilityList label=\"Skills\" rows={view.skills} />\n <CapabilityList label=\"Tools\" rows={view.tools} />\n {view.truncated ? <Text style={[styles.small, styles.faint]}>The tool capped its lists; more exist.</Text> : null}\n </>\n );\n}\n\nfunction CapabilityList({ label, rows }: { label: string; rows: HelpCapabilityRow[] }) {\n if (rows.length === 0) return null;\n const shown = rows.slice(0, HELP_LIST_LIMIT);\n return (\n <View style={styles.section}>\n <SectionLabel>{label}</SectionLabel>\n {shown.map((row, index) => (\n <View key={`${row.name}-${String(index)}`} style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, row.active ? styles.text : styles.dim, styles.name]}>\n {row.name}\n </Text>\n {!row.active ? (\n <Badge size=\"xs\" style={styles.chip}>\n {row.reason ?? 'inactive'}\n </Badge>\n ) : null}\n {row.source !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"head\" style={[styles.small, styles.faint, styles.trail]}>\n {row.source}\n </Text>\n ) : null}\n </View>\n ))}\n {rows.length > shown.length ? (\n <Text style={[styles.small, styles.faint]}>and {rows.length - shown.length} more</Text>\n ) : null}\n </View>\n );\n}\n\nfunction SetupDetail({ view }: { view: SetupReportView }) {\n const selection = [\n ...(view.majorMode !== undefined ? [`mode ${view.majorMode}`] : []),\n ...view.domains.map((domain) => `domain ${domain}`),\n ...(view.profile !== undefined ? [`profile ${view.profile}`] : []),\n ];\n return (\n <>\n {selection.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Selection</SectionLabel>\n <View style={styles.wrapRow}>\n {selection.map((item) => (\n <Badge key={item} size=\"xs\">\n {item}\n </Badge>\n ))}\n </View>\n </View>\n ) : null}\n {view.checks.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Checks</SectionLabel>\n {view.checks.map((check) => (\n <View key={check.area} style={styles.entry}>\n <View style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, styles.text, styles.area]}>\n {check.area}\n </Text>\n {check.passed ? (\n <CheckIcon size={14} color=\"green\" />\n ) : (\n <Text numberOfLines={1} style={[styles.small, styles.error, styles.trail]}>\n {check.problemCount === undefined\n ? 'failed'\n : `${String(check.problemCount)} problem${check.problemCount === 1 ? '' : 's'}`}\n </Text>\n )}\n </View>\n {!check.passed && check.guidance !== undefined ? (\n <Text numberOfLines={1} style={[styles.small, styles.faint]}>\n Guide: {check.guidance}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n {view.skipped.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Skipped</SectionLabel>\n {view.skipped.map((item) => (\n <Text key={item} style={[styles.small, styles.warning]}>\n {item}\n </Text>\n ))}\n </View>\n ) : null}\n {view.limitations !== undefined ? <Text style={[styles.small, styles.faint]}>{view.limitations}</Text> : null}\n </>\n );\n}\n\n/** Numbers line up down a column. */\nconst TABULAR = ['tabular-nums'] as ['tabular-nums'];\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // The outcome alone: the counts sit in the figures below, so the header carries no second piece to cut.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5), minWidth: 0 },\n primary: { flexShrink: 0, maxWidth: '70%', color: theme.colors.text },\n body: { gap: theme.spacing(4) },\n section: { gap: theme.spacing(2) },\n entry: { gap: theme.spacing(0.5) },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n wrapRow: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: theme.spacing(2) },\n name: { flexShrink: 1, minWidth: 0 },\n area: { flex: 1, minWidth: 0 },\n chip: { flexShrink: 0 },\n trail: { flex: 1, minWidth: 0, textAlign: 'right' },\n // Two figures a row on a phone, as the diagnose_agent card lays them out.\n figures: { flexDirection: 'row', flexWrap: 'wrap', rowGap: theme.spacing(3) },\n figure: { width: '50%', gap: theme.spacing(0.5), paddingRight: theme.spacing(2) },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n value: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n fontVariant: TABULAR,\n },\n text: { color: theme.colors.text },\n hi: { color: theme.colors.hi },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n warning: { color: theme.colors.yellow },\n error: { color: theme.colors.red },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { HelpStatusCard } from './_components/HelpStatusCard.native';\n\nexport default defineToolRenderer({ tools: ['help_status', 'diagnose_setup'], message: HelpStatusCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport toolHelpStatus from '../src/extensions/workspaces/sessions/(frontend)/tool/help-status.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'help',\n session: {\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['help_status'] }, toolHelpStatus)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"native.mjs","names":["text","WebPluginSlotProps","SlotDataFill","ChevronDownIcon","ChevronRightIcon","EmptyState","fontOf","Input","SheetList","PoNativeTheme","useState","ReactNode","StyleSheet","useUnistyles","helpGuidesSlot","HelpGuideSet","helpGuidesView","HelpGuidesFace","props","sessionId","slotData","dockHeader","HelpGuidesPanel","fills","initialQuery","initialExpanded","header","sheet","theme","query","setQuery","open","setOpen","JSON","stringify","groups","hasGuides","some","fill","data","guides","length","List","FlatList","styles","panel","embedded","list","group","pluginId","id","search","colors","dim","empty","footer","item","index","groupIndex","firstGroup","heading","label","map","guide","key","expanded","separated","undefined","question","trigger","answer","create","flex","backgroundColor","rail","uni__dependencies","padding","spacing","borderBottomWidth","borderBottomColor","height","marginHorizontal","marginTop","gap","fontFamily","sans","color","hi","fontSize","lg","fontWeight","semibold","lineHeight","minHeight","flexDirection","alignItems","paddingVertical","base","medium","lineHeightRelaxed","text","paddingBottom","borderTopWidth","borderTopColor","styles","ToolMessageRenderProps","Badge","CheckIcon","collapseLines","fontOf","MessageItem","MessageItemBody","MessageItemHeader","MessageItemStatus","SectionLabel","toolTone","PoNativeTheme","StyleSheet","HELP_LIST_LIMIT","HELP_PREVIEW_LINES","HelpCapabilityRow","helpFigures","helpHasDetail","helpHeadline","helpOutputLines","helpStateNote","HelpStatusView","helpToolView","SetupReportView","DEFAULT_SUMMARY","HelpStatusCard","toolName","output","running","isError","tone","view","kind","lines","length","styles","sans","error","join","expanded","shown","map","line","index","String","text","hidden","ReportCard","ReturnType","figures","note","undefined","summary","primary","body","small","dim","figure","label","value","warning","hi","StatusDetail","packages","section","entry","packageName","row","mono","name","stage","faint","trail","scope","reason","previous","diagnostics","code","source","skills","tools","truncated","CapabilityList","rows","slice","active","chip","SetupDetail","selection","majorMode","domains","domain","profile","wrapRow","item","checks","check","area","passed","problemCount","guidance","skipped","limitations","TABULAR","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","flexShrink","maxWidth","color","colors","flexWrap","textAlign","rowGap","width","paddingRight","fontFamily","fontSize","base","lineHeight","sm","lg","fontWeight","semibold","fontVariant","yellow","red","dockHelp","fillHelp","slotGuides","toolHelpStatus"],"sources":["../../src/types/helpGuides.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_lib/helpGuidesView.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/HelpGuidesPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/help.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/helpGuides.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.native.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/guides.native.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/HelpStatusCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/help-status.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { SlotDeclaration } from '@agimon-ai/po-core/web';\n\nexport interface HelpGuide {\n id: string;\n question: string;\n // ponytail: v1 answers are plain text; add shared Markdown rendering only when a guide needs rich content.\n answer: string;\n keywords?: string[];\n order?: number;\n}\n\nexport interface HelpGuideSet {\n version: 1;\n label: string;\n guides: HelpGuide[];\n}\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst text = (value: unknown, limit: number): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 && trimmed.length <= limit ? trimmed : null;\n};\n\n/** Reject the whole fill so the registry can identify the faulty contributor. */\nexport function parseHelpGuideSet(input: unknown): HelpGuideSet | null {\n if (!record(input) || input.version !== 1) return null;\n const label = text(input.label, 80);\n if (!label || !Array.isArray(input.guides) || input.guides.length > 64) return null;\n const guides: HelpGuide[] = [];\n const ids = new Set<string>();\n for (const raw of input.guides) {\n if (!record(raw)) return null;\n const id = text(raw.id, 80);\n const question = text(raw.question, 240);\n const answer = text(raw.answer, 4000);\n if (!id || !question || !answer || ids.has(id)) return null;\n if (raw.order !== undefined && (typeof raw.order !== 'number' || !Number.isFinite(raw.order))) return null;\n let keywords: string[] | undefined;\n if (raw.keywords !== undefined) {\n if (!Array.isArray(raw.keywords) || raw.keywords.length > 16) return null;\n keywords = [];\n for (const keyword of raw.keywords) {\n const parsed = text(keyword, 64);\n if (!parsed) return null;\n keywords.push(parsed);\n }\n }\n ids.add(id);\n guides.push({\n id,\n question,\n answer,\n ...(keywords === undefined ? {} : { keywords }),\n ...(raw.order === undefined ? {} : { order: raw.order as number }),\n });\n }\n return { version: 1, label, guides };\n}\n\nexport const helpGuidesSlot: SlotDeclaration<HelpGuideSet> = {\n slot: 'help.guides',\n parse: parseHelpGuideSet,\n};\n","import type { SlotDataFill } from '@agimon-ai/po-core/web';\n\nimport type { HelpGuideSet } from '../../../../../../types/helpGuides';\n\n/** Preserve registry group order; sort and filter guides without mutating contributions. */\nexport function helpGuidesView(fills: readonly SlotDataFill<HelpGuideSet>[], query: string) {\n const tokens = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n return fills.flatMap((fill) => {\n const guides = fill.data.guides\n .filter((guide) => {\n const searchable = [fill.data.label, guide.question, guide.answer, ...(guide.keywords ?? [])]\n .join(' ')\n .toLowerCase();\n return tokens.every((token) => searchable.includes(token));\n })\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0) || a.question.localeCompare(b.question));\n return guides.length ? [{ ...fill, data: { ...fill.data, guides } }] : [];\n });\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport type { SlotDataFill } from '@agimon-ai/po-core/web';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n EmptyState,\n fontOf,\n Input,\n SheetList,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useState, type ReactNode } from 'react';\nimport { FlatList, Pressable, Text, View } from 'react-native';\nimport { StyleSheet, useUnistyles } from 'react-native-unistyles';\n\nimport { helpGuidesSlot, type HelpGuideSet } from '../../../../../../types/helpGuides';\nimport { helpGuidesView } from '../_lib/helpGuidesView';\n\nexport function HelpGuidesFace(props: WebPluginSlotProps) {\n return (\n <HelpGuidesPanel key={props.sessionId} fills={props.slotData(helpGuidesSlot)} header={props.dockHeader} sheet />\n );\n}\n\nexport function HelpGuidesPanel({\n fills,\n initialQuery = '',\n initialExpanded,\n header,\n sheet = false,\n}: {\n fills: readonly SlotDataFill<HelpGuideSet>[];\n initialQuery?: string;\n initialExpanded?: readonly [string, string, string];\n header?: ReactNode;\n sheet?: boolean;\n}) {\n const { theme } = useUnistyles();\n const [query, setQuery] = useState(initialQuery);\n const [open, setOpen] = useState(initialExpanded ? JSON.stringify(initialExpanded) : '');\n const groups = helpGuidesView(fills, query);\n const hasGuides = fills.some((fill) => fill.data.guides.length);\n const List = sheet ? SheetList<SlotDataFill<HelpGuideSet>> : FlatList<SlotDataFill<HelpGuideSet>>;\n return (\n <View style={styles.panel}>\n <List\n {...(sheet ? { embedded: true } : {})}\n style={styles.list}\n data={groups}\n keyExtractor={(group) => JSON.stringify([group.pluginId, group.id])}\n keyboardShouldPersistTaps=\"handled\"\n ListHeaderComponent={\n <>\n {header}\n <View style={styles.search}>\n <Input\n accessibilityLabel=\"Search help\"\n placeholder=\"Search help\"\n placeholderTextColor={theme.colors.dim}\n value={query}\n onChangeText={setQuery}\n autoCapitalize=\"none\"\n />\n </View>\n </>\n }\n ListEmptyComponent={\n <View style={styles.empty}>\n <EmptyState\n title={hasGuides ? 'No matching guides' : 'No help guides yet'}\n description={\n hasGuides\n ? 'Try a different word or a package name.'\n : 'Guides from this session’s plugins will appear here.'\n }\n />\n </View>\n }\n ListFooterComponent={<View style={styles.footer} />}\n renderItem={({ item: group, index: groupIndex }) => (\n <View style={[styles.group, groupIndex === 0 && styles.firstGroup]}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n {group.data.label}\n </Text>\n {group.data.guides.map((guide, index) => {\n const key = JSON.stringify([group.pluginId, group.id, guide.id]);\n const expanded = key === open;\n return (\n <View key={key} style={index ? styles.separated : undefined}>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={guide.question}\n accessibilityState={{ expanded }}\n aria-expanded={expanded}\n onPress={() => setOpen(expanded ? '' : key)}\n style={styles.trigger}\n >\n <Text style={styles.question}>{guide.question}</Text>\n {expanded ? <ChevronDownIcon size={16} /> : <ChevronRightIcon size={16} />}\n </Pressable>\n {expanded ? (\n <Text selectable style={styles.answer}>\n {guide.answer}\n </Text>\n ) : null}\n </View>\n );\n })}\n </View>\n )}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n panel: { flex: 1, backgroundColor: theme.colors.rail },\n list: { flex: 1 },\n search: { padding: theme.spacing(3), borderBottomWidth: 1, borderBottomColor: theme.colors['border-soft'] },\n empty: { padding: theme.spacing(3) },\n footer: { height: theme.spacing(3) },\n group: { marginHorizontal: theme.spacing(3), marginTop: theme.spacing(5), gap: theme.spacing(1) },\n firstGroup: { marginTop: theme.spacing(3) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n color: theme.colors.hi,\n fontSize: theme.fontSize.lg,\n fontWeight: theme.fontWeight.semibold,\n lineHeight: theme.lineHeight.lg,\n },\n trigger: {\n minHeight: 44,\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingVertical: theme.spacing(2),\n },\n question: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n color: theme.colors.hi,\n fontSize: theme.fontSize.base,\n fontWeight: theme.fontWeight.medium,\n lineHeight: theme.lineHeightRelaxed.base,\n },\n answer: {\n fontFamily: fontOf(theme.fontFamily.sans),\n color: theme.colors.text,\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n paddingBottom: theme.spacing(2),\n },\n separated: { borderTopWidth: 1, borderTopColor: theme.colors['border-soft'] },\n}));\n","import { defineDockFace } from '@agimon-ai/po-core/native';\n\nimport { HelpGuidesFace } from './_components/HelpGuidesPanel.native';\n\nexport default defineDockFace({\n id: 'help',\n label: 'Help',\n order: 50,\n requiredMinorMode: 'help',\n panel: HelpGuidesFace,\n ownsScroll: true,\n});\n","/** README-grounded starter guidance shared by the web and native fills. */\nexport const helpGuides = {\n version: 1,\n label: 'Help',\n guides: [\n {\n id: 'about',\n question: 'What does Help mode do?',\n order: 0,\n answer:\n 'Help adds package guidance and read-only diagnostics for your setup. It does not change configuration or grant extra permissions.',\n keywords: ['setup', 'diagnostics'],\n },\n {\n id: 'toggle',\n question: 'How do I turn Help on or off?',\n order: 1,\n answer:\n 'Use the minor-mode menu, or send /minor help. Help is additive: other tools and modes keep their existing rules.',\n },\n ],\n} satisfies {\n version: 1;\n label: string;\n guides: { id: string; question: string; answer: string; keywords?: string[]; order?: number }[];\n};\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { helpGuides } from './_lib/helpGuides';\n\nexport default defineFill({\n slot: 'help.guides',\n id: 'Help',\n order: 0,\n data: helpGuides,\n});\n","import { defineSlotFile } from '@agimon-ai/po-core/native';\n\nimport { helpGuidesSlot } from '../../../../../types/helpGuides';\n\nexport default defineSlotFile(helpGuidesSlot);\n","/**\n * The help_status and diagnose_setup reports as the card's view models. Both\n * tools return their report as JSON text; a field that is missing or\n * malformed is left out, and output that does not parse keeps its raw lines.\n */\n\n/** How many lines of unparsed output the card shows before \"N more lines\", as the web card does. */\nexport const HELP_PREVIEW_LINES = 12;\n\n/** How many names a capability list shows on expand before \"and N more\". */\nexport const HELP_LIST_LIMIT = 10;\n\nexport type HelpActivation = 'inactive' | 'activating' | 'active' | 'degraded';\n\nexport interface HelpCapabilityRow {\n name: string;\n source?: string;\n active: boolean;\n reason?: string;\n}\n\nexport interface HelpDiagnosticRow {\n code: string;\n source?: string;\n}\n\nexport interface HelpPackageFailureRow {\n packageName: string;\n scope?: string;\n stage?: string;\n reason?: string;\n previous?: string;\n}\n\nexport interface HelpStatusView {\n kind: 'status';\n activation: HelpActivation;\n /** Null while the session is still resolving its skills. */\n skillCount: number | null;\n toolCount?: number;\n skills: HelpCapabilityRow[];\n tools: HelpCapabilityRow[];\n diagnostics: HelpDiagnosticRow[];\n packages: HelpPackageFailureRow[];\n truncated: boolean;\n}\n\nexport interface SetupCheckRow {\n area: string;\n passed: boolean;\n problemCount?: number;\n guidance?: string;\n}\n\nexport interface SetupReportView {\n kind: 'setup';\n passed: boolean;\n majorMode?: string;\n domains: string[];\n profile?: string;\n checks: SetupCheckRow[];\n skipped: string[];\n limitations?: string;\n}\n\nexport interface HelpTextView {\n kind: 'text';\n lines: string[];\n}\n\nexport type HelpToolView = HelpStatusView | SetupReportView | HelpTextView;\n\nexport interface HelpFigure {\n label: string;\n value: string;\n tone: 'text' | 'warning' | 'error';\n}\n\nconst ACTIVATIONS: ReadonlySet<string> = new Set(['inactive', 'activating', 'active', 'degraded']);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n\nconst text = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n\nconst records = (value: unknown): Record<string, unknown>[] => (Array.isArray(value) ? value.filter(isRecord) : []);\n\n/** The tool's output as lines, blank lines dropped, as the web card shows them. */\nexport function helpOutputLines(output: string): string[] {\n return output.split('\\n').filter((line) => line.trim() !== '');\n}\n\nfunction capabilities(value: unknown): HelpCapabilityRow[] {\n return records(value).flatMap((raw) => {\n const name = text(raw.name);\n if (name === undefined) return [];\n const source = text(raw.source);\n const reason = text(raw.reason);\n return [{ name, active: raw.active === true, ...(source ? { source } : {}), ...(reason ? { reason } : {}) }];\n });\n}\n\nfunction parseStatus(raw: Record<string, unknown>): HelpStatusView | null {\n const activation = text(raw.activation);\n if (activation === undefined || !ACTIVATIONS.has(activation)) return null;\n const counts = isRecord(raw.counts) ? raw.counts : {};\n const toolCount = count(counts.tools);\n return {\n kind: 'status',\n activation: activation as HelpActivation,\n skillCount: count(counts.skills) ?? null,\n ...(toolCount === undefined ? {} : { toolCount }),\n skills: capabilities(raw.skills),\n tools: capabilities(raw.tools),\n diagnostics: records(raw.diagnostics).flatMap((entry) => {\n const code = text(entry.code);\n if (code === undefined) return [];\n const source = text(entry.source);\n return [{ code, ...(source ? { source } : {}) }];\n }),\n packages: records(raw.packages).flatMap((entry) => {\n const packageName = text(entry.packageName);\n if (packageName === undefined) return [];\n const fields = { scope: text(entry.scope), stage: text(entry.stage), reason: text(entry.reason) };\n const previous = text(entry.previous);\n return [\n {\n packageName,\n ...Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined)),\n ...(previous && previous !== 'none' ? { previous } : {}),\n },\n ];\n }),\n truncated: raw.truncated === true,\n };\n}\n\nfunction parseSetup(raw: Record<string, unknown>): SetupReportView | null {\n const status = text(raw.status);\n if (status !== 'checks-passed' && status !== 'issues-found') return null;\n const selection = isRecord(raw.appliedSelection) ? raw.appliedSelection : {};\n const majorMode = text(selection.majorMode);\n const profile = text(selection.profile);\n const limitations = text(raw.limitations);\n return {\n kind: 'setup',\n passed: status === 'checks-passed',\n ...(majorMode ? { majorMode } : {}),\n domains: Array.isArray(selection.domains) ? selection.domains.flatMap((value) => text(value) ?? []) : [],\n ...(profile ? { profile } : {}),\n checks: records(raw.checks).flatMap((entry) => {\n const area = text(entry.area);\n if (area === undefined) return [];\n const problemCount = count(entry.problemCount);\n const guidance = text(entry.guidance);\n return [\n {\n area,\n passed: entry.status === 'passed',\n ...(problemCount === undefined ? {} : { problemCount }),\n ...(guidance ? { guidance } : {}),\n },\n ];\n }),\n skipped: Array.isArray(raw.skipped) ? raw.skipped.flatMap((value) => text(value) ?? []) : [],\n ...(limitations ? { limitations } : {}),\n };\n}\n\n/** The report a help diagnostic tool returned, or its raw lines when the output is not a report. */\nexport function helpToolView(output: string): HelpToolView {\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { kind: 'text', lines: helpOutputLines(output) };\n }\n if (isRecord(parsed)) {\n const view = parseStatus(parsed) ?? parseSetup(parsed);\n if (view !== null) return view;\n }\n return { kind: 'text', lines: helpOutputLines(output) };\n}\n\nconst plural = (n: number, word: string) => `${String(n)} ${word}${n === 1 ? '' : 's'}`;\n\n/** The header's primary piece: what the report concluded. */\nexport function helpHeadline(view: HelpStatusView | SetupReportView): string {\n if (view.kind === 'setup') {\n if (view.passed) return 'Checks passed';\n const failed = view.checks.filter((check) => !check.passed).length;\n return failed > 0 ? `${plural(failed, 'area')} failed` : 'Issues found';\n }\n const label: Record<HelpActivation, string> = {\n inactive: 'Help off',\n activating: 'Help activating',\n active: 'Help active',\n degraded: 'Help degraded',\n };\n return label[view.activation];\n}\n\n/** The key figures shown while the card is collapsed. */\nexport function helpFigures(view: HelpStatusView | SetupReportView): HelpFigure[] {\n if (view.kind === 'setup') {\n const failed = view.checks.filter((check) => !check.passed).length;\n return [\n {\n label: 'Checks passed',\n value: `${String(view.checks.length - failed)}/${String(view.checks.length)}`,\n tone: 'text',\n },\n { label: 'Failed', value: String(failed), tone: failed > 0 ? 'error' : 'text' },\n ...(view.skipped.length > 0\n ? [{ label: 'Skipped', value: String(view.skipped.length), tone: 'warning' as const }]\n : []),\n ];\n }\n if (view.activation === 'inactive') return [];\n return [\n { label: 'Skills', value: view.skillCount === null ? 'pending' : String(view.skillCount), tone: 'text' },\n ...(view.toolCount === undefined ? [] : [{ label: 'Tools', value: String(view.toolCount), tone: 'text' as const }]),\n ...(view.diagnostics.length > 0\n ? [{ label: 'Diagnostics', value: String(view.diagnostics.length), tone: 'warning' as const }]\n : []),\n ...(view.packages.length > 0\n ? [{ label: 'Failed packages', value: String(view.packages.length), tone: 'error' as const }]\n : []),\n ];\n}\n\n/** A quiet sentence for the states that have no figures to explain themselves. */\nexport function helpStateNote(view: HelpStatusView): string | undefined {\n if (view.activation === 'inactive') return 'Help mode is off in this session.';\n if (view.activation === 'activating') return 'Skills are counted once the session is ready.';\n return undefined;\n}\n\n/** Whether the card has detail to show on expand. */\nexport function helpHasDetail(view: HelpStatusView | SetupReportView): boolean {\n if (view.kind === 'setup') return view.checks.length > 0 || view.skipped.length > 0 || view.limitations !== undefined;\n return (\n view.skills.length > 0 ||\n view.tools.length > 0 ||\n view.diagnostics.length > 0 ||\n view.packages.length > 0 ||\n view.truncated\n );\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n CheckIcon,\n collapseLines,\n fontOf,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n SectionLabel,\n toolTone,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n HELP_LIST_LIMIT,\n HELP_PREVIEW_LINES,\n type HelpCapabilityRow,\n helpFigures,\n helpHasDetail,\n helpHeadline,\n helpOutputLines,\n helpStateNote,\n type HelpStatusView,\n helpToolView,\n type SetupReportView,\n} from '../_lib/helpStatusView';\n\n/** The web card's summary, kept while there is no report to summarise. */\nconst DEFAULT_SUMMARY = 'Help diagnostics';\n\n/**\n * The help_status and diagnose_setup timeline item on native. The web card\n * prints the tool's JSON as lines; here the report is laid out instead: the\n * outcome in the header, key figures in the body, and the lists on expand.\n * Output that does not parse keeps the web card's raw lines. A failed call\n * shows only its reason in red; the header carries the failure.\n */\nexport function HelpStatusCard({ toolName, output, running, isError }: ToolMessageRenderProps) {\n const tone = toolTone({ running, isError });\n const view = running || isError ? null : helpToolView(output);\n if (view !== null && view.kind !== 'text') return <ReportCard toolName={toolName} tone={tone} view={view} />;\n const lines = view?.lines ?? helpOutputLines(output);\n if (isError) {\n return (\n <MessageItem tone={tone}>\n <MessageItemHeader title={toolName}>{DEFAULT_SUMMARY}</MessageItemHeader>\n {lines.length > 0 ? (\n <MessageItemBody>\n <Text selectable style={[styles.sans, styles.error]}>\n {lines.join('\\n')}\n </Text>\n </MessageItemBody>\n ) : null}\n </MessageItem>\n );\n }\n return (\n <MessageItem tone={tone} expandable={lines.length > HELP_PREVIEW_LINES}>\n {({ expanded }) => {\n const shown = collapseLines(lines, HELP_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={toolName}>{DEFAULT_SUMMARY}</MessageItemHeader>\n {shown.shown.length > 0 || running ? (\n <MessageItemBody>\n {shown.shown.map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={[styles.sans, styles.text]}>\n {line}\n </Text>\n ))}\n {shown.hidden > 0 ? <MessageItemStatus expands>{shown.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">Inspecting this session</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nfunction ReportCard({\n toolName,\n tone,\n view,\n}: {\n toolName: string;\n tone: ReturnType<typeof toolTone>;\n view: HelpStatusView | SetupReportView;\n}) {\n const figures = helpFigures(view);\n const note = view.kind === 'status' ? helpStateNote(view) : undefined;\n return (\n <MessageItem tone={tone} expandable={helpHasDetail(view)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {helpHeadline(view)}\n </Text>\n </View>\n </MessageItemHeader>\n <MessageItemBody testID={`tool-result-${toolName}`} style={styles.body}>\n {note !== undefined ? <Text style={[styles.small, styles.dim]}>{note}</Text> : null}\n {figures.length > 0 ? (\n <View style={styles.figures}>\n {figures.map((figure) => (\n <View key={figure.label} style={styles.figure}>\n <Text numberOfLines={1} style={[styles.small, styles.dim]}>\n {figure.label}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n styles.value,\n figure.tone === 'error' ? styles.error : figure.tone === 'warning' ? styles.warning : styles.hi,\n ]}\n >\n {figure.value}\n </Text>\n </View>\n ))}\n </View>\n ) : null}\n {expanded ? view.kind === 'status' ? <StatusDetail view={view} /> : <SetupDetail view={view} /> : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n\nfunction StatusDetail({ view }: { view: HelpStatusView }) {\n return (\n <>\n {view.packages.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Failed packages</SectionLabel>\n {view.packages.map((entry, index) => (\n <View key={`${entry.packageName}-${String(index)}`} style={styles.entry}>\n <View style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, styles.text, styles.name]}>\n {entry.packageName}\n </Text>\n {entry.stage !== undefined ? (\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.trail]}>\n {entry.stage}\n {entry.scope !== undefined ? ` · ${entry.scope}` : ''}\n </Text>\n ) : null}\n </View>\n {entry.reason !== undefined ? (\n <Text selectable style={[styles.small, styles.error]}>\n {entry.reason}\n </Text>\n ) : null}\n {entry.previous !== undefined ? (\n <Text style={[styles.small, styles.faint]}>Previous build {entry.previous}</Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n {view.diagnostics.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Diagnostics</SectionLabel>\n {view.diagnostics.map((entry, index) => (\n <View key={`${entry.code}-${String(index)}`} style={styles.row}>\n <Badge tone=\"yellow\" size=\"xs\">\n {entry.code}\n </Badge>\n {entry.source !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"head\" style={[styles.mono, styles.dim, styles.trail]}>\n {entry.source}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n <CapabilityList label=\"Skills\" rows={view.skills} />\n <CapabilityList label=\"Tools\" rows={view.tools} />\n {view.truncated ? <Text style={[styles.small, styles.faint]}>The tool capped its lists; more exist.</Text> : null}\n </>\n );\n}\n\nfunction CapabilityList({ label, rows }: { label: string; rows: HelpCapabilityRow[] }) {\n if (rows.length === 0) return null;\n const shown = rows.slice(0, HELP_LIST_LIMIT);\n return (\n <View style={styles.section}>\n <SectionLabel>{label}</SectionLabel>\n {shown.map((row, index) => (\n <View key={`${row.name}-${String(index)}`} style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, row.active ? styles.text : styles.dim, styles.name]}>\n {row.name}\n </Text>\n {!row.active ? (\n <Badge size=\"xs\" style={styles.chip}>\n {row.reason ?? 'inactive'}\n </Badge>\n ) : null}\n {row.source !== undefined ? (\n <Text numberOfLines={1} ellipsizeMode=\"head\" style={[styles.small, styles.faint, styles.trail]}>\n {row.source}\n </Text>\n ) : null}\n </View>\n ))}\n {rows.length > shown.length ? (\n <Text style={[styles.small, styles.faint]}>and {rows.length - shown.length} more</Text>\n ) : null}\n </View>\n );\n}\n\nfunction SetupDetail({ view }: { view: SetupReportView }) {\n const selection = [\n ...(view.majorMode !== undefined ? [`mode ${view.majorMode}`] : []),\n ...view.domains.map((domain) => `domain ${domain}`),\n ...(view.profile !== undefined ? [`profile ${view.profile}`] : []),\n ];\n return (\n <>\n {selection.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Selection</SectionLabel>\n <View style={styles.wrapRow}>\n {selection.map((item) => (\n <Badge key={item} size=\"xs\">\n {item}\n </Badge>\n ))}\n </View>\n </View>\n ) : null}\n {view.checks.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Checks</SectionLabel>\n {view.checks.map((check) => (\n <View key={check.area} style={styles.entry}>\n <View style={styles.row}>\n <Text numberOfLines={1} style={[styles.mono, styles.text, styles.area]}>\n {check.area}\n </Text>\n {check.passed ? (\n <CheckIcon size={14} color=\"green\" />\n ) : (\n <Text numberOfLines={1} style={[styles.small, styles.error, styles.trail]}>\n {check.problemCount === undefined\n ? 'failed'\n : `${String(check.problemCount)} problem${check.problemCount === 1 ? '' : 's'}`}\n </Text>\n )}\n </View>\n {!check.passed && check.guidance !== undefined ? (\n <Text numberOfLines={1} style={[styles.small, styles.faint]}>\n Guide: {check.guidance}\n </Text>\n ) : null}\n </View>\n ))}\n </View>\n ) : null}\n {view.skipped.length > 0 ? (\n <View style={styles.section}>\n <SectionLabel>Skipped</SectionLabel>\n {view.skipped.map((item) => (\n <Text key={item} style={[styles.small, styles.warning]}>\n {item}\n </Text>\n ))}\n </View>\n ) : null}\n {view.limitations !== undefined ? <Text style={[styles.small, styles.faint]}>{view.limitations}</Text> : null}\n </>\n );\n}\n\n/** Numbers line up down a column. */\nconst TABULAR = ['tabular-nums'] as ['tabular-nums'];\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n // The outcome alone: the counts sit in the figures below, so the header carries no second piece to cut.\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5), minWidth: 0 },\n primary: { flexShrink: 0, maxWidth: '70%', color: theme.colors.text },\n body: { gap: theme.spacing(4) },\n section: { gap: theme.spacing(2) },\n entry: { gap: theme.spacing(0.5) },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n wrapRow: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: theme.spacing(2) },\n name: { flexShrink: 1, minWidth: 0 },\n area: { flex: 1, minWidth: 0 },\n chip: { flexShrink: 0 },\n trail: { flex: 1, minWidth: 0, textAlign: 'right' },\n // Two figures a row on a phone, as the diagnose_agent card lays them out.\n figures: { flexDirection: 'row', flexWrap: 'wrap', rowGap: theme.spacing(3) },\n figure: { width: '50%', gap: theme.spacing(0.5), paddingRight: theme.spacing(2) },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n value: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n fontVariant: TABULAR,\n },\n text: { color: theme.colors.text },\n hi: { color: theme.colors.hi },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n warning: { color: theme.colors.yellow },\n error: { color: theme.colors.red },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { HelpStatusCard } from './_components/HelpStatusCard.native';\n\nexport default defineToolRenderer({ tools: ['help_status', 'diagnose_setup'], message: HelpStatusCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport dockHelp from '../src/extensions/workspaces/sessions/(frontend)/dock/help.native';\nimport fillHelp from '../src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.native';\nimport slotGuides from '../src/extensions/workspaces/sessions/(frontend)/slot/guides.native';\nimport toolHelpStatus from '../src/extensions/workspaces/sessions/(frontend)/tool/help-status.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'help',\n session: {\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'help' }, dockHelp)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'help.guides', id: 'help' }, fillHelp)]; },\n get slots(): WebPluginContributions['slots'] { return [via({ slot: 'help.guides' }, slotGuides)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['help_status'] }, toolHelpStatus)]; },\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,165 @@
1
- import { defineLeaderBinding, defineMinorModeFile, defineToolRenderer, defineWebPlugin } from "@agimon-ai/po-core/web";
2
- import { Badge, CheckIcon, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, MessageLines, SectionLabel, collapseLines, toolTone } from "@agimon-ai/po-web-components";
1
+ import { defineDockFace, defineFill, defineLeaderBinding, defineMinorModeFile, defineSlotFile, defineToolRenderer, defineWebPlugin } from "@agimon-ai/po-core/web";
2
+ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Badge, CheckIcon, EmptyState, HelpIcon, Input, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, MessageLines, SectionLabel, collapseLines, toolTone } from "@agimon-ai/po-web-components";
3
+ import { useState } from "react";
3
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/types/helpGuides.ts
6
+ const record = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
7
+ const text$1 = (value, limit) => {
8
+ if (typeof value !== "string") return null;
9
+ const trimmed = value.trim();
10
+ return trimmed.length > 0 && trimmed.length <= limit ? trimmed : null;
11
+ };
12
+ /** Reject the whole fill so the registry can identify the faulty contributor. */
13
+ function parseHelpGuideSet(input) {
14
+ if (!record(input) || input.version !== 1) return null;
15
+ const label = text$1(input.label, 80);
16
+ if (!label || !Array.isArray(input.guides) || input.guides.length > 64) return null;
17
+ const guides = [];
18
+ const ids = /* @__PURE__ */ new Set();
19
+ for (const raw of input.guides) {
20
+ if (!record(raw)) return null;
21
+ const id = text$1(raw.id, 80);
22
+ const question = text$1(raw.question, 240);
23
+ const answer = text$1(raw.answer, 4e3);
24
+ if (!id || !question || !answer || ids.has(id)) return null;
25
+ if (raw.order !== void 0 && (typeof raw.order !== "number" || !Number.isFinite(raw.order))) return null;
26
+ let keywords;
27
+ if (raw.keywords !== void 0) {
28
+ if (!Array.isArray(raw.keywords) || raw.keywords.length > 16) return null;
29
+ keywords = [];
30
+ for (const keyword of raw.keywords) {
31
+ const parsed = text$1(keyword, 64);
32
+ if (!parsed) return null;
33
+ keywords.push(parsed);
34
+ }
35
+ }
36
+ ids.add(id);
37
+ guides.push({
38
+ id,
39
+ question,
40
+ answer,
41
+ ...keywords === void 0 ? {} : { keywords },
42
+ ...raw.order === void 0 ? {} : { order: raw.order }
43
+ });
44
+ }
45
+ return {
46
+ version: 1,
47
+ label,
48
+ guides
49
+ };
50
+ }
51
+ const helpGuidesSlot = {
52
+ slot: "help.guides",
53
+ parse: parseHelpGuideSet
54
+ };
55
+ //#endregion
56
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/_lib/helpGuidesView.ts
57
+ /** Preserve registry group order; sort and filter guides without mutating contributions. */
58
+ function helpGuidesView(fills, query) {
59
+ const tokens = query.toLowerCase().trim().split(/\s+/).filter(Boolean);
60
+ return fills.flatMap((fill) => {
61
+ const guides = fill.data.guides.filter((guide) => {
62
+ const searchable = [
63
+ fill.data.label,
64
+ guide.question,
65
+ guide.answer,
66
+ ...guide.keywords ?? []
67
+ ].join(" ").toLowerCase();
68
+ return tokens.every((token) => searchable.includes(token));
69
+ }).sort((a, b) => (a.order ?? 0) - (b.order ?? 0) || a.question.localeCompare(b.question));
70
+ return guides.length ? [{
71
+ ...fill,
72
+ data: {
73
+ ...fill.data,
74
+ guides
75
+ }
76
+ }] : [];
77
+ });
78
+ }
79
+ //#endregion
80
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/_components/HelpGuidesPanel.tsx
81
+ function HelpGuidesFace(props) {
82
+ return /* @__PURE__ */ jsx(HelpGuidesPanel, { fills: props.slotData(helpGuidesSlot) }, props.sessionId);
83
+ }
84
+ function HelpGuidesPanel({ fills, initialQuery = "", initialExpanded }) {
85
+ const [query, setQuery] = useState(initialQuery);
86
+ const groups = helpGuidesView(fills, query);
87
+ const hasGuides = fills.some((fill) => fill.data.guides.length);
88
+ return /* @__PURE__ */ jsxs("div", {
89
+ className: "flex h-full min-h-0 w-full flex-col bg-po-rail text-po-text font-sans",
90
+ children: [/* @__PURE__ */ jsx("div", {
91
+ className: "border-b border-po-border-soft p-3",
92
+ children: /* @__PURE__ */ jsx(Input, {
93
+ "aria-label": "Search help",
94
+ placeholder: "Search help",
95
+ type: "search",
96
+ value: query,
97
+ onChange: (event) => setQuery(event.target.value),
98
+ className: "w-full placeholder:text-po-dim"
99
+ })
100
+ }), /* @__PURE__ */ jsx("div", {
101
+ className: "min-h-0 flex-1 overflow-y-auto p-3",
102
+ children: groups.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {
103
+ title: hasGuides ? "No matching guides" : "No help guides yet",
104
+ description: hasGuides ? "Try a different word or a package name." : "Guides from this session’s plugins will appear here."
105
+ }) : /* @__PURE__ */ jsx("div", {
106
+ className: "flex flex-col gap-5",
107
+ children: groups.map((group) => /* @__PURE__ */ jsxs("section", { children: [/* @__PURE__ */ jsx("h2", {
108
+ className: "mb-1 text-lg font-semibold text-po-hi break-words",
109
+ children: group.data.label
110
+ }), /* @__PURE__ */ jsx(Accordion, {
111
+ type: "single",
112
+ collapsible: true,
113
+ defaultValue: initialExpanded?.[0] === group.pluginId && initialExpanded[1] === group.id ? initialExpanded[2] : void 0,
114
+ children: group.data.guides.map((guide) => /* @__PURE__ */ jsxs(AccordionItem, {
115
+ value: guide.id,
116
+ children: [/* @__PURE__ */ jsx(AccordionTrigger, {
117
+ className: "text-base font-medium leading-relaxed break-words",
118
+ children: guide.question
119
+ }), /* @__PURE__ */ jsx(AccordionContent, {
120
+ className: "whitespace-pre-wrap break-words text-base leading-relaxed text-po-text",
121
+ children: guide.answer
122
+ })]
123
+ }, guide.id))
124
+ })] }, JSON.stringify([group.pluginId, group.id])))
125
+ })
126
+ })]
127
+ });
128
+ }
129
+ //#endregion
130
+ //#region src/extensions/workspaces/sessions/(frontend)/dock/help.web.tsx
131
+ var help_web_default = defineDockFace({
132
+ id: "help",
133
+ label: "Help",
134
+ icon: HelpIcon,
135
+ order: 50,
136
+ requiredMinorMode: "help",
137
+ panel: HelpGuidesFace
138
+ });
139
+ //#endregion
140
+ //#region src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.web.ts
141
+ var Help_help_guides_web_default = defineFill({
142
+ slot: "help.guides",
143
+ id: "Help",
144
+ order: 0,
145
+ data: {
146
+ version: 1,
147
+ label: "Help",
148
+ guides: [{
149
+ id: "about",
150
+ question: "What does Help mode do?",
151
+ order: 0,
152
+ answer: "Help adds package guidance and read-only diagnostics for your setup. It does not change configuration or grant extra permissions.",
153
+ keywords: ["setup", "diagnostics"]
154
+ }, {
155
+ id: "toggle",
156
+ question: "How do I turn Help on or off?",
157
+ order: 1,
158
+ answer: "Use the minor-mode menu, or send /minor help. Help is additive: other tools and modes keep their existing rules."
159
+ }]
160
+ }
161
+ });
162
+ //#endregion
4
163
  //#region src/extensions/workspaces/sessions/(frontend)/leader/toggle.web.ts
5
164
  var toggle_web_default = defineLeaderBinding({
6
165
  path: [{
@@ -21,6 +180,9 @@ var mode_web_default = defineMinorModeFile({
21
180
  order: 10
22
181
  });
23
182
  //#endregion
183
+ //#region src/extensions/workspaces/sessions/(frontend)/slot/guides.web.ts
184
+ var guides_web_default = defineSlotFile(helpGuidesSlot);
185
+ //#endregion
24
186
  //#region src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts
25
187
  const ACTIVATIONS = /* @__PURE__ */ new Set([
26
188
  "inactive",
@@ -484,12 +646,24 @@ const via = (identity, value) => value === void 0 ? void 0 : {
484
646
  const webPlugin = defineWebPlugin({
485
647
  id: "help",
486
648
  session: {
649
+ get dockFaces() {
650
+ return [via({ id: "help" }, help_web_default)];
651
+ },
652
+ get fills() {
653
+ return [via({
654
+ slot: "help.guides",
655
+ id: "help"
656
+ }, Help_help_guides_web_default)];
657
+ },
487
658
  get leaderBindings() {
488
659
  return [via({ id: "help.toggle" }, toggle_web_default)];
489
660
  },
490
661
  get minorModes() {
491
662
  return [via({ name: "help" }, mode_web_default)];
492
663
  },
664
+ get slots() {
665
+ return [via({ slot: "help.guides" }, guides_web_default)];
666
+ },
493
667
  get toolRenderers() {
494
668
  return [via({ tools: ["help_status"] }, help_status_web_default)];
495
669
  }
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","names":["leaderToggle","modeHelp","toolHelpStatus"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/leader/toggle.web.ts","../../src/extensions/workspaces/sessions/(frontend)/mode/help/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/HelpStatusCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/help-status.web.tsx","../../generated/web.ts"],"sourcesContent":["import { defineLeaderBinding } from '@agimon-ai/po-core/web';\n\nexport default defineLeaderBinding({\n path: [\n { key: 'h', label: 'help', detail: 'package docs and logs' },\n { key: 'e', label: 'toggle', detail: 'load or hide package Help' },\n ],\n command: 'minor help',\n});\n","import { defineMinorModeFile } from '@agimon-ai/po-core/web';\n\nexport default defineMinorModeFile({ keys: 'h e', order: 10 });\n","/**\n * The help_status and diagnose_setup reports as the card's view models. Both\n * tools return their report as JSON text; a field that is missing or\n * malformed is left out, and output that does not parse keeps its raw lines.\n */\n\n/** How many lines of unparsed output the card shows before \"N more lines\", as the web card does. */\nexport const HELP_PREVIEW_LINES = 12;\n\n/** How many names a capability list shows on expand before \"and N more\". */\nexport const HELP_LIST_LIMIT = 10;\n\nexport type HelpActivation = 'inactive' | 'activating' | 'active' | 'degraded';\n\nexport interface HelpCapabilityRow {\n name: string;\n source?: string;\n active: boolean;\n reason?: string;\n}\n\nexport interface HelpDiagnosticRow {\n code: string;\n source?: string;\n}\n\nexport interface HelpPackageFailureRow {\n packageName: string;\n scope?: string;\n stage?: string;\n reason?: string;\n previous?: string;\n}\n\nexport interface HelpStatusView {\n kind: 'status';\n activation: HelpActivation;\n /** Null while the session is still resolving its skills. */\n skillCount: number | null;\n toolCount?: number;\n skills: HelpCapabilityRow[];\n tools: HelpCapabilityRow[];\n diagnostics: HelpDiagnosticRow[];\n packages: HelpPackageFailureRow[];\n truncated: boolean;\n}\n\nexport interface SetupCheckRow {\n area: string;\n passed: boolean;\n problemCount?: number;\n guidance?: string;\n}\n\nexport interface SetupReportView {\n kind: 'setup';\n passed: boolean;\n majorMode?: string;\n domains: string[];\n profile?: string;\n checks: SetupCheckRow[];\n skipped: string[];\n limitations?: string;\n}\n\nexport interface HelpTextView {\n kind: 'text';\n lines: string[];\n}\n\nexport type HelpToolView = HelpStatusView | SetupReportView | HelpTextView;\n\nexport interface HelpFigure {\n label: string;\n value: string;\n tone: 'text' | 'warning' | 'error';\n}\n\nconst ACTIVATIONS: ReadonlySet<string> = new Set(['inactive', 'activating', 'active', 'degraded']);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n\nconst text = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n\nconst records = (value: unknown): Record<string, unknown>[] => (Array.isArray(value) ? value.filter(isRecord) : []);\n\n/** The tool's output as lines, blank lines dropped, as the web card shows them. */\nexport function helpOutputLines(output: string): string[] {\n return output.split('\\n').filter((line) => line.trim() !== '');\n}\n\nfunction capabilities(value: unknown): HelpCapabilityRow[] {\n return records(value).flatMap((raw) => {\n const name = text(raw.name);\n if (name === undefined) return [];\n const source = text(raw.source);\n const reason = text(raw.reason);\n return [{ name, active: raw.active === true, ...(source ? { source } : {}), ...(reason ? { reason } : {}) }];\n });\n}\n\nfunction parseStatus(raw: Record<string, unknown>): HelpStatusView | null {\n const activation = text(raw.activation);\n if (activation === undefined || !ACTIVATIONS.has(activation)) return null;\n const counts = isRecord(raw.counts) ? raw.counts : {};\n const toolCount = count(counts.tools);\n return {\n kind: 'status',\n activation: activation as HelpActivation,\n skillCount: count(counts.skills) ?? null,\n ...(toolCount === undefined ? {} : { toolCount }),\n skills: capabilities(raw.skills),\n tools: capabilities(raw.tools),\n diagnostics: records(raw.diagnostics).flatMap((entry) => {\n const code = text(entry.code);\n if (code === undefined) return [];\n const source = text(entry.source);\n return [{ code, ...(source ? { source } : {}) }];\n }),\n packages: records(raw.packages).flatMap((entry) => {\n const packageName = text(entry.packageName);\n if (packageName === undefined) return [];\n const fields = { scope: text(entry.scope), stage: text(entry.stage), reason: text(entry.reason) };\n const previous = text(entry.previous);\n return [\n {\n packageName,\n ...Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined)),\n ...(previous && previous !== 'none' ? { previous } : {}),\n },\n ];\n }),\n truncated: raw.truncated === true,\n };\n}\n\nfunction parseSetup(raw: Record<string, unknown>): SetupReportView | null {\n const status = text(raw.status);\n if (status !== 'checks-passed' && status !== 'issues-found') return null;\n const selection = isRecord(raw.appliedSelection) ? raw.appliedSelection : {};\n const majorMode = text(selection.majorMode);\n const profile = text(selection.profile);\n const limitations = text(raw.limitations);\n return {\n kind: 'setup',\n passed: status === 'checks-passed',\n ...(majorMode ? { majorMode } : {}),\n domains: Array.isArray(selection.domains) ? selection.domains.flatMap((value) => text(value) ?? []) : [],\n ...(profile ? { profile } : {}),\n checks: records(raw.checks).flatMap((entry) => {\n const area = text(entry.area);\n if (area === undefined) return [];\n const problemCount = count(entry.problemCount);\n const guidance = text(entry.guidance);\n return [\n {\n area,\n passed: entry.status === 'passed',\n ...(problemCount === undefined ? {} : { problemCount }),\n ...(guidance ? { guidance } : {}),\n },\n ];\n }),\n skipped: Array.isArray(raw.skipped) ? raw.skipped.flatMap((value) => text(value) ?? []) : [],\n ...(limitations ? { limitations } : {}),\n };\n}\n\n/** The report a help diagnostic tool returned, or its raw lines when the output is not a report. */\nexport function helpToolView(output: string): HelpToolView {\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { kind: 'text', lines: helpOutputLines(output) };\n }\n if (isRecord(parsed)) {\n const view = parseStatus(parsed) ?? parseSetup(parsed);\n if (view !== null) return view;\n }\n return { kind: 'text', lines: helpOutputLines(output) };\n}\n\nconst plural = (n: number, word: string) => `${String(n)} ${word}${n === 1 ? '' : 's'}`;\n\n/** The header's primary piece: what the report concluded. */\nexport function helpHeadline(view: HelpStatusView | SetupReportView): string {\n if (view.kind === 'setup') {\n if (view.passed) return 'Checks passed';\n const failed = view.checks.filter((check) => !check.passed).length;\n return failed > 0 ? `${plural(failed, 'area')} failed` : 'Issues found';\n }\n const label: Record<HelpActivation, string> = {\n inactive: 'Help off',\n activating: 'Help activating',\n active: 'Help active',\n degraded: 'Help degraded',\n };\n return label[view.activation];\n}\n\n/** The key figures shown while the card is collapsed. */\nexport function helpFigures(view: HelpStatusView | SetupReportView): HelpFigure[] {\n if (view.kind === 'setup') {\n const failed = view.checks.filter((check) => !check.passed).length;\n return [\n {\n label: 'Checks passed',\n value: `${String(view.checks.length - failed)}/${String(view.checks.length)}`,\n tone: 'text',\n },\n { label: 'Failed', value: String(failed), tone: failed > 0 ? 'error' : 'text' },\n ...(view.skipped.length > 0\n ? [{ label: 'Skipped', value: String(view.skipped.length), tone: 'warning' as const }]\n : []),\n ];\n }\n if (view.activation === 'inactive') return [];\n return [\n { label: 'Skills', value: view.skillCount === null ? 'pending' : String(view.skillCount), tone: 'text' },\n ...(view.toolCount === undefined ? [] : [{ label: 'Tools', value: String(view.toolCount), tone: 'text' as const }]),\n ...(view.diagnostics.length > 0\n ? [{ label: 'Diagnostics', value: String(view.diagnostics.length), tone: 'warning' as const }]\n : []),\n ...(view.packages.length > 0\n ? [{ label: 'Failed packages', value: String(view.packages.length), tone: 'error' as const }]\n : []),\n ];\n}\n\n/** A quiet sentence for the states that have no figures to explain themselves. */\nexport function helpStateNote(view: HelpStatusView): string | undefined {\n if (view.activation === 'inactive') return 'Help mode is off in this session.';\n if (view.activation === 'activating') return 'Skills are counted once the session is ready.';\n return undefined;\n}\n\n/** Whether the card has detail to show on expand. */\nexport function helpHasDetail(view: HelpStatusView | SetupReportView): boolean {\n if (view.kind === 'setup') return view.checks.length > 0 || view.skipped.length > 0 || view.limitations !== undefined;\n return (\n view.skills.length > 0 ||\n view.tools.length > 0 ||\n view.diagnostics.length > 0 ||\n view.packages.length > 0 ||\n view.truncated\n );\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n Badge,\n CheckIcon,\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n SectionLabel,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n HELP_LIST_LIMIT,\n HELP_PREVIEW_LINES,\n type HelpCapabilityRow,\n type HelpFigure,\n helpFigures,\n helpHasDetail,\n helpHeadline,\n helpOutputLines,\n helpStateNote,\n type HelpStatusView,\n helpToolView,\n type SetupReportView,\n} from '../_lib/helpStatusView';\n\n/** The summary kept while there is no report to summarise. */\nconst DEFAULT_SUMMARY = 'Help diagnostics';\n\nconst FIGURE_TONE: Record<HelpFigure['tone'], string> = {\n text: 'truncate text-lg font-semibold tabular-nums text-po-hi',\n warning: 'truncate text-lg font-semibold tabular-nums text-po-yellow',\n error: 'truncate text-lg font-semibold tabular-nums text-po-red',\n};\n\n/**\n * The help_status and diagnose_setup timeline item. The report is laid out\n * from the shared view model the native card uses: the outcome in the\n * header, key figures in the body, and the lists on expand. Output that does\n * not parse keeps its raw lines. A failed call shows only its reason in red;\n * the header carries the failure.\n */\nexport function HelpStatusCard({ toolName, output, running, isError }: ToolMessageRenderProps) {\n const tone = toolTone({ running, isError });\n const view = running || isError ? null : helpToolView(output);\n if (view !== null && view.kind !== 'text') return <ReportCard toolName={toolName} tone={tone} view={view} />;\n const lines = view?.lines ?? helpOutputLines(output);\n if (isError) {\n return (\n <MessageItem tone={tone}>\n <MessageItemHeader title={toolName}>\n <span className=\"min-w-0 truncate text-po-faint\">{DEFAULT_SUMMARY}</span>\n </MessageItemHeader>\n {lines.length > 0 ? (\n <MessageItemBody>\n <p className=\"whitespace-pre-wrap break-words text-po-red\">{lines.join('\\n')}</p>\n </MessageItemBody>\n ) : null}\n </MessageItem>\n );\n }\n const rows = lines.map((line) => ({ text: line, tone: 'text' as const }));\n return (\n <MessageItem tone={tone} expandable={rows.length > HELP_PREVIEW_LINES}>\n {({ expanded }) => {\n const shown = collapseLines(rows, HELP_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span className=\"min-w-0 truncate text-po-faint\">{DEFAULT_SUMMARY}</span>\n </MessageItemHeader>\n {shown.shown.length > 0 || running ? (\n <MessageItemBody>\n <MessageLines lines={shown.shown} />\n {shown.hidden > 0 ? <MessageItemStatus expands>{shown.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">Inspecting this session</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nfunction ReportCard({\n toolName,\n tone,\n view,\n}: {\n toolName: string;\n tone: ReturnType<typeof toolTone>;\n view: HelpStatusView | SetupReportView;\n}) {\n const figures = helpFigures(view);\n const note = view.kind === 'status' ? helpStateNote(view) : undefined;\n return (\n <MessageItem tone={tone} expandable={helpHasDetail(view)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"max-w-[70%] shrink-0 truncate text-po-text\">\n {helpHeadline(view)}\n </span>\n </MessageItemHeader>\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-4\">\n {note !== undefined ? <p className=\"text-sm text-po-dim\">{note}</p> : null}\n {figures.length > 0 ? (\n <dl className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n {figures.map((figure) => (\n <div key={figure.label} className=\"flex min-w-0 flex-col gap-0.5\">\n <dt className=\"truncate text-sm text-po-dim\">{figure.label}</dt>\n <dd className={FIGURE_TONE[figure.tone]}>{figure.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {expanded ? view.kind === 'status' ? <StatusDetail view={view} /> : <SetupDetail view={view} /> : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n\nfunction StatusDetail({ view }: { view: HelpStatusView }) {\n return (\n <>\n {view.packages.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Failed packages</SectionLabel>\n {view.packages.map((entry, index) => (\n <div key={`${entry.packageName}-${String(index)}`} className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <span className=\"min-w-0 shrink truncate font-mono text-sm text-po-text\">{entry.packageName}</span>\n {entry.stage !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right text-sm text-po-faint\">\n {entry.stage}\n {entry.scope !== undefined ? ` · ${entry.scope}` : ''}\n </span>\n ) : null}\n </div>\n {entry.reason !== undefined ? <p className=\"break-words text-sm text-po-red\">{entry.reason}</p> : null}\n {entry.previous !== undefined ? (\n <p className=\"text-sm text-po-faint\">Previous build {entry.previous}</p>\n ) : null}\n </div>\n ))}\n </section>\n ) : null}\n {view.diagnostics.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Diagnostics</SectionLabel>\n {view.diagnostics.map((entry, index) => (\n <div key={`${entry.code}-${String(index)}`} className=\"flex min-w-0 items-center gap-2\">\n <Badge tone=\"yellow\" size=\"xs\" className=\"shrink-0 font-mono\">\n {entry.code}\n </Badge>\n {entry.source !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right font-mono text-sm text-po-dim\">{entry.source}</span>\n ) : null}\n </div>\n ))}\n </section>\n ) : null}\n <CapabilityList label=\"Skills\" rows={view.skills} />\n <CapabilityList label=\"Tools\" rows={view.tools} />\n {view.truncated ? <p className=\"text-sm text-po-faint\">The tool capped its lists; more exist.</p> : null}\n </>\n );\n}\n\nfunction CapabilityList({ label, rows }: { label: string; rows: HelpCapabilityRow[] }) {\n if (rows.length === 0) return null;\n const shown = rows.slice(0, HELP_LIST_LIMIT);\n return (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>{label}</SectionLabel>\n <ul className=\"grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2\">\n {shown.map((row, index) => (\n <li key={`${row.name}-${String(index)}`} className=\"flex min-w-0 items-center gap-2\">\n <span\n className={\n row.active\n ? 'min-w-0 shrink truncate font-mono text-sm text-po-text'\n : 'min-w-0 shrink truncate font-mono text-sm text-po-dim'\n }\n >\n {row.name}\n </span>\n {!row.active ? (\n <Badge size=\"xs\" className=\"shrink-0\">\n {row.reason ?? 'inactive'}\n </Badge>\n ) : null}\n {row.source !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right text-sm text-po-faint\">{row.source}</span>\n ) : null}\n </li>\n ))}\n </ul>\n {rows.length > shown.length ? (\n <p className=\"text-sm text-po-faint\">and {rows.length - shown.length} more</p>\n ) : null}\n </section>\n );\n}\n\nfunction SetupDetail({ view }: { view: SetupReportView }) {\n const selection = [\n ...(view.majorMode !== undefined ? [`mode ${view.majorMode}`] : []),\n ...view.domains.map((domain) => `domain ${domain}`),\n ...(view.profile !== undefined ? [`profile ${view.profile}`] : []),\n ];\n return (\n <>\n {selection.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Selection</SectionLabel>\n <div className=\"flex flex-wrap items-center gap-2\">\n {selection.map((item) => (\n <Badge key={item} size=\"xs\">\n {item}\n </Badge>\n ))}\n </div>\n </section>\n ) : null}\n {view.checks.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Checks</SectionLabel>\n <ul className=\"grid grid-cols-1 gap-x-6 gap-y-2 sm:grid-cols-2\">\n {view.checks.map((check) => (\n <li key={check.area} className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-po-text\">{check.area}</span>\n {check.passed ? (\n <CheckIcon aria-label=\"passed\" className=\"size-3.5 shrink-0 text-po-green\" />\n ) : (\n <span className=\"shrink-0 text-sm text-po-red\">\n {check.problemCount === undefined\n ? 'failed'\n : `${String(check.problemCount)} problem${check.problemCount === 1 ? '' : 's'}`}\n </span>\n )}\n </div>\n {!check.passed && check.guidance !== undefined ? (\n <span className=\"truncate text-sm text-po-faint\">Guide: {check.guidance}</span>\n ) : null}\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n {view.skipped.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Skipped</SectionLabel>\n {view.skipped.map((item) => (\n <p key={item} className=\"text-sm text-po-yellow\">\n {item}\n </p>\n ))}\n </section>\n ) : null}\n {view.limitations !== undefined ? <p className=\"text-sm text-po-faint\">{view.limitations}</p> : null}\n </>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport { HelpStatusCard } from './_components/HelpStatusCard';\n\nexport default defineToolRenderer({ tools: ['help_status', 'diagnose_setup'], message: HelpStatusCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport leaderToggle from '../src/extensions/workspaces/sessions/(frontend)/leader/toggle.web';\nimport modeHelp from '../src/extensions/workspaces/sessions/(frontend)/mode/help/mode.web';\nimport toolHelpStatus from '../src/extensions/workspaces/sessions/(frontend)/tool/help-status.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'help',\n session: {\n get leaderBindings(): WebPluginContributions['leaderBindings'] { return [via({ id: 'help.toggle' }, leaderToggle)]; },\n get minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'help' }, modeHelp)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['help_status'] }, toolHelpStatus)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"web.mjs","names":["text","dockHelp","fillHelp","leaderToggle","modeHelp","slotGuides","toolHelpStatus"],"sources":["../../src/types/helpGuides.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_lib/helpGuidesView.ts","../../src/extensions/workspaces/sessions/(frontend)/dock/_components/HelpGuidesPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/dock/help.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/_lib/helpGuides.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.web.ts","../../src/extensions/workspaces/sessions/(frontend)/leader/toggle.web.ts","../../src/extensions/workspaces/sessions/(frontend)/mode/help/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/slot/guides.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/helpStatusView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/HelpStatusCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/help-status.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { SlotDeclaration } from '@agimon-ai/po-core/web';\n\nexport interface HelpGuide {\n id: string;\n question: string;\n // ponytail: v1 answers are plain text; add shared Markdown rendering only when a guide needs rich content.\n answer: string;\n keywords?: string[];\n order?: number;\n}\n\nexport interface HelpGuideSet {\n version: 1;\n label: string;\n guides: HelpGuide[];\n}\n\nconst record = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst text = (value: unknown, limit: number): string | null => {\n if (typeof value !== 'string') return null;\n const trimmed = value.trim();\n return trimmed.length > 0 && trimmed.length <= limit ? trimmed : null;\n};\n\n/** Reject the whole fill so the registry can identify the faulty contributor. */\nexport function parseHelpGuideSet(input: unknown): HelpGuideSet | null {\n if (!record(input) || input.version !== 1) return null;\n const label = text(input.label, 80);\n if (!label || !Array.isArray(input.guides) || input.guides.length > 64) return null;\n const guides: HelpGuide[] = [];\n const ids = new Set<string>();\n for (const raw of input.guides) {\n if (!record(raw)) return null;\n const id = text(raw.id, 80);\n const question = text(raw.question, 240);\n const answer = text(raw.answer, 4000);\n if (!id || !question || !answer || ids.has(id)) return null;\n if (raw.order !== undefined && (typeof raw.order !== 'number' || !Number.isFinite(raw.order))) return null;\n let keywords: string[] | undefined;\n if (raw.keywords !== undefined) {\n if (!Array.isArray(raw.keywords) || raw.keywords.length > 16) return null;\n keywords = [];\n for (const keyword of raw.keywords) {\n const parsed = text(keyword, 64);\n if (!parsed) return null;\n keywords.push(parsed);\n }\n }\n ids.add(id);\n guides.push({\n id,\n question,\n answer,\n ...(keywords === undefined ? {} : { keywords }),\n ...(raw.order === undefined ? {} : { order: raw.order as number }),\n });\n }\n return { version: 1, label, guides };\n}\n\nexport const helpGuidesSlot: SlotDeclaration<HelpGuideSet> = {\n slot: 'help.guides',\n parse: parseHelpGuideSet,\n};\n","import type { SlotDataFill } from '@agimon-ai/po-core/web';\n\nimport type { HelpGuideSet } from '../../../../../../types/helpGuides';\n\n/** Preserve registry group order; sort and filter guides without mutating contributions. */\nexport function helpGuidesView(fills: readonly SlotDataFill<HelpGuideSet>[], query: string) {\n const tokens = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n return fills.flatMap((fill) => {\n const guides = fill.data.guides\n .filter((guide) => {\n const searchable = [fill.data.label, guide.question, guide.answer, ...(guide.keywords ?? [])]\n .join(' ')\n .toLowerCase();\n return tokens.every((token) => searchable.includes(token));\n })\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0) || a.question.localeCompare(b.question));\n return guides.length ? [{ ...fill, data: { ...fill.data, guides } }] : [];\n });\n}\n","import type { SlotDataFill, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n EmptyState,\n Input,\n} from '@agimon-ai/po-web-components';\nimport { useState } from 'react';\n\nimport { helpGuidesSlot, type HelpGuideSet } from '../../../../../../types/helpGuides';\nimport { helpGuidesView } from '../_lib/helpGuidesView';\n\nexport function HelpGuidesFace(props: WebPluginSlotProps) {\n return <HelpGuidesPanel key={props.sessionId} fills={props.slotData(helpGuidesSlot)} />;\n}\n\nexport function HelpGuidesPanel({\n fills,\n initialQuery = '',\n initialExpanded,\n}: {\n fills: readonly SlotDataFill<HelpGuideSet>[];\n initialQuery?: string;\n initialExpanded?: readonly [string, string, string];\n}) {\n const [query, setQuery] = useState(initialQuery);\n const groups = helpGuidesView(fills, query);\n const hasGuides = fills.some((fill) => fill.data.guides.length);\n return (\n <div className=\"flex h-full min-h-0 w-full flex-col bg-po-rail text-po-text font-sans\">\n <div className=\"border-b border-po-border-soft p-3\">\n <Input\n aria-label=\"Search help\"\n placeholder=\"Search help\"\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n className=\"w-full placeholder:text-po-dim\"\n />\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-3\">\n {groups.length === 0 ? (\n <EmptyState\n title={hasGuides ? 'No matching guides' : 'No help guides yet'}\n description={\n hasGuides\n ? 'Try a different word or a package name.'\n : 'Guides from this session’s plugins will appear here.'\n }\n />\n ) : (\n <div className=\"flex flex-col gap-5\">\n {groups.map((group) => (\n <section key={JSON.stringify([group.pluginId, group.id])}>\n <h2 className=\"mb-1 text-lg font-semibold text-po-hi break-words\">{group.data.label}</h2>\n <Accordion\n type=\"single\"\n collapsible\n defaultValue={\n initialExpanded?.[0] === group.pluginId && initialExpanded[1] === group.id\n ? initialExpanded[2]\n : undefined\n }\n >\n {group.data.guides.map((guide) => (\n <AccordionItem key={guide.id} value={guide.id}>\n <AccordionTrigger className=\"text-base font-medium leading-relaxed break-words\">\n {guide.question}\n </AccordionTrigger>\n <AccordionContent className=\"whitespace-pre-wrap break-words text-base leading-relaxed text-po-text\">\n {guide.answer}\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </section>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { defineDockFace } from '@agimon-ai/po-core/web';\nimport { HelpIcon } from '@agimon-ai/po-web-components';\n\nimport { HelpGuidesFace } from './_components/HelpGuidesPanel';\n\nexport default defineDockFace({\n id: 'help',\n label: 'Help',\n icon: HelpIcon,\n order: 50,\n requiredMinorMode: 'help',\n panel: HelpGuidesFace,\n});\n","/** README-grounded starter guidance shared by the web and native fills. */\nexport const helpGuides = {\n version: 1,\n label: 'Help',\n guides: [\n {\n id: 'about',\n question: 'What does Help mode do?',\n order: 0,\n answer:\n 'Help adds package guidance and read-only diagnostics for your setup. It does not change configuration or grant extra permissions.',\n keywords: ['setup', 'diagnostics'],\n },\n {\n id: 'toggle',\n question: 'How do I turn Help on or off?',\n order: 1,\n answer:\n 'Use the minor-mode menu, or send /minor help. Help is additive: other tools and modes keep their existing rules.',\n },\n ],\n} satisfies {\n version: 1;\n label: string;\n guides: { id: string; question: string; answer: string; keywords?: string[]; order?: number }[];\n};\n","import { defineFill } from '@agimon-ai/po-core/web';\n\nimport { helpGuides } from './_lib/helpGuides';\n\nexport default defineFill({\n slot: 'help.guides',\n id: 'Help',\n order: 0,\n data: helpGuides,\n});\n","import { defineLeaderBinding } from '@agimon-ai/po-core/web';\n\nexport default defineLeaderBinding({\n path: [\n { key: 'h', label: 'help', detail: 'package docs and logs' },\n { key: 'e', label: 'toggle', detail: 'load or hide package Help' },\n ],\n command: 'minor help',\n});\n","import { defineMinorModeFile } from '@agimon-ai/po-core/web';\n\nexport default defineMinorModeFile({ keys: 'h e', order: 10 });\n","import { defineSlotFile } from '@agimon-ai/po-core/web';\n\nimport { helpGuidesSlot } from '../../../../../types/helpGuides';\n\nexport default defineSlotFile(helpGuidesSlot);\n","/**\n * The help_status and diagnose_setup reports as the card's view models. Both\n * tools return their report as JSON text; a field that is missing or\n * malformed is left out, and output that does not parse keeps its raw lines.\n */\n\n/** How many lines of unparsed output the card shows before \"N more lines\", as the web card does. */\nexport const HELP_PREVIEW_LINES = 12;\n\n/** How many names a capability list shows on expand before \"and N more\". */\nexport const HELP_LIST_LIMIT = 10;\n\nexport type HelpActivation = 'inactive' | 'activating' | 'active' | 'degraded';\n\nexport interface HelpCapabilityRow {\n name: string;\n source?: string;\n active: boolean;\n reason?: string;\n}\n\nexport interface HelpDiagnosticRow {\n code: string;\n source?: string;\n}\n\nexport interface HelpPackageFailureRow {\n packageName: string;\n scope?: string;\n stage?: string;\n reason?: string;\n previous?: string;\n}\n\nexport interface HelpStatusView {\n kind: 'status';\n activation: HelpActivation;\n /** Null while the session is still resolving its skills. */\n skillCount: number | null;\n toolCount?: number;\n skills: HelpCapabilityRow[];\n tools: HelpCapabilityRow[];\n diagnostics: HelpDiagnosticRow[];\n packages: HelpPackageFailureRow[];\n truncated: boolean;\n}\n\nexport interface SetupCheckRow {\n area: string;\n passed: boolean;\n problemCount?: number;\n guidance?: string;\n}\n\nexport interface SetupReportView {\n kind: 'setup';\n passed: boolean;\n majorMode?: string;\n domains: string[];\n profile?: string;\n checks: SetupCheckRow[];\n skipped: string[];\n limitations?: string;\n}\n\nexport interface HelpTextView {\n kind: 'text';\n lines: string[];\n}\n\nexport type HelpToolView = HelpStatusView | SetupReportView | HelpTextView;\n\nexport interface HelpFigure {\n label: string;\n value: string;\n tone: 'text' | 'warning' | 'error';\n}\n\nconst ACTIVATIONS: ReadonlySet<string> = new Set(['inactive', 'activating', 'active', 'degraded']);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : undefined;\n\nconst text = (value: unknown): string | undefined =>\n typeof value === 'string' && value.trim() !== '' ? value.trim() : undefined;\n\nconst records = (value: unknown): Record<string, unknown>[] => (Array.isArray(value) ? value.filter(isRecord) : []);\n\n/** The tool's output as lines, blank lines dropped, as the web card shows them. */\nexport function helpOutputLines(output: string): string[] {\n return output.split('\\n').filter((line) => line.trim() !== '');\n}\n\nfunction capabilities(value: unknown): HelpCapabilityRow[] {\n return records(value).flatMap((raw) => {\n const name = text(raw.name);\n if (name === undefined) return [];\n const source = text(raw.source);\n const reason = text(raw.reason);\n return [{ name, active: raw.active === true, ...(source ? { source } : {}), ...(reason ? { reason } : {}) }];\n });\n}\n\nfunction parseStatus(raw: Record<string, unknown>): HelpStatusView | null {\n const activation = text(raw.activation);\n if (activation === undefined || !ACTIVATIONS.has(activation)) return null;\n const counts = isRecord(raw.counts) ? raw.counts : {};\n const toolCount = count(counts.tools);\n return {\n kind: 'status',\n activation: activation as HelpActivation,\n skillCount: count(counts.skills) ?? null,\n ...(toolCount === undefined ? {} : { toolCount }),\n skills: capabilities(raw.skills),\n tools: capabilities(raw.tools),\n diagnostics: records(raw.diagnostics).flatMap((entry) => {\n const code = text(entry.code);\n if (code === undefined) return [];\n const source = text(entry.source);\n return [{ code, ...(source ? { source } : {}) }];\n }),\n packages: records(raw.packages).flatMap((entry) => {\n const packageName = text(entry.packageName);\n if (packageName === undefined) return [];\n const fields = { scope: text(entry.scope), stage: text(entry.stage), reason: text(entry.reason) };\n const previous = text(entry.previous);\n return [\n {\n packageName,\n ...Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined)),\n ...(previous && previous !== 'none' ? { previous } : {}),\n },\n ];\n }),\n truncated: raw.truncated === true,\n };\n}\n\nfunction parseSetup(raw: Record<string, unknown>): SetupReportView | null {\n const status = text(raw.status);\n if (status !== 'checks-passed' && status !== 'issues-found') return null;\n const selection = isRecord(raw.appliedSelection) ? raw.appliedSelection : {};\n const majorMode = text(selection.majorMode);\n const profile = text(selection.profile);\n const limitations = text(raw.limitations);\n return {\n kind: 'setup',\n passed: status === 'checks-passed',\n ...(majorMode ? { majorMode } : {}),\n domains: Array.isArray(selection.domains) ? selection.domains.flatMap((value) => text(value) ?? []) : [],\n ...(profile ? { profile } : {}),\n checks: records(raw.checks).flatMap((entry) => {\n const area = text(entry.area);\n if (area === undefined) return [];\n const problemCount = count(entry.problemCount);\n const guidance = text(entry.guidance);\n return [\n {\n area,\n passed: entry.status === 'passed',\n ...(problemCount === undefined ? {} : { problemCount }),\n ...(guidance ? { guidance } : {}),\n },\n ];\n }),\n skipped: Array.isArray(raw.skipped) ? raw.skipped.flatMap((value) => text(value) ?? []) : [],\n ...(limitations ? { limitations } : {}),\n };\n}\n\n/** The report a help diagnostic tool returned, or its raw lines when the output is not a report. */\nexport function helpToolView(output: string): HelpToolView {\n let parsed: unknown;\n try {\n parsed = JSON.parse(output);\n } catch {\n return { kind: 'text', lines: helpOutputLines(output) };\n }\n if (isRecord(parsed)) {\n const view = parseStatus(parsed) ?? parseSetup(parsed);\n if (view !== null) return view;\n }\n return { kind: 'text', lines: helpOutputLines(output) };\n}\n\nconst plural = (n: number, word: string) => `${String(n)} ${word}${n === 1 ? '' : 's'}`;\n\n/** The header's primary piece: what the report concluded. */\nexport function helpHeadline(view: HelpStatusView | SetupReportView): string {\n if (view.kind === 'setup') {\n if (view.passed) return 'Checks passed';\n const failed = view.checks.filter((check) => !check.passed).length;\n return failed > 0 ? `${plural(failed, 'area')} failed` : 'Issues found';\n }\n const label: Record<HelpActivation, string> = {\n inactive: 'Help off',\n activating: 'Help activating',\n active: 'Help active',\n degraded: 'Help degraded',\n };\n return label[view.activation];\n}\n\n/** The key figures shown while the card is collapsed. */\nexport function helpFigures(view: HelpStatusView | SetupReportView): HelpFigure[] {\n if (view.kind === 'setup') {\n const failed = view.checks.filter((check) => !check.passed).length;\n return [\n {\n label: 'Checks passed',\n value: `${String(view.checks.length - failed)}/${String(view.checks.length)}`,\n tone: 'text',\n },\n { label: 'Failed', value: String(failed), tone: failed > 0 ? 'error' : 'text' },\n ...(view.skipped.length > 0\n ? [{ label: 'Skipped', value: String(view.skipped.length), tone: 'warning' as const }]\n : []),\n ];\n }\n if (view.activation === 'inactive') return [];\n return [\n { label: 'Skills', value: view.skillCount === null ? 'pending' : String(view.skillCount), tone: 'text' },\n ...(view.toolCount === undefined ? [] : [{ label: 'Tools', value: String(view.toolCount), tone: 'text' as const }]),\n ...(view.diagnostics.length > 0\n ? [{ label: 'Diagnostics', value: String(view.diagnostics.length), tone: 'warning' as const }]\n : []),\n ...(view.packages.length > 0\n ? [{ label: 'Failed packages', value: String(view.packages.length), tone: 'error' as const }]\n : []),\n ];\n}\n\n/** A quiet sentence for the states that have no figures to explain themselves. */\nexport function helpStateNote(view: HelpStatusView): string | undefined {\n if (view.activation === 'inactive') return 'Help mode is off in this session.';\n if (view.activation === 'activating') return 'Skills are counted once the session is ready.';\n return undefined;\n}\n\n/** Whether the card has detail to show on expand. */\nexport function helpHasDetail(view: HelpStatusView | SetupReportView): boolean {\n if (view.kind === 'setup') return view.checks.length > 0 || view.skipped.length > 0 || view.limitations !== undefined;\n return (\n view.skills.length > 0 ||\n view.tools.length > 0 ||\n view.diagnostics.length > 0 ||\n view.packages.length > 0 ||\n view.truncated\n );\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n Badge,\n CheckIcon,\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n SectionLabel,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n HELP_LIST_LIMIT,\n HELP_PREVIEW_LINES,\n type HelpCapabilityRow,\n type HelpFigure,\n helpFigures,\n helpHasDetail,\n helpHeadline,\n helpOutputLines,\n helpStateNote,\n type HelpStatusView,\n helpToolView,\n type SetupReportView,\n} from '../_lib/helpStatusView';\n\n/** The summary kept while there is no report to summarise. */\nconst DEFAULT_SUMMARY = 'Help diagnostics';\n\nconst FIGURE_TONE: Record<HelpFigure['tone'], string> = {\n text: 'truncate text-lg font-semibold tabular-nums text-po-hi',\n warning: 'truncate text-lg font-semibold tabular-nums text-po-yellow',\n error: 'truncate text-lg font-semibold tabular-nums text-po-red',\n};\n\n/**\n * The help_status and diagnose_setup timeline item. The report is laid out\n * from the shared view model the native card uses: the outcome in the\n * header, key figures in the body, and the lists on expand. Output that does\n * not parse keeps its raw lines. A failed call shows only its reason in red;\n * the header carries the failure.\n */\nexport function HelpStatusCard({ toolName, output, running, isError }: ToolMessageRenderProps) {\n const tone = toolTone({ running, isError });\n const view = running || isError ? null : helpToolView(output);\n if (view !== null && view.kind !== 'text') return <ReportCard toolName={toolName} tone={tone} view={view} />;\n const lines = view?.lines ?? helpOutputLines(output);\n if (isError) {\n return (\n <MessageItem tone={tone}>\n <MessageItemHeader title={toolName}>\n <span className=\"min-w-0 truncate text-po-faint\">{DEFAULT_SUMMARY}</span>\n </MessageItemHeader>\n {lines.length > 0 ? (\n <MessageItemBody>\n <p className=\"whitespace-pre-wrap break-words text-po-red\">{lines.join('\\n')}</p>\n </MessageItemBody>\n ) : null}\n </MessageItem>\n );\n }\n const rows = lines.map((line) => ({ text: line, tone: 'text' as const }));\n return (\n <MessageItem tone={tone} expandable={rows.length > HELP_PREVIEW_LINES}>\n {({ expanded }) => {\n const shown = collapseLines(rows, HELP_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span className=\"min-w-0 truncate text-po-faint\">{DEFAULT_SUMMARY}</span>\n </MessageItemHeader>\n {shown.shown.length > 0 || running ? (\n <MessageItemBody>\n <MessageLines lines={shown.shown} />\n {shown.hidden > 0 ? <MessageItemStatus expands>{shown.hidden} more lines</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">Inspecting this session</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\nfunction ReportCard({\n toolName,\n tone,\n view,\n}: {\n toolName: string;\n tone: ReturnType<typeof toolTone>;\n view: HelpStatusView | SetupReportView;\n}) {\n const figures = helpFigures(view);\n const note = view.kind === 'status' ? helpStateNote(view) : undefined;\n return (\n <MessageItem tone={tone} expandable={helpHasDetail(view)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"max-w-[70%] shrink-0 truncate text-po-text\">\n {helpHeadline(view)}\n </span>\n </MessageItemHeader>\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-4\">\n {note !== undefined ? <p className=\"text-sm text-po-dim\">{note}</p> : null}\n {figures.length > 0 ? (\n <dl className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n {figures.map((figure) => (\n <div key={figure.label} className=\"flex min-w-0 flex-col gap-0.5\">\n <dt className=\"truncate text-sm text-po-dim\">{figure.label}</dt>\n <dd className={FIGURE_TONE[figure.tone]}>{figure.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {expanded ? view.kind === 'status' ? <StatusDetail view={view} /> : <SetupDetail view={view} /> : null}\n </MessageItemBody>\n </>\n )}\n </MessageItem>\n );\n}\n\nfunction StatusDetail({ view }: { view: HelpStatusView }) {\n return (\n <>\n {view.packages.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Failed packages</SectionLabel>\n {view.packages.map((entry, index) => (\n <div key={`${entry.packageName}-${String(index)}`} className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex min-w-0 items-baseline gap-2\">\n <span className=\"min-w-0 shrink truncate font-mono text-sm text-po-text\">{entry.packageName}</span>\n {entry.stage !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right text-sm text-po-faint\">\n {entry.stage}\n {entry.scope !== undefined ? ` · ${entry.scope}` : ''}\n </span>\n ) : null}\n </div>\n {entry.reason !== undefined ? <p className=\"break-words text-sm text-po-red\">{entry.reason}</p> : null}\n {entry.previous !== undefined ? (\n <p className=\"text-sm text-po-faint\">Previous build {entry.previous}</p>\n ) : null}\n </div>\n ))}\n </section>\n ) : null}\n {view.diagnostics.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Diagnostics</SectionLabel>\n {view.diagnostics.map((entry, index) => (\n <div key={`${entry.code}-${String(index)}`} className=\"flex min-w-0 items-center gap-2\">\n <Badge tone=\"yellow\" size=\"xs\" className=\"shrink-0 font-mono\">\n {entry.code}\n </Badge>\n {entry.source !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right font-mono text-sm text-po-dim\">{entry.source}</span>\n ) : null}\n </div>\n ))}\n </section>\n ) : null}\n <CapabilityList label=\"Skills\" rows={view.skills} />\n <CapabilityList label=\"Tools\" rows={view.tools} />\n {view.truncated ? <p className=\"text-sm text-po-faint\">The tool capped its lists; more exist.</p> : null}\n </>\n );\n}\n\nfunction CapabilityList({ label, rows }: { label: string; rows: HelpCapabilityRow[] }) {\n if (rows.length === 0) return null;\n const shown = rows.slice(0, HELP_LIST_LIMIT);\n return (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>{label}</SectionLabel>\n <ul className=\"grid grid-cols-1 gap-x-6 gap-y-1 sm:grid-cols-2\">\n {shown.map((row, index) => (\n <li key={`${row.name}-${String(index)}`} className=\"flex min-w-0 items-center gap-2\">\n <span\n className={\n row.active\n ? 'min-w-0 shrink truncate font-mono text-sm text-po-text'\n : 'min-w-0 shrink truncate font-mono text-sm text-po-dim'\n }\n >\n {row.name}\n </span>\n {!row.active ? (\n <Badge size=\"xs\" className=\"shrink-0\">\n {row.reason ?? 'inactive'}\n </Badge>\n ) : null}\n {row.source !== undefined ? (\n <span className=\"min-w-0 flex-1 truncate text-right text-sm text-po-faint\">{row.source}</span>\n ) : null}\n </li>\n ))}\n </ul>\n {rows.length > shown.length ? (\n <p className=\"text-sm text-po-faint\">and {rows.length - shown.length} more</p>\n ) : null}\n </section>\n );\n}\n\nfunction SetupDetail({ view }: { view: SetupReportView }) {\n const selection = [\n ...(view.majorMode !== undefined ? [`mode ${view.majorMode}`] : []),\n ...view.domains.map((domain) => `domain ${domain}`),\n ...(view.profile !== undefined ? [`profile ${view.profile}`] : []),\n ];\n return (\n <>\n {selection.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Selection</SectionLabel>\n <div className=\"flex flex-wrap items-center gap-2\">\n {selection.map((item) => (\n <Badge key={item} size=\"xs\">\n {item}\n </Badge>\n ))}\n </div>\n </section>\n ) : null}\n {view.checks.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Checks</SectionLabel>\n <ul className=\"grid grid-cols-1 gap-x-6 gap-y-2 sm:grid-cols-2\">\n {view.checks.map((check) => (\n <li key={check.area} className=\"flex min-w-0 flex-col gap-0.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"min-w-0 flex-1 truncate font-mono text-sm text-po-text\">{check.area}</span>\n {check.passed ? (\n <CheckIcon aria-label=\"passed\" className=\"size-3.5 shrink-0 text-po-green\" />\n ) : (\n <span className=\"shrink-0 text-sm text-po-red\">\n {check.problemCount === undefined\n ? 'failed'\n : `${String(check.problemCount)} problem${check.problemCount === 1 ? '' : 's'}`}\n </span>\n )}\n </div>\n {!check.passed && check.guidance !== undefined ? (\n <span className=\"truncate text-sm text-po-faint\">Guide: {check.guidance}</span>\n ) : null}\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n {view.skipped.length > 0 ? (\n <section className=\"flex flex-col gap-2\">\n <SectionLabel>Skipped</SectionLabel>\n {view.skipped.map((item) => (\n <p key={item} className=\"text-sm text-po-yellow\">\n {item}\n </p>\n ))}\n </section>\n ) : null}\n {view.limitations !== undefined ? <p className=\"text-sm text-po-faint\">{view.limitations}</p> : null}\n </>\n );\n}\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport { HelpStatusCard } from './_components/HelpStatusCard';\n\nexport default defineToolRenderer({ tools: ['help_status', 'diagnose_setup'], message: HelpStatusCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport dockHelp from '../src/extensions/workspaces/sessions/(frontend)/dock/help.web';\nimport fillHelp from '../src/extensions/workspaces/sessions/(frontend)/fill/Help.help.guides.web';\nimport leaderToggle from '../src/extensions/workspaces/sessions/(frontend)/leader/toggle.web';\nimport modeHelp from '../src/extensions/workspaces/sessions/(frontend)/mode/help/mode.web';\nimport slotGuides from '../src/extensions/workspaces/sessions/(frontend)/slot/guides.web';\nimport toolHelpStatus from '../src/extensions/workspaces/sessions/(frontend)/tool/help-status.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'help',\n session: {\n get dockFaces(): WebPluginContributions['dockFaces'] { return [via({ id: 'help' }, dockHelp)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'help.guides', id: 'help' }, fillHelp)]; },\n get leaderBindings(): WebPluginContributions['leaderBindings'] { return [via({ id: 'help.toggle' }, leaderToggle)]; },\n get minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'help' }, modeHelp)]; },\n get slots(): WebPluginContributions['slots'] { return [via({ slot: 'help.guides' }, slotGuides)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['help_status'] }, toolHelpStatus)]; },\n },\n});\n"],"mappings":";;;;;AAiBA,MAAM,UAAU,UACd,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,MAAMA,UAAQ,OAAgB,UAAiC;CAC7D,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,MAAM,UAAU,MAAM,KAAK;CAC3B,OAAO,QAAQ,SAAS,KAAK,QAAQ,UAAU,QAAQ,UAAU;AACnE;;AAGA,SAAgB,kBAAkB,OAAqC;CACrE,IAAI,CAAC,OAAO,KAAK,KAAK,MAAM,YAAY,GAAG,OAAO;CAClD,MAAM,QAAQA,OAAK,MAAM,OAAO,EAAE;CAClC,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,MAAM,KAAK,MAAM,OAAO,SAAS,IAAI,OAAO;CAC/E,MAAM,SAAsB,CAAC;CAC7B,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,OAAO,MAAM,QAAQ;EAC9B,IAAI,CAAC,OAAO,GAAG,GAAG,OAAO;EACzB,MAAM,KAAKA,OAAK,IAAI,IAAI,EAAE;EAC1B,MAAM,WAAWA,OAAK,IAAI,UAAU,GAAG;EACvC,MAAM,SAASA,OAAK,IAAI,QAAQ,GAAI;EACpC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,IAAI,IAAI,EAAE,GAAG,OAAO;EACvD,IAAI,IAAI,UAAU,KAAA,MAAc,OAAO,IAAI,UAAU,YAAY,CAAC,OAAO,SAAS,IAAI,KAAK,IAAI,OAAO;EACtG,IAAI;EACJ,IAAI,IAAI,aAAa,KAAA,GAAW;GAC9B,IAAI,CAAC,MAAM,QAAQ,IAAI,QAAQ,KAAK,IAAI,SAAS,SAAS,IAAI,OAAO;GACrE,WAAW,CAAC;GACZ,KAAK,MAAM,WAAW,IAAI,UAAU;IAClC,MAAM,SAASA,OAAK,SAAS,EAAE;IAC/B,IAAI,CAAC,QAAQ,OAAO;IACpB,SAAS,KAAK,MAAM;GACtB;EACF;EACA,IAAI,IAAI,EAAE;EACV,OAAO,KAAK;GACV;GACA;GACA;GACA,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;GAC7C,GAAI,IAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,IAAI,MAAgB;EAClE,CAAC;CACH;CACA,OAAO;EAAE,SAAS;EAAG;EAAO;CAAO;AACrC;AAEA,MAAa,iBAAgD;CAC3D,MAAM;CACN,OAAO;AACT;;;;AC5DA,SAAgB,eAAe,OAA8C,OAAe;CAC1F,MAAM,SAAS,MAAM,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO;CACrE,OAAO,MAAM,SAAS,SAAS;EAC7B,MAAM,SAAS,KAAK,KAAK,OACtB,QAAQ,UAAU;GACjB,MAAM,aAAa;IAAC,KAAK,KAAK;IAAO,MAAM;IAAU,MAAM;IAAQ,GAAI,MAAM,YAAY,CAAC;GAAE,CAAC,CAC1F,KAAK,GAAG,CAAC,CACT,YAAY;GACf,OAAO,OAAO,OAAO,UAAU,WAAW,SAAS,KAAK,CAAC;EAC3D,CAAC,CAAC,CACD,MAAM,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;EACzF,OAAO,OAAO,SAAS,CAAC;GAAE,GAAG;GAAM,MAAM;IAAE,GAAG,KAAK;IAAM;GAAO;EAAE,CAAC,IAAI,CAAC;CAC1E,CAAC;AACH;;;ACJA,SAAgB,eAAe,OAA2B;CACxD,OAAO,oBAAC,iBAAD,EAAuC,OAAO,MAAM,SAAS,cAAc,EAAI,GAAzD,MAAM,SAAmD;AACxF;AAEA,SAAgB,gBAAgB,EAC9B,OACA,eAAe,IACf,mBAKC;CACD,MAAM,CAAC,OAAO,YAAY,SAAS,YAAY;CAC/C,MAAM,SAAS,eAAe,OAAO,KAAK;CAC1C,MAAM,YAAY,MAAM,MAAM,SAAS,KAAK,KAAK,OAAO,MAAM;CAC9D,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,OAAD;GAAK,WAAU;GACb,UAAA,oBAAC,OAAD;IACE,cAAW;IACX,aAAY;IACZ,MAAK;IACL,OAAO;IACP,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;IAChD,WAAU;GACX,CAAA;EACE,CAAA,GACL,oBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,OAAO,WAAW,IACjB,oBAAC,YAAD;IACE,OAAO,YAAY,uBAAuB;IAC1C,aACE,YACI,4CACA;GAEP,CAAA,IAED,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,OAAO,KAAK,UACX,qBAAC,WAAD,EAAA,UAAA,CACE,oBAAC,MAAD;KAAI,WAAU;KAAqD,UAAA,MAAM,KAAK;IAAU,CAAA,GACxF,oBAAC,WAAD;KACE,MAAK;KACL,aAAA;KACA,cACE,kBAAkB,OAAO,MAAM,YAAY,gBAAgB,OAAO,MAAM,KACpE,gBAAgB,KAChB,KAAA;KAGL,UAAA,MAAM,KAAK,OAAO,KAAK,UACtB,qBAAC,eAAD;MAA8B,OAAO,MAAM;MAA3C,UAAA,CACE,oBAAC,kBAAD;OAAkB,WAAU;OACzB,UAAA,MAAM;MACS,CAAA,GAClB,oBAAC,kBAAD;OAAkB,WAAU;OACzB,UAAA,MAAM;MACS,CAAA,CACL;KAPK,GAAA,MAAM,EAOX,CAChB;IACQ,CAAA,CACJ,EAAA,GAtBK,KAAK,UAAU,CAAC,MAAM,UAAU,MAAM,EAAE,CAAC,CAsB9C,CACV;GACE,CAAA;EAEJ,CAAA,CACF;;AAET;;;AC/EA,IAAA,mBAAe,eAAe;CAC5B,IAAI;CACJ,OAAO;CACP,MAAM;CACN,OAAO;CACP,mBAAmB;CACnB,OAAO;AACT,CAAC;;;AERD,IAAA,+BAAe,WAAW;CACxB,MAAM;CACN,IAAI;CACJ,OAAO;CACP,MAAM;EDNN,SAAS;EACT,OAAO;EACP,QAAQ,CACN;GACE,IAAI;GACJ,UAAU;GACV,OAAO;GACP,QACE;GACF,UAAU,CAAC,SAAS,aAAa;EACnC,GACA;GACE,IAAI;GACJ,UAAU;GACV,OAAO;GACP,QACE;EACJ,CACF;CCZM;AACR,CAAC;;;ACPD,IAAA,qBAAe,oBAAoB;CACjC,MAAM,CACJ;EAAE,KAAK;EAAK,OAAO;EAAQ,QAAQ;CAAwB,GAC3D;EAAE,KAAK;EAAK,OAAO;EAAU,QAAQ;CAA4B,CACnE;CACA,SAAS;AACX,CAAC;;;ACND,IAAA,mBAAe,oBAAoB;CAAE,MAAM;CAAO,OAAO;AAAG,CAAC;;;ACE7D,IAAA,qBAAe,eAAe,cAAc;;;AC0E5C,MAAM,8BAAmC,IAAI,IAAI;CAAC;CAAY;CAAc;CAAU;AAAU,CAAC;AAEjG,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,MAAM,SAAS,UACb,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAA;AAE/E,MAAM,QAAQ,UACZ,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,KAAA;AAEpE,MAAM,WAAW,UAA+C,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,QAAQ,IAAI,CAAC;;AAGjH,SAAgB,gBAAgB,QAA0B;CACxD,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC,QAAQ,SAAS,KAAK,KAAK,MAAM,EAAE;AAC/D;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,QAAQ;EACrC,MAAM,OAAO,KAAK,IAAI,IAAI;EAC1B,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;EAChC,MAAM,SAAS,KAAK,IAAI,MAAM;EAC9B,MAAM,SAAS,KAAK,IAAI,MAAM;EAC9B,OAAO,CAAC;GAAE;GAAM,QAAQ,IAAI,WAAW;GAAM,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;GAAI,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAAG,CAAC;CAC7G,CAAC;AACH;AAEA,SAAS,YAAY,KAAqD;CACxE,MAAM,aAAa,KAAK,IAAI,UAAU;CACtC,IAAI,eAAe,KAAA,KAAa,CAAC,YAAY,IAAI,UAAU,GAAG,OAAO;CACrE,MAAM,SAAS,SAAS,IAAI,MAAM,IAAI,IAAI,SAAS,CAAC;CACpD,MAAM,YAAY,MAAM,OAAO,KAAK;CACpC,OAAO;EACL,MAAM;EACM;EACZ,YAAY,MAAM,OAAO,MAAM,KAAK;EACpC,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;EAC/C,QAAQ,aAAa,IAAI,MAAM;EAC/B,OAAO,aAAa,IAAI,KAAK;EAC7B,aAAa,QAAQ,IAAI,WAAW,CAAC,CAAC,SAAS,UAAU;GACvD,MAAM,OAAO,KAAK,MAAM,IAAI;GAC5B,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;GAChC,MAAM,SAAS,KAAK,MAAM,MAAM;GAChC,OAAO,CAAC;IAAE;IAAM,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;GAAG,CAAC;EACjD,CAAC;EACD,UAAU,QAAQ,IAAI,QAAQ,CAAC,CAAC,SAAS,UAAU;GACjD,MAAM,cAAc,KAAK,MAAM,WAAW;GAC1C,IAAI,gBAAgB,KAAA,GAAW,OAAO,CAAC;GACvC,MAAM,SAAS;IAAE,OAAO,KAAK,MAAM,KAAK;IAAG,OAAO,KAAK,MAAM,KAAK;IAAG,QAAQ,KAAK,MAAM,MAAM;GAAE;GAChG,MAAM,WAAW,KAAK,MAAM,QAAQ;GACpC,OAAO,CACL;IACE;IACA,GAAG,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,CAAC,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CAAC;IACvF,GAAI,YAAY,aAAa,SAAS,EAAE,SAAS,IAAI,CAAC;GACxD,CACF;EACF,CAAC;EACD,WAAW,IAAI,cAAc;CAC/B;AACF;AAEA,SAAS,WAAW,KAAsD;CACxE,MAAM,SAAS,KAAK,IAAI,MAAM;CAC9B,IAAI,WAAW,mBAAmB,WAAW,gBAAgB,OAAO;CACpE,MAAM,YAAY,SAAS,IAAI,gBAAgB,IAAI,IAAI,mBAAmB,CAAC;CAC3E,MAAM,YAAY,KAAK,UAAU,SAAS;CAC1C,MAAM,UAAU,KAAK,UAAU,OAAO;CACtC,MAAM,cAAc,KAAK,IAAI,WAAW;CACxC,OAAO;EACL,MAAM;EACN,QAAQ,WAAW;EACnB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;EACjC,SAAS,MAAM,QAAQ,UAAU,OAAO,IAAI,UAAU,QAAQ,SAAS,UAAU,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC;EACvG,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC7B,QAAQ,QAAQ,IAAI,MAAM,CAAC,CAAC,SAAS,UAAU;GAC7C,MAAM,OAAO,KAAK,MAAM,IAAI;GAC5B,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;GAChC,MAAM,eAAe,MAAM,MAAM,YAAY;GAC7C,MAAM,WAAW,KAAK,MAAM,QAAQ;GACpC,OAAO,CACL;IACE;IACA,QAAQ,MAAM,WAAW;IACzB,GAAI,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa;IACrD,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GACjC,CACF;EACF,CAAC;EACD,SAAS,MAAM,QAAQ,IAAI,OAAO,IAAI,IAAI,QAAQ,SAAS,UAAU,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC;EAC3F,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;CACvC;AACF;;AAGA,SAAgB,aAAa,QAA8B;CACzD,IAAI;CACJ,IAAI;EACF,SAAS,KAAK,MAAM,MAAM;CAC5B,QAAQ;EACN,OAAO;GAAE,MAAM;GAAQ,OAAO,gBAAgB,MAAM;EAAE;CACxD;CACA,IAAI,SAAS,MAAM,GAAG;EACpB,MAAM,OAAO,YAAY,MAAM,KAAK,WAAW,MAAM;EACrD,IAAI,SAAS,MAAM,OAAO;CAC5B;CACA,OAAO;EAAE,MAAM;EAAQ,OAAO,gBAAgB,MAAM;CAAE;AACxD;AAEA,MAAM,UAAU,GAAW,SAAiB,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,MAAM,IAAI,KAAK;;AAGlF,SAAgB,aAAa,MAAgD;CAC3E,IAAI,KAAK,SAAS,SAAS;EACzB,IAAI,KAAK,QAAQ,OAAO;EACxB,MAAM,SAAS,KAAK,OAAO,QAAQ,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;EAC5D,OAAO,SAAS,IAAI,GAAG,OAAO,QAAQ,MAAM,EAAE,WAAW;CAC3D;CAOA,OAAO;EALL,UAAU;EACV,YAAY;EACZ,QAAQ;EACR,UAAU;CAED,EAAE,KAAK;AACpB;;AAGA,SAAgB,YAAY,MAAsD;CAChF,IAAI,KAAK,SAAS,SAAS;EACzB,MAAM,SAAS,KAAK,OAAO,QAAQ,UAAU,CAAC,MAAM,MAAM,CAAC,CAAC;EAC5D,OAAO;GACL;IACE,OAAO;IACP,OAAO,GAAG,OAAO,KAAK,OAAO,SAAS,MAAM,EAAE,GAAG,OAAO,KAAK,OAAO,MAAM;IAC1E,MAAM;GACR;GACA;IAAE,OAAO;IAAU,OAAO,OAAO,MAAM;IAAG,MAAM,SAAS,IAAI,UAAU;GAAO;GAC9E,GAAI,KAAK,QAAQ,SAAS,IACtB,CAAC;IAAE,OAAO;IAAW,OAAO,OAAO,KAAK,QAAQ,MAAM;IAAG,MAAM;GAAmB,CAAC,IACnF,CAAC;EACP;CACF;CACA,IAAI,KAAK,eAAe,YAAY,OAAO,CAAC;CAC5C,OAAO;EACL;GAAE,OAAO;GAAU,OAAO,KAAK,eAAe,OAAO,YAAY,OAAO,KAAK,UAAU;GAAG,MAAM;EAAO;EACvG,GAAI,KAAK,cAAc,KAAA,IAAY,CAAC,IAAI,CAAC;GAAE,OAAO;GAAS,OAAO,OAAO,KAAK,SAAS;GAAG,MAAM;EAAgB,CAAC;EACjH,GAAI,KAAK,YAAY,SAAS,IAC1B,CAAC;GAAE,OAAO;GAAe,OAAO,OAAO,KAAK,YAAY,MAAM;GAAG,MAAM;EAAmB,CAAC,IAC3F,CAAC;EACL,GAAI,KAAK,SAAS,SAAS,IACvB,CAAC;GAAE,OAAO;GAAmB,OAAO,OAAO,KAAK,SAAS,MAAM;GAAG,MAAM;EAAiB,CAAC,IAC1F,CAAC;CACP;AACF;;AAGA,SAAgB,cAAc,MAA0C;CACtE,IAAI,KAAK,eAAe,YAAY,OAAO;CAC3C,IAAI,KAAK,eAAe,cAAc,OAAO;AAE/C;;AAGA,SAAgB,cAAc,MAAiD;CAC7E,IAAI,KAAK,SAAS,SAAS,OAAO,KAAK,OAAO,SAAS,KAAK,KAAK,QAAQ,SAAS,KAAK,KAAK,gBAAgB,KAAA;CAC5G,OACE,KAAK,OAAO,SAAS,KACrB,KAAK,MAAM,SAAS,KACpB,KAAK,YAAY,SAAS,KAC1B,KAAK,SAAS,SAAS,KACvB,KAAK;AAET;;;;AC9NA,MAAM,kBAAkB;AAExB,MAAM,cAAkD;CACtD,MAAM;CACN,SAAS;CACT,OAAO;AACT;;;;;;;;AASA,SAAgB,eAAe,EAAE,UAAU,QAAQ,SAAS,WAAmC;CAC7F,MAAM,OAAO,SAAS;EAAE;EAAS;CAAQ,CAAC;CAC1C,MAAM,OAAO,WAAW,UAAU,OAAO,aAAa,MAAM;CAC5D,IAAI,SAAS,QAAQ,KAAK,SAAS,QAAQ,OAAO,oBAAC,YAAD;EAAsB;EAAgB;EAAY;CAAO,CAAA;CAC3G,MAAM,QAAQ,MAAM,SAAS,gBAAgB,MAAM;CACnD,IAAI,SACF,OACE,qBAAC,aAAD;EAAmB;EAAnB,UAAA,CACE,oBAAC,mBAAD;GAAmB,OAAO;GACxB,UAAA,oBAAC,QAAD;IAAM,WAAU;IAAkC,UAAA;GAAsB,CAAA;EACvD,CAAA,GAClB,MAAM,SAAS,IACd,oBAAC,iBAAD,EAAA,UACE,oBAAC,KAAD;GAAG,WAAU;GAA+C,UAAA,MAAM,KAAK,IAAI;EAAK,CAAA,EACjE,CAAA,IACf,IACO;;CAGjB,MAAM,OAAO,MAAM,KAAK,UAAU;EAAE,MAAM;EAAM,MAAM;CAAgB,EAAE;CACxE,OACE,oBAAC,aAAD;EAAmB;EAAM,YAAY,KAAK,SAAA;EACtC,WAAA,EAAE,eAAe;GACjB,MAAM,QAAQ,cAAc,MAAA,IAA0B,QAAQ;GAC9D,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,mBAAD;IAAmB,OAAO;IACxB,UAAA,oBAAC,QAAD;KAAM,WAAU;KAAkC,UAAA;IAAsB,CAAA;GACvD,CAAA,GAClB,MAAM,MAAM,SAAS,KAAK,UACzB,qBAAC,iBAAD,EAAA,UAAA;IACE,oBAAC,cAAD,EAAc,OAAO,MAAM,MAAQ,CAAA;IAClC,MAAM,SAAS,IAAI,qBAAC,mBAAD;KAAmB,SAAA;KAAnB,UAAA,CAA4B,MAAM,QAAO,aAA8B;IAAI,CAAA,IAAA;IAC9F,UAAU,oBAAC,mBAAD;KAAmB,MAAK;KAAU,UAAA;IAA0C,CAAA,IAAI;GAC5E,EAAA,CAAA,IACf,IACJ,EAAA,CAAA;EAEN;CACW,CAAA;AAEjB;AAEA,SAAS,WAAW,EAClB,UACA,MACA,QAKC;CACD,MAAM,UAAU,YAAY,IAAI;CAChC,MAAM,OAAO,KAAK,SAAS,WAAW,cAAc,IAAI,IAAI,KAAA;CAC5D,OACE,oBAAC,aAAD;EAAmB;EAAM,YAAY,cAAc,IAAI;EACnD,WAAA,EAAE,eACF,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,mBAAD;GAAmB,OAAO;GACxB,UAAA,oBAAC,QAAD;IAAM,eAAa,aAAa;IAAY,WAAU;IACnD,UAAA,aAAa,IAAI;GACd,CAAA;EACW,CAAA,GACnB,qBAAC,iBAAD;GAAiB,eAAa,eAAe;GAAY,WAAU;GAAnE,UAAA;IACG,SAAS,KAAA,IAAY,oBAAC,KAAD;KAAG,WAAU;KAAuB,UAAA;IAAQ,CAAA,IAAI;IACrE,QAAQ,SAAS,IAChB,oBAAC,MAAD;KAAI,WAAU;KACX,UAAA,QAAQ,KAAK,WACZ,qBAAC,OAAD;MAAwB,WAAU;MAAlC,UAAA,CACE,oBAAC,MAAD;OAAI,WAAU;OAAgC,UAAA,OAAO;MAAU,CAAA,GAC/D,oBAAC,MAAD;OAAI,WAAW,YAAY,OAAO;OAAQ,UAAA,OAAO;MAAU,CAAA,CACxD;KAHK,GAAA,OAAO,KAGZ,CACN;IACC,CAAA,IACF;IACH,WAAW,KAAK,SAAS,WAAW,oBAAC,cAAD,EAAoB,KAAO,CAAA,IAAI,oBAAC,aAAD,EAAmB,KAAO,CAAA,IAAI;GACnF;EACjB,CAAA,CAAA,EAAA,CAAA;CAEO,CAAA;AAEjB;AAEA,SAAS,aAAa,EAAE,QAAkC;CACxD,OACE,qBAAA,UAAA,EAAA,UAAA;EACG,KAAK,SAAS,SAAS,IACtB,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,oBAAC,cAAD,EAAA,UAAc,kBAA6B,CAAA,GAC1C,KAAK,SAAS,KAAK,OAAO,UACzB,qBAAC,OAAD;IAAmD,WAAU;IAA7D,UAAA;KACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAA0D,UAAA,MAAM;MAAkB,CAAA,GACjG,MAAM,UAAU,KAAA,IACf,qBAAC,QAAD;OAAM,WAAU;OAAhB,UAAA,CACG,MAAM,OACN,MAAM,UAAU,KAAA,IAAY,MAAM,MAAM,UAAU,EAC/C;MACJ,CAAA,IAAA,IACD;;KACJ,MAAM,WAAW,KAAA,IAAY,oBAAC,KAAD;MAAG,WAAU;MAAmC,UAAA,MAAM;KAAU,CAAA,IAAI;KACjG,MAAM,aAAa,KAAA,IAClB,qBAAC,KAAD;MAAG,WAAU;MAAb,UAAA,CAAqC,mBAAgB,MAAM,QAAY;KACrE,CAAA,IAAA;IACD;GAdK,GAAA,GAAG,MAAM,YAAY,GAAG,OAAO,KAAK,GAczC,CACN,CACM;EACP,CAAA,IAAA;EACH,KAAK,YAAY,SAAS,IACzB,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,oBAAC,cAAD,EAAA,UAAc,cAAyB,CAAA,GACtC,KAAK,YAAY,KAAK,OAAO,UAC5B,qBAAC,OAAD;IAA4C,WAAU;IAAtD,UAAA,CACE,oBAAC,OAAD;KAAO,MAAK;KAAS,MAAK;KAAK,WAAU;KACtC,UAAA,MAAM;IACF,CAAA,GACN,MAAM,WAAW,KAAA,IAChB,oBAAC,QAAD;KAAM,WAAU;KAAoE,UAAA,MAAM;IAAa,CAAA,IACrG,IACD;GAPK,GAAA,GAAG,MAAM,KAAK,GAAG,OAAO,KAAK,GAOlC,CACN,CACM;EACP,CAAA,IAAA;EACJ,oBAAC,gBAAD;GAAgB,OAAM;GAAS,MAAM,KAAK;EAAS,CAAA;EACnD,oBAAC,gBAAD;GAAgB,OAAM;GAAQ,MAAM,KAAK;EAAQ,CAAA;EAChD,KAAK,YAAY,oBAAC,KAAD;GAAG,WAAU;GAAwB,UAAA;EAAyC,CAAA,IAAI;CACpG,EAAA,CAAA;AAEN;AAEA,SAAS,eAAe,EAAE,OAAO,QAAsD;CACrF,IAAI,KAAK,WAAW,GAAG,OAAO;CAC9B,MAAM,QAAQ,KAAK,MAAM,GAAA,EAAkB;CAC3C,OACE,qBAAC,WAAD;EAAS,WAAU;EAAnB,UAAA;GACE,oBAAC,cAAD,EAAA,UAAe,MAAoB,CAAA;GACnC,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM,KAAK,KAAK,UACf,qBAAC,MAAD;KAAyC,WAAU;KAAnD,UAAA;MACE,oBAAC,QAAD;OACE,WACE,IAAI,SACA,2DACA;OAGL,UAAA,IAAI;MACD,CAAA;MACL,CAAC,IAAI,SACJ,oBAAC,OAAD;OAAO,MAAK;OAAK,WAAU;OACxB,UAAA,IAAI,UAAU;MACV,CAAA,IACL;MACH,IAAI,WAAW,KAAA,IACd,oBAAC,QAAD;OAAM,WAAU;OAA4D,UAAA,IAAI;MAAa,CAAA,IAC3F;KACF;IAlBK,GAAA,GAAG,IAAI,KAAK,GAAG,OAAO,KAAK,GAkBhC,CACL;GACC,CAAA;GACH,KAAK,SAAS,MAAM,SACnB,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA;KAAqC;KAAK,KAAK,SAAS,MAAM;KAAO;IAAQ;GAC3E,CAAA,IAAA;EACG;;AAEb;AAEA,SAAS,YAAY,EAAE,QAAmC;CACxD,MAAM,YAAY;EAChB,GAAI,KAAK,cAAc,KAAA,IAAY,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC;EACjE,GAAG,KAAK,QAAQ,KAAK,WAAW,UAAU,QAAQ;EAClD,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC;CAClE;CACA,OACE,qBAAA,UAAA,EAAA,UAAA;EACG,UAAU,SAAS,IAClB,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,oBAAC,cAAD,EAAA,UAAc,YAAuB,CAAA,GACrC,oBAAC,OAAD;IAAK,WAAU;IACZ,UAAA,UAAU,KAAK,SACd,oBAAC,OAAD;KAAkB,MAAK;KACpB,UAAA;IACI,GAFK,IAEL,CACR;GACE,CAAA,CACE;EACP,CAAA,IAAA;EACH,KAAK,OAAO,SAAS,IACpB,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,oBAAC,cAAD,EAAA,UAAc,SAAoB,CAAA,GAClC,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,KAAK,OAAO,KAAK,UAChB,qBAAC,MAAD;KAAqB,WAAU;KAA/B,UAAA,CACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAA0D,UAAA,MAAM;MAAW,CAAA,GAC1F,MAAM,SACL,oBAAC,WAAD;OAAW,cAAW;OAAS,WAAU;MAAmC,CAAA,IAE5E,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,MAAM,iBAAiB,KAAA,IACpB,WACA,GAAG,OAAO,MAAM,YAAY,EAAE,UAAU,MAAM,iBAAiB,IAAI,KAAK;MACxE,CAAA,CAEL;KACJ,CAAA,GAAA,CAAC,MAAM,UAAU,MAAM,aAAa,KAAA,IACnC,qBAAC,QAAD;MAAM,WAAU;MAAhB,UAAA,CAAiD,WAAQ,MAAM,QAAe;KAC5E,CAAA,IAAA,IACF;IAhBK,GAAA,MAAM,IAgBX,CACL;GACC,CAAA,CACG;EACP,CAAA,IAAA;EACH,KAAK,QAAQ,SAAS,IACrB,qBAAC,WAAD;GAAS,WAAU;GAAnB,UAAA,CACE,oBAAC,cAAD,EAAA,UAAc,UAAqB,CAAA,GAClC,KAAK,QAAQ,KAAK,SACjB,oBAAC,KAAD;IAAc,WAAU;IACrB,UAAA;GACA,GAFK,IAEL,CACJ,CACM;EACP,CAAA,IAAA;EACH,KAAK,gBAAgB,KAAA,IAAY,oBAAC,KAAD;GAAG,WAAU;GAAyB,UAAA,KAAK;EAAe,CAAA,IAAI;CAChG,EAAA,CAAA;AAEN;;;AC1QA,IAAA,0BAAe,mBAAmB;CAAE,OAAO,CAAC,eAAe,gBAAgB;CAAG,SAAS;AAAe,CAAC;;;ACMvG,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,YAAY,gBAAgB;CACvC,IAAI;CACJ,SAAS;EACP,IAAI,YAAiD;GAAE,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,GAAGC,gBAAQ,CAAC;EAAG;EAC/F,IAAI,QAAyC;GAAE,OAAO,CAAC,IAAI;IAAE,MAAM;IAAe,IAAI;GAAO,GAAGC,4BAAQ,CAAC;EAAG;EAC5G,IAAI,iBAA2D;GAAE,OAAO,CAAC,IAAI,EAAE,IAAI,cAAc,GAAGC,kBAAY,CAAC;EAAG;EACpH,IAAI,aAAmD;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,OAAO,GAAGC,gBAAQ,CAAC;EAAG;EACnG,IAAI,QAAyC;GAAE,OAAO,CAAC,IAAI,EAAE,MAAM,cAAc,GAAGC,kBAAU,CAAC;EAAG;EAClG,IAAI,gBAAyD;GAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,GAAGC,uBAAc,CAAC;EAAG;CAC3H;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-help",
3
- "version": "0.0.0-alpha.80",
3
+ "version": "0.0.0-alpha.82",
4
4
  "description": "Activation-gated package guidance and help skills for Po and Pi extensions.",
5
5
  "keywords": [
6
6
  "agent-documentation",
@@ -61,16 +61,16 @@
61
61
  "access": "public"
62
62
  },
63
63
  "dependencies": {
64
- "@agimon-ai/po-core": "0.0.0-alpha.80",
65
- "@agimon-ai/po-minor-mode": "0.0.0-alpha.80",
66
- "@agimon-ai/po-web-components": "0.0.0-alpha.80",
64
+ "@agimon-ai/po-core": "0.0.0-alpha.82",
65
+ "@agimon-ai/po-minor-mode": "0.0.0-alpha.82",
66
+ "@agimon-ai/po-web-components": "0.0.0-alpha.82",
67
67
  "@deepseek-ai/cordis": "4.0.5",
68
68
  "typebox": "1.4.2"
69
69
  },
70
70
  "devDependencies": {
71
- "@agimon-ai/po-build": "0.0.0-alpha.80",
72
- "@agimon-ai/po-native-components": "0.0.0-alpha.80",
73
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.80",
71
+ "@agimon-ai/po-build": "0.0.0-alpha.82",
72
+ "@agimon-ai/po-native-components": "0.0.0-alpha.82",
73
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.82",
74
74
  "@earendil-works/pi-coding-agent": "1.4.0",
75
75
  "@types/node": "26.6.5",
76
76
  "@types/react": "19.3.0",
@@ -85,7 +85,7 @@
85
85
  "vitest": "5.0.4"
86
86
  },
87
87
  "peerDependencies": {
88
- "@agimon-ai/po-native-components": "0.0.0-alpha.80",
88
+ "@agimon-ai/po-native-components": "0.0.0-alpha.82",
89
89
  "@earendil-works/pi-coding-agent": "1.4.0",
90
90
  "react-native": "0.88.0",
91
91
  "react-native-unistyles": "^3.5.3"