Commit graph

12 commits

Author SHA1 Message Date
mpstaton
f946973894 feat(release): 0.3.0 — three analyst-grade templates for VC/PE/equities + four infrastructure fixes for deep-research reliability
0.3.0 turns Perplexed into a serious analyst tooling layer for Venture
Capital, Private Equity, and equities-trading workflows. Three new directory
templates produce 6-9K-word cited analyst drafts in a single Perplexity
Deep Research run. Underneath them, four infrastructure fixes turn
deep-research from a brittle "might work" workflow into something you can
put real analyst time behind.

The three new templates: market-map-profile (analyst memo for Known
Category or Thesis-Driven maps), standards-and-specs-profile (open-spec
profiles with five-way authority typing and three-tier adoption framing),
market-category-profile (concept-folder reference card with three
financial-stage tiers — Incumbents / Challengers / Innovators). The four
infrastructure fixes: per-template request-timeout-ms wall-clock override
(yesterday, pressure-relief valve), structural port of per-chunk
idle-timeout discipline from the legacy modal flow into the
directory-template flow (yesterday, structural fix), per-template
max-tokens Perplexity output-budget override (today, fixes silent
clean-truncation when finish_reason=length fires mid-template), and a
strengthened mermaid-discipline partial plus new latex-discipline partial
(today, fixes the 4-of-5 broken-Mermaid rate via paired BAD/GOOD examples
and a six-item pre-emit self-check).

New templates (src/docs/templates/):
- market-map-profile.md — sonar-deep-research, request-timeout-ms 2400000
  (40-min ceiling), max-tokens 24000. Anti-incumbent editorial stance.
- standards-and-specs-profile.md — sonar-deep-research, request-timeout-ms 0
  (idle-only safety), max-tokens 24000. Five-way authority typing, named
  editors, stewardship transitions, named critics.
- market-category-profile.md — sonar-deep-research, request-timeout-ms 0,
  max-tokens 24000. Three-tier financial-stage framing, separate Why Now
  and What's Happening sections, Industry Coverage sub-grouped into
  Market Reports / Industry Articles / Financial News.

Rendering-discipline partials (src/docs/partials/):
- mermaid-discipline.md rewritten — paired BAD/GOOD examples throughout,
  the &amp; escape rule, explicit \n vs <br/> ban, six-item self-check
  before emit, simplify-rather-than-break ethos. Original ~250 tokens
  expanded to ~440.
- latex-discipline.md new — Obsidian MathJax delimiters and \$ escaping
  in prose to avoid accidental inline-math spans.
- concept-profile.md wired in {{include: latex-discipline}} alongside the
  existing {{include: mermaid-discipline}}, placed immediately after the
  "render a mermaid codefence here" instruction so the rules are in scope
  at the moment of generation.

Streaming, timeout, and output-budget infrastructure (src/services/
directoryTemplateService.ts):
- streamPerplexityToFile now races each reader.read() against a fresh
  per-chunk idle timer (270s deep-research, 90s normal — matches the
  legacy modal flow at perplexityService.ts:659). Closes the
  "Wall-clock-timeout cuts off long deep-research streams" issue.
- request-timeout-ms cft override is now the optional absolute wall-clock
  ceiling (belt-and-suspenders backstop on top of the idle timer);
  explicit 0 disables.
- max-tokens cft override added to buildPayload — passes through to
  Perplexity's max_tokens parameter; lifts the silent ~8K-token default
  ceiling that was clean-truncating thorough drafts via finish_reason:
  length.

Documentation (README.md, docs/directory-templates.md):
- README — new top-level section "For Venture Capital, Private Equity, and
  Equities-Trading Workflows" with a five-row table mapping each analyst
  workflow to the template that produces it. Directory Templates section
  updated to seven shipped templates plus the new per-template cft-block
  knobs.
- docs/directory-templates.md — new "Per-template max-tokens override"
  section with the diagnostic table for distinguishing wall-clock-timeout
  truncation (mid-sentence cutoff, no sources footer) from max_tokens
  truncation (clean section-end, full sources footer). The diagnostic
  vocabulary that did not exist before this release.

Seeding (src/services/templateSeederService.ts):
- Registered all three new templates plus the new latex-discipline partial
  so they auto-seed into vaults on first plugin load and appear in
  Re-seed runs.

