ummaya 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/prompts/manifest.yaml +2 -2
- package/prompts/session_guidance_v1.md +3 -1
- package/prompts/system_v1.md +8 -7
- package/pyproject.toml +2 -7
- package/src/ummaya/context/builder.py +17 -11
- package/src/ummaya/engine/engine.py +27 -7
- package/src/ummaya/engine/query.py +20 -0
- package/src/ummaya/evidence/__init__.py +25 -0
- package/src/ummaya/evidence/__main__.py +7 -0
- package/src/ummaya/evidence/models.py +58 -0
- package/src/ummaya/evidence/runner.py +308 -0
- package/src/ummaya/evidence/task_registry.py +264 -0
- package/src/ummaya/ipc/frame_schema.py +47 -0
- package/src/ummaya/ipc/stdio.py +1349 -90
- package/src/ummaya/llm/client.py +132 -56
- package/src/ummaya/llm/reasoning.py +84 -0
- package/src/ummaya/tools/discovery_bridge.py +17 -1
- package/src/ummaya/tools/executor.py +32 -12
- package/src/ummaya/tools/geocoding/kakao_client.py +1 -2
- package/src/ummaya/tools/kma/apihub_catalog.py +984 -1
- package/src/ummaya/tools/kma/apihub_structured_adapter.py +86 -6
- package/src/ummaya/tools/kma/apihub_url_adapter.py +593 -0
- package/src/ummaya/tools/kma/apihub_url_catalog.py +296 -0
- package/src/ummaya/tools/location_adapters.py +8 -6
- package/src/ummaya/tools/manifest_metadata.py +16 -3
- package/src/ummaya/tools/mvp_surface.py +2 -2
- package/src/ummaya/tools/nmc/emergency_search.py +8 -6
- package/src/ummaya/tools/register_all.py +9 -0
- package/src/ummaya/tools/resolve_location.py +4 -4
- package/src/ummaya/tools/search.py +664 -18
- package/src/ummaya/tools/verified_data_go_kr/_manifest.py +115 -25
- package/src/ummaya/tools/verified_data_go_kr/airkorea_air_quality.py +109 -4
- package/src/ummaya/tools/verified_data_go_kr/nmc_aed_site.py +108 -2
- package/src/ummaya/tools/verified_data_go_kr/pps_bid_public_info.py +174 -9
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_arrival.py +66 -3
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_location.py +12 -2
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_route.py +8 -2
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_route_station.py +114 -0
- package/src/ummaya/tools/verified_data_go_kr/tago_bus_station.py +14 -3
- package/src/ummaya/tools/verify_canonical_map.py +21 -0
- package/tui/package.json +1 -2
- package/tui/src/QueryEngine.ts +4 -0
- package/tui/src/cli/handlers/auth.ts +1 -1
- package/tui/src/cli/handlers/mcp.tsx +3 -3
- package/tui/src/cli/print.ts +69 -18
- package/tui/src/cli/update.ts +13 -13
- package/tui/src/commands/copy/index.ts +1 -1
- package/tui/src/commands/cost/cost.ts +2 -2
- package/tui/src/commands/init-verifiers.ts +5 -5
- package/tui/src/commands/init.ts +30 -30
- package/tui/src/commands/insights.ts +43 -43
- package/tui/src/commands/install-github-app/install-github-app.tsx +2 -2
- package/tui/src/commands/install-github-app/setupGitHubActions.ts +3 -3
- package/tui/src/commands/install.tsx +5 -5
- package/tui/src/commands/mcp/addCommand.ts +5 -5
- package/tui/src/commands/mcp/xaaIdpCommand.ts +2 -2
- package/tui/src/commands/plugin/ManageMarketplaces.tsx +2 -2
- package/tui/src/commands/reasoning/index.ts +13 -0
- package/tui/src/commands/reasoning/reasoning.tsx +177 -0
- package/tui/src/commands/thinkback/thinkback.tsx +3 -3
- package/tui/src/commands.ts +2 -0
- package/tui/src/components/Messages.tsx +2 -1
- package/tui/src/components/Spinner.tsx +2 -2
- package/tui/src/components/design-system/LoadingState.tsx +2 -2
- package/tui/src/ipc/codec.ts +26 -0
- package/tui/src/ipc/frames.generated.ts +398 -303
- package/tui/src/ipc/llmClient.ts +130 -51
- package/tui/src/ipc/llmTypes.ts +16 -1
- package/tui/src/ipc/schema/frame.schema.json +1 -3475
- package/tui/src/main.tsx +3 -0
- package/tui/src/query.ts +467 -2
- package/tui/src/screens/REPL.tsx +3 -3
- package/tui/src/services/api/claude.ts +54 -25
- package/tui/src/services/api/client.ts +33 -12
- package/tui/src/services/api/ummaya.ts +70 -16
- package/tui/src/skills/bundled/stuck.ts +12 -12
- package/tui/src/state/AppStateStore.ts +7 -0
- package/tui/src/tools/AdapterTool/AdapterTool.ts +590 -7
- package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +43 -17
- package/tui/src/tools/LookupPrimitive/prompt.ts +7 -6
- package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +40 -19
- package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +25 -9
- package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +25 -9
- package/tui/src/tools/_shared/citizenUserText.ts +49 -0
- package/tui/src/tools/_shared/directPublicDataGuard.ts +362 -0
- package/tui/src/tools/_shared/kmaAnalysisGuard.ts +197 -0
- package/tui/src/tools/_shared/kmaAviationGuard.ts +70 -0
- package/tui/src/tools/_shared/locationInputRepair.ts +112 -0
- package/tui/src/tools/_shared/nmcAedGuard.ts +234 -0
- package/tui/src/tools/_shared/protectedCheckGuard.ts +207 -0
- package/tui/src/tools/_shared/rootPrimitiveInput.ts +67 -0
- package/tui/src/tools/_shared/textToolCallGuard.ts +91 -0
- package/tui/src/tools/_shared/toolChoiceRepair.ts +866 -0
- package/tui/src/utils/attachments.ts +1 -1
- package/tui/src/utils/kExaoneReasoning.ts +138 -0
- package/tui/src/utils/messages.ts +1 -0
- package/tui/src/utils/multiToolLayout.ts +13 -0
- package/tui/src/utils/processUserInput/processSlashCommand.tsx +2 -2
- package/tui/src/utils/processUserInput/processUserInput.ts +26 -0
- package/tui/src/utils/settings/applySettingsChange.ts +4 -0
- package/tui/src/utils/settings/types.ts +9 -3
- package/tui/src/utils/stats.ts +1 -1
- package/uv.lock +1 -15
- package/assets/copilot-gate-logo.svg +0 -58
- package/assets/govon-logo.svg +0 -40
- package/src/ummaya/eval/__init__.py +0 -5
- package/src/ummaya/eval/retrieval.py +0 -713
- package/tui/src/utils/messageStream.ts +0 -186
package/tui/src/commands/init.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { Command } from '../commands.js'
|
|
|
3
3
|
import { maybeMarkProjectOnboardingComplete } from '../projectOnboardingState.js'
|
|
4
4
|
import { isEnvTruthy } from '../utils/envUtils.js'
|
|
5
5
|
|
|
6
|
-
const OLD_INIT_PROMPT = `Please analyze this codebase and create a CLAUDE.md file, which will be given to future
|
|
6
|
+
const OLD_INIT_PROMPT = `Please analyze this codebase and create a CLAUDE.md file, which will be given to future UMMAYA sessions operating in this repository.
|
|
7
7
|
|
|
8
8
|
What to add:
|
|
9
9
|
1. Commands that will be commonly used, such as how to build, lint, and run tests. Include the necessary commands to develop in this codebase, such as how to run a single test.
|
|
@@ -38,8 +38,8 @@ Use AskUserQuestion to find out what the user wants:
|
|
|
38
38
|
|
|
39
39
|
- "Also set up skills and hooks?"
|
|
40
40
|
Options: "Skills + hooks" | "Skills only" | "Hooks only" | "Neither, just CLAUDE.md"
|
|
41
|
-
Description for skills: "On-demand capabilities you or
|
|
42
|
-
Description for hooks: "Deterministic shell commands that run on tool events (e.g., format after every edit).
|
|
41
|
+
Description for skills: "On-demand capabilities you or UMMAYA invoke with \`/skill-name\` — good for repeatable workflows and reference knowledge."
|
|
42
|
+
Description for hooks: "Deterministic shell commands that run on tool events (e.g., format after every edit). UMMAYA can't skip them."
|
|
43
43
|
|
|
44
44
|
## Phase 2: Explore the codebase
|
|
45
45
|
|
|
@@ -65,16 +65,16 @@ If the user chose project CLAUDE.md or both: ask about codebase practices — no
|
|
|
65
65
|
|
|
66
66
|
If the user chose personal CLAUDE.local.md or both: ask about them, not the codebase. Do not mark any options as "recommended" — this is about their personal preferences, not best practices. Examples of questions:
|
|
67
67
|
- What's their role on the team? (e.g., "backend engineer", "data scientist", "new hire onboarding")
|
|
68
|
-
- How familiar are they with this codebase and its languages/frameworks? (so
|
|
69
|
-
- Do they have personal sandbox URLs, test accounts, API key paths, or local setup details
|
|
68
|
+
- How familiar are they with this codebase and its languages/frameworks? (so UMMAYA can calibrate explanation depth)
|
|
69
|
+
- Do they have personal sandbox URLs, test accounts, API key paths, or local setup details UMMAYA should know?
|
|
70
70
|
- Only if Phase 2 found multiple git worktrees: ask whether their worktrees are nested inside the main repo (e.g., \`.claude/worktrees/<name>/\`) or siblings/external (e.g., \`../myrepo-feature/\`). If nested, the upward file walk finds the main repo's CLAUDE.local.md automatically — no special handling needed. If sibling/external, the personal content should live in a home-directory file (e.g., \`~/.claude/<project-name>-instructions.md\`) and each worktree gets a one-line CLAUDE.local.md stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. Never put this import in the project CLAUDE.md — that would check a personal reference into the team-shared file.
|
|
71
71
|
- Any communication preferences? (e.g., "be terse", "always explain tradeoffs", "don't summarize at the end")
|
|
72
72
|
|
|
73
73
|
**Synthesize a proposal from Phase 2 findings** — e.g., format-on-edit if a formatter exists, a \`/verify\` skill if tests exist, a CLAUDE.md note for anything from the gap-fill answers that's a guideline rather than a workflow. For each, pick the artifact type that fits, **constrained by the Phase 1 skills+hooks choice**:
|
|
74
74
|
|
|
75
|
-
- **Hook** (stricter) — deterministic shell command on a tool event;
|
|
76
|
-
- **Skill** (on-demand) — you or
|
|
77
|
-
- **CLAUDE.md note** (looser) — influences
|
|
75
|
+
- **Hook** (stricter) — deterministic shell command on a tool event; UMMAYA can't skip it. Fits mechanical, fast, per-edit steps: formatting, linting, running a quick test on the changed file.
|
|
76
|
+
- **Skill** (on-demand) — you or UMMAYA invoke \`/skill-name\` when you want it. Fits workflows that don't belong on every edit: deep verification, session reports, deploys.
|
|
77
|
+
- **CLAUDE.md note** (looser) — influences UMMAYA's behavior but not enforced. Fits communication/thinking preferences: "plan before coding", "be terse", "explain tradeoffs".
|
|
78
78
|
|
|
79
79
|
**Respect Phase 1's skills+hooks choice as a hard filter**: if the user picked "Skills only", downgrade any hook you'd suggest to a skill or a CLAUDE.md note. If "Hooks only", downgrade skills to hooks (where mechanically possible) or notes. If "Neither", everything becomes a CLAUDE.md note. Never propose an artifact type the user didn't opt into.
|
|
80
80
|
|
|
@@ -94,12 +94,12 @@ If the user chose personal CLAUDE.local.md or both: ask about them, not the code
|
|
|
94
94
|
|
|
95
95
|
## Phase 4: Write CLAUDE.md (if user chose project or both)
|
|
96
96
|
|
|
97
|
-
Write a minimal CLAUDE.md at the project root. Every line must pass this test: "Would removing this cause
|
|
97
|
+
Write a minimal CLAUDE.md at the project root. Every line must pass this test: "Would removing this cause UMMAYA to make mistakes?" If no, cut it.
|
|
98
98
|
|
|
99
|
-
**Consume \`note\` entries from the Phase 3 preference queue whose target is CLAUDE.md** (team-level notes) — add each as a concise line in the most relevant section. These are the behaviors the user wants
|
|
99
|
+
**Consume \`note\` entries from the Phase 3 preference queue whose target is CLAUDE.md** (team-level notes) — add each as a concise line in the most relevant section. These are the behaviors the user wants UMMAYA to follow but didn't need guaranteed (e.g., "propose a plan before implementing", "explain the tradeoffs when refactoring"). Leave personal-targeted notes for Phase 5.
|
|
100
100
|
|
|
101
101
|
Include:
|
|
102
|
-
- Build/test/lint commands
|
|
102
|
+
- Build/test/lint commands UMMAYA can't guess (non-standard scripts, flags, or sequences)
|
|
103
103
|
- Code style rules that DIFFER from language defaults (e.g., "prefer type over interface")
|
|
104
104
|
- Testing instructions and quirks (e.g., "run single test with: pytest -k 'test_name'")
|
|
105
105
|
- Repo etiquette (branch naming, PR conventions, commit style)
|
|
@@ -108,11 +108,11 @@ Include:
|
|
|
108
108
|
- Important parts from existing AI coding tool configs if they exist (AGENTS.md, .cursor/rules, .cursorrules, .github/copilot-instructions.md, .windsurfrules, .clinerules)
|
|
109
109
|
|
|
110
110
|
Exclude:
|
|
111
|
-
- File-by-file structure or component lists (
|
|
112
|
-
- Standard language conventions
|
|
111
|
+
- File-by-file structure or component lists (UMMAYA can discover these by reading the codebase)
|
|
112
|
+
- Standard language conventions UMMAYA already knows
|
|
113
113
|
- Generic advice ("write clean code", "handle errors")
|
|
114
114
|
- Detailed API docs or long references — use \`@path/to/import\` syntax instead (e.g., \`@docs/api-reference.md\`) to inline content on demand without bloating CLAUDE.md
|
|
115
|
-
- Information that changes frequently — reference the source with \`@path/to/import\` so
|
|
115
|
+
- Information that changes frequently — reference the source with \`@path/to/import\` so UMMAYA always reads the current version
|
|
116
116
|
- Long tutorials or walkthroughs (move to a separate file and reference with \`@path/to/import\`, or put in a skill)
|
|
117
117
|
- Commands obvious from manifest files (e.g., standard "npm test", "cargo test", "pytest")
|
|
118
118
|
|
|
@@ -132,7 +132,7 @@ If CLAUDE.md already exists: read it, propose specific changes as diffs, and exp
|
|
|
132
132
|
|
|
133
133
|
For projects with multiple concerns, suggest organizing instructions into \`.claude/rules/\` as separate focused files (e.g., \`code-style.md\`, \`testing.md\`, \`security.md\`). These are loaded automatically alongside CLAUDE.md and can be scoped to specific file paths using \`paths\` frontmatter.
|
|
134
134
|
|
|
135
|
-
For projects with distinct subdirectories (monorepos, multi-module projects, etc.): mention that subdirectory CLAUDE.md files can be added for module-specific instructions (they're loaded automatically when
|
|
135
|
+
For projects with distinct subdirectories (monorepos, multi-module projects, etc.): mention that subdirectory CLAUDE.md files can be added for module-specific instructions (they're loaded automatically when UMMAYA works in those directories). Offer to create them if the user wants.
|
|
136
136
|
|
|
137
137
|
## Phase 5: Write CLAUDE.local.md (if user chose personal or both)
|
|
138
138
|
|
|
@@ -141,11 +141,11 @@ Write a minimal CLAUDE.local.md at the project root. This file is automatically
|
|
|
141
141
|
**Consume \`note\` entries from the Phase 3 preference queue whose target is CLAUDE.local.md** (personal-level notes) — add each as a concise line. If the user chose personal-only in Phase 1, this is the sole consumer of note entries.
|
|
142
142
|
|
|
143
143
|
Include:
|
|
144
|
-
- The user's role and familiarity with the codebase (so
|
|
144
|
+
- The user's role and familiarity with the codebase (so UMMAYA can calibrate explanations)
|
|
145
145
|
- Personal sandbox URLs, test accounts, or local setup details
|
|
146
146
|
- Personal workflow or communication preferences
|
|
147
147
|
|
|
148
|
-
Keep it short — only include what would make
|
|
148
|
+
Keep it short — only include what would make UMMAYA's responses noticeably better for this user.
|
|
149
149
|
|
|
150
150
|
If Phase 2 found multiple git worktrees and the user confirmed they use sibling/external worktrees (not nested inside the main repo): the upward file walk won't find a single CLAUDE.local.md from all worktrees. Write the actual personal content to \`~/.claude/<project-name>-instructions.md\` and make CLAUDE.local.md a one-line stub that imports it: \`@~/.claude/<project-name>-instructions.md\`. The user can copy this one-line stub to each sibling worktree. Never put this import in the project CLAUDE.md. If worktrees are nested inside the main repo (e.g., \`.claude/worktrees/\`), no special handling is needed — the main repo's CLAUDE.local.md is found automatically.
|
|
151
151
|
|
|
@@ -153,7 +153,7 @@ If CLAUDE.local.md already exists: read it, propose specific additions, and do n
|
|
|
153
153
|
|
|
154
154
|
## Phase 6: Suggest and create skills (if user chose "Skills + hooks" or "Skills only")
|
|
155
155
|
|
|
156
|
-
Skills add capabilities
|
|
156
|
+
Skills add capabilities UMMAYA can use on demand without bloating every session.
|
|
157
157
|
|
|
158
158
|
**First, consume \`skill\` entries from the Phase 3 preference queue.** Each queued skill preference becomes a SKILL.md tailored to what the user described. For each:
|
|
159
159
|
- Name it from the preference (e.g., "verify-deep", "session-report", "deploy-sandbox")
|
|
@@ -176,10 +176,10 @@ name: <skill-name>
|
|
|
176
176
|
description: <what the skill does and when to use it>
|
|
177
177
|
---
|
|
178
178
|
|
|
179
|
-
<Instructions for
|
|
179
|
+
<Instructions for UMMAYA>
|
|
180
180
|
\`\`\`
|
|
181
181
|
|
|
182
|
-
Both the user (\`/<skill-name>\`) and
|
|
182
|
+
Both the user (\`/<skill-name>\`) and UMMAYA can invoke skills by default. For workflows with side effects (e.g., \`/deploy\`, \`/fix-issue 123\`), add \`disable-model-invocation: true\` so only the user can trigger it, and use \`$ARGUMENTS\` to accept input.
|
|
183
183
|
|
|
184
184
|
## Phase 7: Suggest additional optimizations
|
|
185
185
|
|
|
@@ -187,9 +187,9 @@ Tell the user you're going to suggest a few additional optimizations now that CL
|
|
|
187
187
|
|
|
188
188
|
Check the environment and ask about each gap you find (use AskUserQuestion):
|
|
189
189
|
|
|
190
|
-
- **GitHub CLI**: Run \`which gh\` (or \`where gh\` on Windows). If it's missing AND the project uses GitHub (check \`git remote -v\` for github.com), ask the user if they want to install it. Explain that the GitHub CLI lets
|
|
190
|
+
- **GitHub CLI**: Run \`which gh\` (or \`where gh\` on Windows). If it's missing AND the project uses GitHub (check \`git remote -v\` for github.com), ask the user if they want to install it. Explain that the GitHub CLI lets UMMAYA help with commits, pull requests, issues, and code review directly.
|
|
191
191
|
|
|
192
|
-
- **Linting**: If Phase 2 found no lint config (no .eslintrc, ruff.toml, .golangci.yml, etc. for the project's language), ask the user if they want
|
|
192
|
+
- **Linting**: If Phase 2 found no lint config (no .eslintrc, ruff.toml, .golangci.yml, etc. for the project's language), ask the user if they want UMMAYA to set up linting for this codebase. Explain that linting catches issues early and gives UMMAYA fast feedback on its own edits.
|
|
193
193
|
|
|
194
194
|
- **Proposal-sourced hooks** (if user chose "Skills + hooks" or "Hooks only"): Consume \`hook\` entries from the Phase 3 preference queue. If Phase 2 found a formatter and the queue has no formatting hook, offer format-on-edit as a fallback. If the user chose "Neither" or "Skills only" in Phase 1, skip this bullet entirely.
|
|
195
195
|
|
|
@@ -199,9 +199,9 @@ Check the environment and ask about each gap you find (use AskUserQuestion):
|
|
|
199
199
|
|
|
200
200
|
2. Pick the event and matcher from the preference:
|
|
201
201
|
- "after every edit" → \`PostToolUse\` with matcher \`Write|Edit\`
|
|
202
|
-
- "when
|
|
202
|
+
- "when UMMAYA finishes" / "before I review" → \`Stop\` event (fires at the end of every turn — including read-only ones)
|
|
203
203
|
- "before running bash" → \`PreToolUse\` with matcher \`Bash\`
|
|
204
|
-
- "before committing" (literal git-commit gate) → **not a hooks.json hook.** Matchers can't filter Bash by command content, so there's no way to target only \`git commit\`. Route this to a git pre-commit hook (\`.git/hooks/pre-commit\`, husky, pre-commit framework) instead — offer to write one. If the user actually means "before I review and commit
|
|
204
|
+
- "before committing" (literal git-commit gate) → **not a hooks.json hook.** Matchers can't filter Bash by command content, so there's no way to target only \`git commit\`. Route this to a git pre-commit hook (\`.git/hooks/pre-commit\`, husky, pre-commit framework) instead — offer to write one. If the user actually means "before I review and commit UMMAYA's output", that's \`Stop\` — probe to disambiguate.
|
|
205
205
|
Probe if the preference is ambiguous.
|
|
206
206
|
|
|
207
207
|
3. **Load the hook reference** (once per \`/init\` run, before the first hook): invoke the Skill tool with \`skill: 'update-config'\` and args starting with \`[hooks-only]\` followed by a one-line summary of what you're building — e.g., \`[hooks-only] Constructing a PostToolUse/Write|Edit format hook for .claude/settings.json using ruff\`. This loads the hooks schema and verification flow into context. Subsequent hooks reuse it — don't re-invoke.
|
|
@@ -214,13 +214,13 @@ Act on each "yes" before moving on.
|
|
|
214
214
|
|
|
215
215
|
Recap what was set up — which files were written and the key points included in each. Remind the user these files are a starting point: they should review and tweak them, and can run \`/init\` again anytime to re-scan.
|
|
216
216
|
|
|
217
|
-
Then tell the user that you'll be introducing a few more suggestions for optimizing their codebase and
|
|
217
|
+
Then tell the user that you'll be introducing a few more suggestions for optimizing their codebase and UMMAYA setup based on what you found. Present these as a single, well-formatted to-do list where every item is relevant to this repo. Put the most impactful items first.
|
|
218
218
|
|
|
219
219
|
When building the list, work through these checks and include only what applies:
|
|
220
|
-
- If frontend code was detected (React, Vue, Svelte, etc.): \`/plugin install frontend-design@claude-plugins-official\` gives
|
|
220
|
+
- If frontend code was detected (React, Vue, Svelte, etc.): \`/plugin install frontend-design@claude-plugins-official\` gives UMMAYA design principles and component patterns so it produces polished UI; \`/plugin install playwright@claude-plugins-official\` lets UMMAYA launch a real browser, screenshot what it built, and fix visual bugs itself.
|
|
221
221
|
- If you found gaps in Phase 7 (missing GitHub CLI, missing linting) and the user said no: list them here with a one-line reason why each helps.
|
|
222
|
-
- If tests are missing or sparse: suggest setting up a test framework so
|
|
223
|
-
- To help you create skills and optimize existing skills using evals,
|
|
222
|
+
- If tests are missing or sparse: suggest setting up a test framework so UMMAYA can verify its own changes.
|
|
223
|
+
- To help you create skills and optimize existing skills using evals, UMMAYA has an official skill-creator plugin you can install. Install it with \`/plugin install skill-creator@claude-plugins-official\`, then run \`/skill-creator <skill-name>\` to create new skills or refine any existing skill. (Always include this one.)
|
|
224
224
|
- Browse official plugins with \`/plugin\` — these bundle skills, agents, hooks, and MCP servers that you may find helpful. You can also create your own custom plugins to share them with others. (Always include this one.)`
|
|
225
225
|
|
|
226
226
|
const command = {
|
|
@@ -230,8 +230,8 @@ const command = {
|
|
|
230
230
|
return feature('NEW_INIT') &&
|
|
231
231
|
(process.env.USER_TYPE === 'ant' ||
|
|
232
232
|
isEnvTruthy(process.env.CLAUDE_CODE_NEW_INIT))
|
|
233
|
-
? 'Initialize new
|
|
234
|
-
: 'Initialize a new
|
|
233
|
+
? 'Initialize new UMMAYA memory file(s) and optional skills/hooks with codebase documentation'
|
|
234
|
+
: 'Initialize a new UMMAYA memory file with codebase documentation'
|
|
235
235
|
},
|
|
236
236
|
contentLength: 0, // Dynamic content
|
|
237
237
|
progressMessage: 'analyzing your codebase',
|
|
@@ -377,7 +377,7 @@ const LABEL_MAP: Record<string, string> = {
|
|
|
377
377
|
wrong_approach: 'Wrong Approach',
|
|
378
378
|
buggy_code: 'Buggy Code',
|
|
379
379
|
user_rejected_action: 'User Rejected Action',
|
|
380
|
-
claude_got_blocked: '
|
|
380
|
+
claude_got_blocked: 'UMMAYA Got Blocked',
|
|
381
381
|
user_stopped_early: 'User Stopped Early',
|
|
382
382
|
wrong_file_or_location: 'Wrong File/Location',
|
|
383
383
|
excessive_changes: 'Excessive Changes',
|
|
@@ -427,13 +427,13 @@ function getSessionMetaDir(): string {
|
|
|
427
427
|
return join(getDataDir(), 'session-meta')
|
|
428
428
|
}
|
|
429
429
|
|
|
430
|
-
const FACET_EXTRACTION_PROMPT = `Analyze this
|
|
430
|
+
const FACET_EXTRACTION_PROMPT = `Analyze this UMMAYA session and extract structured facets.
|
|
431
431
|
|
|
432
432
|
CRITICAL GUIDELINES:
|
|
433
433
|
|
|
434
434
|
1. **goal_categories**: Count ONLY what the USER explicitly asked for.
|
|
435
|
-
- DO NOT count
|
|
436
|
-
- DO NOT count work
|
|
435
|
+
- DO NOT count UMMAYA's autonomous codebase exploration
|
|
436
|
+
- DO NOT count work UMMAYA decided to do on its own
|
|
437
437
|
- ONLY count when user says "can you...", "please...", "I need...", "let's..."
|
|
438
438
|
|
|
439
439
|
2. **user_satisfaction_counts**: Base ONLY on explicit user signals.
|
|
@@ -444,7 +444,7 @@ CRITICAL GUIDELINES:
|
|
|
444
444
|
- "this is broken", "I give up" → frustrated
|
|
445
445
|
|
|
446
446
|
3. **friction_counts**: Be specific about what went wrong.
|
|
447
|
-
- misunderstood_request:
|
|
447
|
+
- misunderstood_request: UMMAYA interpreted incorrectly
|
|
448
448
|
- wrong_approach: Right goal, wrong solution method
|
|
449
449
|
- buggy_code: Code didn't work correctly
|
|
450
450
|
- user_rejected_action: User said no/stop to a tool call
|
|
@@ -867,9 +867,9 @@ function formatTranscriptForFacets(log: LogOption): string {
|
|
|
867
867
|
return lines.join('\n')
|
|
868
868
|
}
|
|
869
869
|
|
|
870
|
-
const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a
|
|
870
|
+
const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a UMMAYA session transcript. Focus on:
|
|
871
871
|
1. What the user asked for
|
|
872
|
-
2. What
|
|
872
|
+
2. What UMMAYA did (tools used, files modified)
|
|
873
873
|
3. Any friction or issues
|
|
874
874
|
4. The outcome
|
|
875
875
|
|
|
@@ -1055,7 +1055,7 @@ RESPOND WITH ONLY A VALID JSON OBJECT matching this schema:
|
|
|
1055
1055
|
}
|
|
1056
1056
|
|
|
1057
1057
|
/**
|
|
1058
|
-
* Detects
|
|
1058
|
+
* Detects parallel-session usage (using multiple UMMAYA sessions concurrently).
|
|
1059
1059
|
* Uses a sliding window to find the pattern: session1 -> session2 -> session1
|
|
1060
1060
|
* within a 30-minute window.
|
|
1061
1061
|
*/
|
|
@@ -1336,12 +1336,12 @@ type InsightSection = {
|
|
|
1336
1336
|
const INSIGHT_SECTIONS: InsightSection[] = [
|
|
1337
1337
|
{
|
|
1338
1338
|
name: 'project_areas',
|
|
1339
|
-
prompt: `Analyze this
|
|
1339
|
+
prompt: `Analyze this UMMAYA usage data and identify project areas.
|
|
1340
1340
|
|
|
1341
1341
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1342
1342
|
{
|
|
1343
1343
|
"areas": [
|
|
1344
|
-
{"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how
|
|
1344
|
+
{"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how UMMAYA was used."}
|
|
1345
1345
|
]
|
|
1346
1346
|
}
|
|
1347
1347
|
|
|
@@ -1350,18 +1350,18 @@ Include 4-5 areas. Skip internal CC operations.`,
|
|
|
1350
1350
|
},
|
|
1351
1351
|
{
|
|
1352
1352
|
name: 'interaction_style',
|
|
1353
|
-
prompt: `Analyze this
|
|
1353
|
+
prompt: `Analyze this UMMAYA usage data and describe the user's interaction style.
|
|
1354
1354
|
|
|
1355
1355
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1356
1356
|
{
|
|
1357
|
-
"narrative": "2-3 paragraphs analyzing HOW the user interacts with
|
|
1357
|
+
"narrative": "2-3 paragraphs analyzing HOW the user interacts with UMMAYA. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let UMMAYA run? Include specific examples. Use **bold** for key insights.",
|
|
1358
1358
|
"key_pattern": "One sentence summary of most distinctive interaction style"
|
|
1359
1359
|
}`,
|
|
1360
1360
|
maxTokens: 8192,
|
|
1361
1361
|
},
|
|
1362
1362
|
{
|
|
1363
1363
|
name: 'what_works',
|
|
1364
|
-
prompt: `Analyze this
|
|
1364
|
+
prompt: `Analyze this UMMAYA usage data and identify what's working well for this user. Use second person ("you").
|
|
1365
1365
|
|
|
1366
1366
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1367
1367
|
{
|
|
@@ -1376,7 +1376,7 @@ Include 3 impressive workflows.`,
|
|
|
1376
1376
|
},
|
|
1377
1377
|
{
|
|
1378
1378
|
name: 'friction_analysis',
|
|
1379
|
-
prompt: `Analyze this
|
|
1379
|
+
prompt: `Analyze this UMMAYA usage data and identify friction points for this user. Use second person ("you").
|
|
1380
1380
|
|
|
1381
1381
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1382
1382
|
{
|
|
@@ -1391,10 +1391,10 @@ Include 3 friction categories with 2 examples each.`,
|
|
|
1391
1391
|
},
|
|
1392
1392
|
{
|
|
1393
1393
|
name: 'suggestions',
|
|
1394
|
-
prompt: `Analyze this
|
|
1394
|
+
prompt: `Analyze this UMMAYA usage data and suggest improvements.
|
|
1395
1395
|
|
|
1396
1396
|
## CC FEATURES REFERENCE (pick from these for features_to_try):
|
|
1397
|
-
1. **MCP Servers**: Connect
|
|
1397
|
+
1. **MCP Servers**: Connect UMMAYA to external tools, databases, and APIs via Model Context Protocol.
|
|
1398
1398
|
- How to use: Run \`claude mcp add <server-name> -- <command>\`
|
|
1399
1399
|
- Good for: database queries, Slack integration, GitHub issue lookup, connecting to internal APIs
|
|
1400
1400
|
|
|
@@ -1406,12 +1406,12 @@ Include 3 friction categories with 2 examples each.`,
|
|
|
1406
1406
|
- How to use: Add to \`.claude/settings.json\` under "hooks" key.
|
|
1407
1407
|
- Good for: auto-formatting code, running type checks, enforcing conventions
|
|
1408
1408
|
|
|
1409
|
-
4. **Headless Mode**: Run
|
|
1409
|
+
4. **Headless Mode**: Run UMMAYA non-interactively from scripts and CI/CD.
|
|
1410
1410
|
- How to use: \`claude -p "fix lint errors" --allowedTools "Edit,Read,Bash"\`
|
|
1411
1411
|
- Good for: CI/CD integration, batch code fixes, automated reviews
|
|
1412
1412
|
|
|
1413
|
-
5. **Task Agents**:
|
|
1414
|
-
- How to use:
|
|
1413
|
+
5. **Task Agents**: UMMAYA spawns focused sub-agents for complex exploration or parallel work.
|
|
1414
|
+
- How to use: UMMAYA auto-invokes when helpful, or ask "use an agent to explore X"
|
|
1415
1415
|
- Good for: codebase exploration, understanding complex systems
|
|
1416
1416
|
|
|
1417
1417
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
@@ -1427,14 +1427,14 @@ RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
|
1427
1427
|
]
|
|
1428
1428
|
}
|
|
1429
1429
|
|
|
1430
|
-
IMPORTANT for claude_md_additions: PRIORITIZE instructions that appear MULTIPLE TIMES in the user data. If user told
|
|
1430
|
+
IMPORTANT for claude_md_additions: PRIORITIZE instructions that appear MULTIPLE TIMES in the user data. If user told UMMAYA the same thing in 2+ sessions (e.g., 'always run tests', 'use TypeScript'), that's a PRIME candidate - they shouldn't have to repeat themselves.
|
|
1431
1431
|
|
|
1432
1432
|
IMPORTANT for features_to_try: Pick 2-3 from the CC FEATURES REFERENCE above. Include 2-3 items for each category.`,
|
|
1433
1433
|
maxTokens: 8192,
|
|
1434
1434
|
},
|
|
1435
1435
|
{
|
|
1436
1436
|
name: 'on_the_horizon',
|
|
1437
|
-
prompt: `Analyze this
|
|
1437
|
+
prompt: `Analyze this UMMAYA usage data and identify future opportunities.
|
|
1438
1438
|
|
|
1439
1439
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1440
1440
|
{
|
|
@@ -1451,7 +1451,7 @@ Include 3 opportunities. Think BIG - autonomous workflows, parallel agents, iter
|
|
|
1451
1451
|
? [
|
|
1452
1452
|
{
|
|
1453
1453
|
name: 'cc_team_improvements',
|
|
1454
|
-
prompt: `Analyze this
|
|
1454
|
+
prompt: `Analyze this UMMAYA usage data and suggest product improvements for the UMMAYA team.
|
|
1455
1455
|
|
|
1456
1456
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1457
1457
|
{
|
|
@@ -1465,7 +1465,7 @@ Include 2-3 improvements based on friction patterns observed.`,
|
|
|
1465
1465
|
},
|
|
1466
1466
|
{
|
|
1467
1467
|
name: 'model_behavior_improvements',
|
|
1468
|
-
prompt: `Analyze this
|
|
1468
|
+
prompt: `Analyze this UMMAYA usage data and suggest model behavior improvements.
|
|
1469
1469
|
|
|
1470
1470
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1471
1471
|
{
|
|
@@ -1481,7 +1481,7 @@ Include 2-3 improvements based on friction patterns observed.`,
|
|
|
1481
1481
|
: []),
|
|
1482
1482
|
{
|
|
1483
1483
|
name: 'fun_ending',
|
|
1484
|
-
prompt: `Analyze this
|
|
1484
|
+
prompt: `Analyze this UMMAYA usage data and find a memorable moment.
|
|
1485
1485
|
|
|
1486
1486
|
RESPOND WITH ONLY A VALID JSON OBJECT:
|
|
1487
1487
|
{
|
|
@@ -1735,15 +1735,15 @@ async function generateParallelInsights(
|
|
|
1735
1735
|
.join('\n') || ''
|
|
1736
1736
|
|
|
1737
1737
|
// Now generate "At a Glance" with access to other sections' outputs
|
|
1738
|
-
const atAGlancePrompt = `You're writing an "At a Glance" summary for a
|
|
1738
|
+
const atAGlancePrompt = `You're writing an "At a Glance" summary for a UMMAYA usage insights report for UMMAYA users. The goal is to help them understand their usage and improve how they can use UMMAYA better, especially as models improve.
|
|
1739
1739
|
|
|
1740
1740
|
Use this 4-part structure:
|
|
1741
1741
|
|
|
1742
|
-
1. **What's working** - What is the user's unique style of interacting with
|
|
1742
|
+
1. **What's working** - What is the user's unique style of interacting with UMMAYA and what are some impactful things they've done? You can include one or two details, but keep it high level since things might not be fresh in the user's memory. Don't be fluffy or overly complimentary. Also, don't focus on the tool calls they use.
|
|
1743
1743
|
|
|
1744
|
-
2. **What's hindering you** - Split into (a)
|
|
1744
|
+
2. **What's hindering you** - Split into (a) UMMAYA's fault (misunderstandings, wrong approaches, bugs) and (b) user-side friction (not providing enough context, environment issues -- ideally more general than just one project). Be honest but constructive.
|
|
1745
1745
|
|
|
1746
|
-
3. **Quick wins to try** - Specific
|
|
1746
|
+
3. **Quick wins to try** - Specific UMMAYA features they could try from the examples below, or a workflow technique if you think it's really compelling. (Avoid stuff like "Ask UMMAYA to confirm before taking actions" or "Type out more context up front" which are less compelling.)
|
|
1747
1747
|
|
|
1748
1748
|
4. **Ambitious workflows for better models** - As we move to much more capable models over the next 3-6 months, what should they prepare for? What workflows that seem impossible now will become possible? Draw from the appropriate section below.
|
|
1749
1749
|
|
|
@@ -2006,7 +2006,7 @@ function generateHtmlReport(
|
|
|
2006
2006
|
const interactionStyle = insights.interaction_style
|
|
2007
2007
|
const interactionHtml = interactionStyle?.narrative
|
|
2008
2008
|
? `
|
|
2009
|
-
<h2 id="section-usage">How You Use
|
|
2009
|
+
<h2 id="section-usage">How You Use UMMAYA</h2>
|
|
2010
2010
|
<div class="narrative">
|
|
2011
2011
|
${markdownToHtml(interactionStyle.narrative)}
|
|
2012
2012
|
${interactionStyle.key_pattern ? `<div class="key-insight"><strong>Key pattern:</strong> ${escapeHtml(interactionStyle.key_pattern)}</div>` : ''}
|
|
@@ -2070,7 +2070,7 @@ function generateHtmlReport(
|
|
|
2070
2070
|
<h2 id="section-features">Existing CC Features to Try</h2>
|
|
2071
2071
|
<div class="claude-md-section">
|
|
2072
2072
|
<h3>Suggested CLAUDE.md Additions</h3>
|
|
2073
|
-
<p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
|
2073
|
+
<p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into UMMAYA to add it to your memory file.</p>
|
|
2074
2074
|
<div class="claude-md-actions">
|
|
2075
2075
|
<button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
|
|
2076
2076
|
</div>
|
|
@@ -2095,7 +2095,7 @@ function generateHtmlReport(
|
|
|
2095
2095
|
${
|
|
2096
2096
|
suggestions.features_to_try && suggestions.features_to_try.length > 0
|
|
2097
2097
|
? `
|
|
2098
|
-
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
|
2098
|
+
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into UMMAYA and it'll set it up for you.</p>
|
|
2099
2099
|
<div class="features-section">
|
|
2100
2100
|
${suggestions.features_to_try
|
|
2101
2101
|
.map(
|
|
@@ -2129,8 +2129,8 @@ function generateHtmlReport(
|
|
|
2129
2129
|
${
|
|
2130
2130
|
suggestions.usage_patterns && suggestions.usage_patterns.length > 0
|
|
2131
2131
|
? `
|
|
2132
|
-
<h2 id="section-patterns">New Ways to Use
|
|
2133
|
-
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into
|
|
2132
|
+
<h2 id="section-patterns">New Ways to Use UMMAYA</h2>
|
|
2133
|
+
<p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into UMMAYA and it'll walk you through it.</p>
|
|
2134
2134
|
<div class="patterns-section">
|
|
2135
2135
|
${suggestions.usage_patterns
|
|
2136
2136
|
.map(
|
|
@@ -2143,7 +2143,7 @@ function generateHtmlReport(
|
|
|
2143
2143
|
pat.copyable_prompt
|
|
2144
2144
|
? `
|
|
2145
2145
|
<div class="copyable-prompt-section">
|
|
2146
|
-
<div class="prompt-label">Paste into
|
|
2146
|
+
<div class="prompt-label">Paste into UMMAYA:</div>
|
|
2147
2147
|
<div class="copyable-prompt-row">
|
|
2148
2148
|
<code class="copyable-prompt">${escapeHtml(pat.copyable_prompt)}</code>
|
|
2149
2149
|
<button class="copy-btn" onclick="copyText(this)">Copy</button>
|
|
@@ -2178,7 +2178,7 @@ function generateHtmlReport(
|
|
|
2178
2178
|
<div class="horizon-title">${escapeHtml(opp.title || '')}</div>
|
|
2179
2179
|
<div class="horizon-possible">${escapeHtml(opp.whats_possible || '')}</div>
|
|
2180
2180
|
${opp.how_to_try ? `<div class="horizon-tip"><strong>Getting started:</strong> ${escapeHtml(opp.how_to_try)}</div>` : ''}
|
|
2181
|
-
${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into
|
|
2181
|
+
${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into UMMAYA:</div><code>${escapeHtml(opp.copyable_prompt)}</code><button class="copy-btn" onclick="copyText(this)">Copy</button></div>` : ''}
|
|
2182
2182
|
</div>
|
|
2183
2183
|
`,
|
|
2184
2184
|
)
|
|
@@ -2485,13 +2485,13 @@ function generateHtmlReport(
|
|
|
2485
2485
|
<html>
|
|
2486
2486
|
<head>
|
|
2487
2487
|
<meta charset="utf-8">
|
|
2488
|
-
<title>
|
|
2488
|
+
<title>UMMAYA Insights</title>
|
|
2489
2489
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
2490
2490
|
<style>${css}</style>
|
|
2491
2491
|
</head>
|
|
2492
2492
|
<body>
|
|
2493
2493
|
<div class="container">
|
|
2494
|
-
<h1>
|
|
2494
|
+
<h1>UMMAYA Insights</h1>
|
|
2495
2495
|
<p class="subtitle">${data.total_messages.toLocaleString()} messages across ${data.total_sessions} sessions${data.total_sessions_scanned && data.total_sessions_scanned > data.total_sessions ? ` (${data.total_sessions_scanned.toLocaleString()} total)` : ''} | ${data.date_range.start} to ${data.date_range.end}</p>
|
|
2496
2496
|
|
|
2497
2497
|
${atAGlanceHtml}
|
|
@@ -2557,7 +2557,7 @@ function generateHtmlReport(
|
|
|
2557
2557
|
data.multi_clauding.overlap_events === 0
|
|
2558
2558
|
? `
|
|
2559
2559
|
<p style="font-size: 14px; color: #64748b; padding: 8px 0;">
|
|
2560
|
-
No parallel session usage detected. You typically work with one
|
|
2560
|
+
No parallel session usage detected. You typically work with one UMMAYA session at a time.
|
|
2561
2561
|
</p>
|
|
2562
2562
|
`
|
|
2563
2563
|
: `
|
|
@@ -2576,7 +2576,7 @@ function generateHtmlReport(
|
|
|
2576
2576
|
</div>
|
|
2577
2577
|
</div>
|
|
2578
2578
|
<p style="font-size: 13px; color: #475569; margin-top: 12px;">
|
|
2579
|
-
You run multiple
|
|
2579
|
+
You run multiple UMMAYA sessions simultaneously. Parallel-session usage is detected when sessions
|
|
2580
2580
|
overlap in time, suggesting parallel workflows.
|
|
2581
2581
|
</p>
|
|
2582
2582
|
`
|
|
@@ -2610,7 +2610,7 @@ function generateHtmlReport(
|
|
|
2610
2610
|
|
|
2611
2611
|
<div class="charts-row">
|
|
2612
2612
|
<div class="chart-card">
|
|
2613
|
-
<div class="chart-title">What Helped Most (
|
|
2613
|
+
<div class="chart-title">What Helped Most (UMMAYA's Capabilities)</div>
|
|
2614
2614
|
${generateBarChart(data.success, '#16a34a')}
|
|
2615
2615
|
</div>
|
|
2616
2616
|
<div class="chart-card">
|
|
@@ -2994,7 +2994,7 @@ export async function generateUsageReport(options?: {
|
|
|
2994
2994
|
const aggregated = aggregateData(substantiveSessions, substantiveFacets)
|
|
2995
2995
|
aggregated.total_sessions_scanned = totalSessionsScanned
|
|
2996
2996
|
|
|
2997
|
-
// Generate parallel insights from
|
|
2997
|
+
// Generate parallel insights from UMMAYA (6 sections)
|
|
2998
2998
|
const insights = await generateParallelInsights(aggregated, facets)
|
|
2999
2999
|
|
|
3000
3000
|
// Generate HTML report
|
|
@@ -3141,7 +3141,7 @@ ${atAGlance.quick_wins ? `**Quick wins to try:** ${atAGlance.quick_wins} See _Fe
|
|
|
3141
3141
|
${atAGlance.ambitious_workflows ? `**Ambitious workflows:** ${atAGlance.ambitious_workflows} See _On the Horizon_.` : ''}`
|
|
3142
3142
|
: '_No insights generated_'
|
|
3143
3143
|
|
|
3144
|
-
const header = `#
|
|
3144
|
+
const header = `# UMMAYA Insights
|
|
3145
3145
|
|
|
3146
3146
|
${stats}
|
|
3147
3147
|
${data.date_range.start} to ${data.date_range.end}
|
|
@@ -3152,7 +3152,7 @@ ${remoteInfo}
|
|
|
3152
3152
|
|
|
3153
3153
|
Your full shareable insights report is ready: ${reportUrl}${uploadHint}`
|
|
3154
3154
|
|
|
3155
|
-
// Return prompt for
|
|
3155
|
+
// Return prompt for UMMAYA to respond to
|
|
3156
3156
|
return [
|
|
3157
3157
|
{
|
|
3158
3158
|
type: 'text',
|