Version bump (manifest.json, package.json, versions.json):
- 0.2.1 to 0.3.0. minAppVersion unchanged at 1.8.10.

Engineering changelog entries (changelog/):
- 2026-05-26_02.md — the structural idle-timeout port.
- 2026-05-27_01.md — the two new templates, max-tokens override, and
  rendering-discipline partial work. Includes the diagnostic-led
  narrative on the vault-drift bug that caused the 4-of-5 broken-Mermaid
  rate.

Release narratives:
- changelog/releases/0.3.0.md — full marketing-quality release narrative
  with frontmatter, four-audience cascade, three diagnostic-led stories
  (streaming-timeout, max_tokens, rendering-discipline), explicit upgrade
  notes including the vault-drift warning, three deferred items for 0.4.x.
- release-notes/0.3.0.md — prose-only release-page body picked up by the
  release.yml workflow when the 0.3.0 tag is pushed. Tighter cut of the
  same narrative, suited for the GitHub release page.

Context-v stamp:
- context-v/issues/Wall-Clock-Timeout-Cuts-Off-Long-Deep-Research-Streams.md
  marked status: resolved, date_resolved 2026-05-26, with the four open
  items reorganized into "what landed" (3 of 4) and "deferred follow-ups"
  (cross-service audit, settings-pane exposure, deep-research detection
  robustness).

Files changed:
- manifest.json, package.json, versions.json
- README.md, docs/directory-templates.md
- src/services/directoryTemplateService.ts
- src/services/templateSeederService.ts
- src/docs/templates/README.md
- src/docs/templates/concept-profile.md
- src/docs/templates/market-map-profile.md
- src/docs/templates/market-category-profile.md (new)
- src/docs/templates/standards-and-specs-profile.md (new)
- src/docs/partials/mermaid-discipline.md
- src/docs/partials/latex-discipline.md (new)
- changelog/2026-05-26_02.md (new)
- changelog/2026-05-27_01.md (new)
- changelog/releases/0.3.0.md (new)
- release-notes/0.3.0.md (new)
- context-v/issues/Wall-Clock-Timeout-Cuts-Off-Long-Deep-Research-Streams.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 17:41:13 -05:00
mpstaton
96df70595f feat(directory-templates): market-map analyst profile + per-template request-timeout-ms cft override
A new shipped template aimed at analyst-grade market maps (Known Category and Thesis-Driven flavors), and the timeout refactor that came out of running it against a real 7-8K-word draft and watching the wall-clock AbortController truncate the tail mid-sentence. The two ship together because the template surfaced the bug — running market-map-profile on lost-in-public/market-maps/Humanoid Robots and their Input Industries.md was the first observable instance of the wall-clock pathology — and they're both groundwork for the multi-stage Claude+Perplexity+RAG pipeline the exploration doc now sketches.

Impact: a fifth shipped template auto-seeded into Content-Dev/Templates/ on first plugin load (and re-seedable from settings), running on sonar-deep-research with return-images off by design; templates can override the plugin-level wall-clock timeout per-template via a new cft-block key; the plugin-level default jumped from 10 min to 30 min because the old default was tuned for short concept-profile runs and was cutting off any deep-research template that took its time. Existing four templates are unchanged in behavior — they don't declare the override and inherit the new 30-min default, which they all finish comfortably under.

Market-map template (src/docs/templates/market-map-profile.md):
- Heading skeleton: Market Snapshot, The Question this Map Answers, Why Now, Map of the Market, Lighthouse Examples, Innovator Profiles (Link/Offering/Funding/Why/Coverage cards + per-sub-segment summary table), Media-Voices-Coverage, Market Dynamics (Sizing, Adoption, Capital Flow), Frontier and Open Questions, Adjacent Concepts.
- Dual-flavor: the system prompt has the model pick between Known Category (Humanoid Robots, Quantum Computing) and Thesis-Driven (e.g. Neural Network Hardware as Brains for Robotics) based on title and tags.
- Anti-incumbent editorial stance copied from the concept template family — cap big tech at 1 of 5-10 in every sub-bucket, attribute innovation to startups/labs/founders.
- Declares request-timeout-ms: 2400000 (40 min) with an inline comment explaining the budget — the only shipped template that overrides the plugin default today.
- Registered in templateSeederService.ts so first-load seeding and the Re-seed button both pick it up; surfaced in src/docs/templates/README.md and docs/directory-templates.md.

Timeout refactor (src/services/directoryTemplateService.ts, main.ts):
- Per-template cft-block key request-timeout-ms: accepts number or numeric string, silently falls back on non-positive / non-numeric values, otherwise wins over the plugin-level setting for that template's runs. Resolution code sits just before the streamPerplexityToFile call so the rest of the streaming primitive is untouched.
- Plugin default directoryTemplatesRequestTimeoutMs bumped 600000 → 1800000 (10 min → 30 min). Settings-pane description rewritten to call out the override and the cost framing ("$10-$50 of analyst time per good output is worth waiting for").
- Structural fix (idle-timeout discipline ported from perplexityService.ts:659-668, where the legacy modal flow already does it correctly) is filed as its own open issue, not in scope for this commit.

Context-v writing:
- context-v/explorations/Multi-Stage-Cooperative-Claude-and-Perplexity-with-RAG.md — three architectures weighed (zoned single-file appends, multi-doc folder per market map, per-section cft-section blocks), an include-sources YAML schema proposed covering vault paths/globs and Chroma queries, and the "Perplexity and Claude do not overwrite each other until editing" heuristic translated into three implementation strictness levels. Recommends Option A (zoned appends) for v1.
- context-v/issues/Wall-Clock-Timeout-Cuts-Off-Long-Deep-Research-Streams.md — the Humanoid Robots truncation as motivating symptom, side-by-side diagnosis of the two timeout disciplines in the codebase (wall-clock here, per-chunk idle in the legacy modal), the partial fix shipped today, why it's only partial, the structural-fix proposal, and four pre-spec open items. Cross-linked both ways to the exploration so the issue is reachable from either entry point.

Files changed:
- src/docs/templates/market-map-profile.md (new)
- src/services/templateSeederService.ts
- src/services/directoryTemplateService.ts
- main.ts
- src/docs/templates/README.md
- docs/directory-templates.md
- context-v/explorations/Multi-Stage-Cooperative-Claude-and-Perplexity-with-RAG.md (new)
- context-v/issues/Wall-Clock-Timeout-Cuts-Off-Long-Deep-Research-Streams.md (new)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 17:08:43 -05:00
mpstaton
1d73243ef6 feat(directory-templates): partials + preambles — vault-visible shared rules, plus fix that resurrected 11 hidden settings sections
Two threads bundled because they were one session's work and the changelog tells the joined story:

1. PARTIALS + PREAMBLES — shared guidance moves out of TypeScript constants and out of duplicated template blocks into vault-visible markdown that templates pull in by name.

Three peer folders under templatesRoot's parent:
  zz-cf-lib/templates/   (existing — your four profile templates)
  zz-cf-lib/partials/    (new — pulled in via {{include: name}})
  zz-cf-lib/preambles/   (new — auto-attached to every Perplexity request)

What moved:
- INLINE_CITATION_DIRECTIVE  → src/docs/preambles/inline-citation.md
- IMAGE_PLACEMENT_DIRECTIVE  → src/docs/preambles/image-placement.md
- buildResearchFraming()     → src/docs/preambles/research-framing.md
- mermaid syntax discipline block (was duplicated across all four profile templates) → src/docs/partials/mermaid-discipline.md

New engine surface in src/services/directoryTemplateService.ts:
- expandIncludes(app, text, partialsRoot) — async, recursive, max depth 5, cycle-detected. Missing partials surface as inline [[include: <name> — file not found]] markers; cycles as [[include: <name> — cycle detected]].
- loadPreamble(app, preamblesRoot, name) — vault first, bundled default fallback with console.warn.
- parsePreambleOverrides(cftConfig) — per-template { system, skip-user, skip-all } in the cft fence.
- applyTemplate refactored: expand-then-interpolate for cftSystem and userSkeleton; preambles resolved (each expanded + interpolated) then assembled before sending.

DirectoryTemplateSettings extended with partialsRoot, preamblesRoot, systemPreambles, userPreambles. PerplexedPluginSettings + DEFAULT_SETTINGS mirror these (defaults: zz-cf-lib/partials, zz-cf-lib/preambles, [inline-citation], [{research-framing,always},{image-placement,return-images}]). Four new settings-tab rows expose them. buildDirectoryTemplateSettings() helper replaces two duplicated dirSettings literals.

templateSeederService.ts rewritten around a shared seedFolder() helper. Now seeds three folders (templates / partials / preambles) with the same idempotent rule (README always; content files only when target folder is missing or empty). Exports BUNDLED_PREAMBLES for runtime fallback when a vault preamble file is absent. seedTemplatesIfMissing and reSeedMissingFiles both take optional partialsRoot/preamblesRoot args.

The four bundled profile templates now reference {{include: mermaid-discipline}} in place of the previously-duplicated checklist block.

2. SETTINGS-UI FIX — eight call sites in main.ts had activeDocument.createEl('textarea'), an Obsidian global that's undefined in current Obsidian versions. The first one threw at the Perplexity "Request body template" textarea and aborted PerplexedSettingTab.display() before any of the other 11 sections (Claude, Perplexica/Vane, LM Studio, prompt blocks, Directory templates, Find Images) could mount. All eight switched to containerEl.createEl, matching every other DOM operation in the file. Settings tab now renders end-to-end.

Build green: pnpm build (eslint + tsc + esbuild production) exits 0.

Architecture review and design rationale captured at content-farm/context-v/issues/Partials-And-Preambles-For-Perplexed-Templates.md before implementing.

Vault-seeding caveat unchanged: existing vault templates won't auto-replace on plugin update. Copy the four updated bundled templates into your vault manually (or delete + reload) to pick up the {{include: …}} directive; the seeder will create zz-cf-lib/partials/ and zz-cf-lib/preambles/ on next plugin load.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 20:14:04 -05:00
mpstaton
4483a8caa4 fix(perplexed): instruct Sonar to emit inline [N] citation markers
Perplexity's Sonar API stopped embedding inline citation markers in
message.content; responses now return prose plus separate citations
and search_results arrays. The plugin's addCitations() rendered a
correct bibliography, but the body had nothing to anchor the numbers
to.

Prepend a system message telling the model to append [1], [2], ...
markers inline, ordered to match search_results. All three payload
build sites now share one messagesWithSystem array.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 00:26:23 -05:00
mpstaton
68edd23359 add(reminder): seed Obsidian-API-docs reminder for context-v
Adds a context-v/reminders/ note that points future humans and AI agents
to the canonical Obsidian API source of truth and lists the most common
community plugin review-bot rejection reasons. Same canonical reminder is
being seeded across every plugin in the content-farm ecosystem so the
content-farm splash's rolled-up context-v feed has reminders surfacing
from every plugin once the GitHub Content API loader lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 21:35:31 -05:00
mpstaton
be2fad757b docs(context-v): track provider-rebrand naming issue
Adds the Updating-Naming-to-Reflect-Provider-Rebrand issue note that
documents the surfaces touched by the Perplexica/Vane rename and the
ones intentionally left as internal symbols.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 19:53:05 -05:00
mpstaton
14962edde1 meet(requirements): misc changes related to meeting Obsidian plugin community requirements
Six docs-derived blockers fixed in one pass; punch-list plan filed
under context-v/plans/ for traceability.

manifest.json
- description rewritten: action-verb start (was "A plugin for
  Obsidian…", which the docs call out as an anti-pattern), all four
  providers named (Perplexity, Anthropic Claude, Perplexica, LM
  Studio), 144 chars, ends with period.
- fundingUrl removed — was pointed at the company website, not a
  donation service. Docs: "If you don't accept donations, remove
  fundingUrl from your manifest."

main.ts
- Three command IDs un-prefixed: 'perplexed-debug-commands' →
  'debug-commands', 'perplexed-reset-prompts' → 'reset-prompts',
  'perplexed-reinitialize-services' → 'reinitialize-services'.
  Obsidian auto-prefixes commands with the plugin id, so the
  doubled form would have registered as 'perplexed.perplexed-…'.
- Deleted the top-level <h2>Perplexed Plugin Settings</h2> from the
  settings tab. Docs: "Avoid adding a top-level heading in the
  settings tab, such as 'General', 'Settings', or the name of your
  plugin."

README.md
- Placeholder URLs replaced with the real lossless-group/perplexed-plugin
  repo (clone command, Issues link x2, Discussions link).
- Stale "Version: 0.0.0.1" footer line deleted (manifest is the
  source of truth).
- New "## Network use and accounts" section: per-provider table with
  endpoint, account requirement, and API-key requirement, plus an
  explicit no-telemetry / no-self-update statement. Required by
  Developer Policies (network-use disclosure + paid-account
  disclosure). Key Features bullet updated to mention Claude.

context-v/plans/2026-05-02_Submission-Blockers-Punch-List.md
- New plan documenting the audit findings: six blockers fixed here,
  four will-be-flagged items (7-10: settings <h3>/<h4> → setHeading,
  sentence case, console.log hygiene, vault.adapter.write in
  logger.ts) deferred to a separate pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 20:34:40 -05:00
mpstaton
19b300c10c improve(modals): upgrade Perplexical Modal UI, context and changelogs
On branch development
 Your branch is up to date with 'origin/development'.
 Changes to be committed:
	new file:   changelog/2026-04-30_01.md
	new file:   changelog/2026-05-01_01.md
	modified:   changelog/2026-05-02_01.md
	modified:   context-v/specs/Using-Files-as-Prompt-Outlines.md
	modified:   src/modals/PerplexicaModal.ts
	modified:   src/styles/perplexica-modal.css
	modified:   styles.css
2026-05-02 17:07:10 -05:00
mpstaton
46e4f24755 align(requirements): align Perplexed to Obsidian's plugin community
standards

 On branch development
 Your branch is up to date with 'origin/development'.
 Changes to be committed:
	new file:   LICENSE
	new file:   context-v/plans/20206-05-02_Assuring-Obsidian-Community-Plugin-Requirements.md
	modified:   eslint.config.mjs
	modified:   main.ts
	modified:   manifest.json
	modified:   package.json
	modified:   src/modals/ArticleGeneratorModal.ts
	modified:   src/modals/ClaudeModal.ts
	modified:   src/modals/LMStudioModal.ts
	modified:   src/modals/PerplexicaModal.ts
	modified:   src/modals/PerplexityModal.ts
	modified:   src/modals/TextEnhancementModal.ts
	modified:   src/modals/TextEnhancementWithImagesModal.ts
	modified:   src/modals/URLUpdateModal.ts
	modified:   src/services/lmStudioService.ts
	modified:   src/services/perplexicaService.ts
	modified:   src/services/perplexityService.ts
	modified:   src/types/obsidian.d.ts
	new file:   src/utils/coerce.ts
	modified:   src/utils/formatDate.ts
	modified:   src/utils/logger.ts
	modified:   styles.css
	modified:   versions.json
2026-05-02 14:46:59 -05:00
mpstaton
d7551d7bc7 stuck(model): stuck trying to get model Claude API working
On branch development
 Your branch is up to date with 'origin/development'.
 Changes to be committed:
	new file:   .logs/obsidian.md-1777711786079.log
	modified:   context-v/issue-resolutions/Getting-Claude-to-Respond-With-Research.md
	new file:   context-v/specs/Using-Files-as-Prompt-Outlines.md
	modified:   src/modals/ArticleGeneratorModal.ts
	modified:   src/modals/ClaudeModal.ts
	modified:   src/modals/PerplexityModal.ts
	modified:   src/services/claudeService.ts
	modified:   src/styles/article-generator-modal.css
	modified:   src/styles/perplexity-modal.css
	modified:   styles.css
2026-05-02 04:18:53 -05:00
mpstaton
b5a70c72a4 stuck(claude): claude not returning research citations or reference
definitions, just plain text

 On branch development
 Your branch is ahead of 'origin/development' by 1 commit.
   (use "git push" to publish your local commits)
 Changes to be committed:
	new file:   context-v/issue-resolutions/Getting-Claude-to-Respond-With-Research.md
	new file:   context-v/issue-resolutions/Widen-Modals-in-Obsidian-using-CSS.md
	modified:   package.json
2026-05-02 03:38:03 -05:00
mpstaton
9d5bc80ecf progress(model-provider): attempt to add new model, claude. Struggling
with getting returned research objects.

 On branch development
 Your branch is up to date with 'origin/development'.
 Changes to be committed:
	new file:   context-v/reminders/Ideal-and-Overkill-Schema-for-Max-Flexibility.md
	modified:   main.ts
	modified:   package.json
	modified:   pnpm-lock.yaml
	new file:   src/modals/ClaudeModal.ts
	new file:   src/services/claudeService.ts
	new file:   src/styles/claude-modal.css
	modified:   src/styles/main.css
	modified:   styles.css
2026-05-02 03:18:11 -05:00