@buildaharness/aielia 0.3.9 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/_memory-core-generated.d.ts +6 -0
  2. package/dist/assistant.d.ts +11 -0
  3. package/dist/{bin-CCwDFxDe.js → bin-Cz3FY6Ew.js} +30 -11
  4. package/dist/bin-Cz3FY6Ew.js.map +1 -0
  5. package/dist/claude-cli-llm-client.d.ts +2 -0
  6. package/dist/claude-cli-prompt.d.ts +7 -0
  7. package/dist/cli.js +1 -1
  8. package/dist/fact-repository.contract.d.ts +2 -0
  9. package/dist/fact-repository.d.ts +44 -0
  10. package/dist/file-tools-mcp-server.mjs +29 -0
  11. package/dist/harness-bridge.d.ts +5 -5
  12. package/dist/html-to-markdown.d.ts +11 -0
  13. package/dist/index.d.ts +82 -2
  14. package/dist/index.js +4975 -173
  15. package/dist/index.js.map +1 -1
  16. package/dist/layer-settings.d.ts +16 -3
  17. package/dist/memory-events.d.ts +177 -0
  18. package/dist/memory-service.d.ts +15 -0
  19. package/dist/model-pricing.d.ts +3 -0
  20. package/dist/{provider-setup-Cy9dwqrd.js → provider-setup-DG8iYm_F.js} +5756 -4787
  21. package/dist/provider-setup-DG8iYm_F.js.map +1 -0
  22. package/dist/scripted-llm-client.d.ts +1 -1
  23. package/dist/{tui-app-Dt72u8vZ.js → tui-app-oWbIUcBW.js} +3 -3
  24. package/dist/{tui-app-Dt72u8vZ.js.map → tui-app-oWbIUcBW.js.map} +1 -1
  25. package/dist/turn-abort.d.ts +5 -0
  26. package/dist/version.d.ts +1 -1
  27. package/dist/web-fetch-core.d.ts +0 -14
  28. package/dist/writer/article-autosave.d.ts +12 -0
  29. package/dist/writer/article-change-summary.d.ts +28 -0
  30. package/dist/writer/article-claims.d.ts +49 -0
  31. package/dist/writer/article-comments.d.ts +20 -0
  32. package/dist/writer/article-consistency.d.ts +27 -0
  33. package/dist/writer/article-decorations.d.ts +23 -0
  34. package/dist/writer/article-dependencies.d.ts +44 -0
  35. package/dist/writer/article-draft.d.ts +23 -0
  36. package/dist/writer/article-edit-outline.d.ts +16 -0
  37. package/dist/writer/article-edit-suggest.d.ts +30 -0
  38. package/dist/writer/article-folder.d.ts +29 -0
  39. package/dist/writer/article-history.d.ts +73 -0
  40. package/dist/writer/article-ideas.d.ts +34 -0
  41. package/dist/writer/article-issues.d.ts +47 -0
  42. package/dist/writer/article-marks.d.ts +25 -0
  43. package/dist/writer/article-memory-store.d.ts +3 -0
  44. package/dist/writer/article-model.d.ts +1337 -0
  45. package/dist/writer/article-outline.d.ts +43 -0
  46. package/dist/writer/article-resolver.d.ts +55 -0
  47. package/dist/writer/article-revisions.d.ts +30 -0
  48. package/dist/writer/article-rules.d.ts +60 -0
  49. package/dist/writer/article-sections.d.ts +26 -0
  50. package/dist/writer/article-selection.d.ts +26 -0
  51. package/dist/writer/article-service.d.ts +542 -0
  52. package/dist/writer/article-source-links.d.ts +42 -0
  53. package/dist/writer/article-sources.d.ts +82 -0
  54. package/dist/writer/article-style-derive.d.ts +26 -0
  55. package/dist/writer/article-style.d.ts +31 -0
  56. package/dist/writer/article-suggestions.d.ts +33 -0
  57. package/dist/writer/article-support.d.ts +33 -0
  58. package/dist/writer/article-verify.d.ts +42 -0
  59. package/dist/writer/local-folder.d.ts +49 -0
  60. package/dist/writer/model-failure-hint.d.ts +7 -0
  61. package/dist/writer/repo-reader.d.ts +29 -0
  62. package/dist/writer/repo-search.d.ts +33 -0
  63. package/dist/writer/repo-verify-loop.d.ts +61 -0
  64. package/dist/writer/text-tool-calls.d.ts +11 -0
  65. package/dist/writer/work-progress.d.ts +51 -0
  66. package/dist/writer/write-activity.d.ts +61 -0
  67. package/dist/writer/write-models.d.ts +12 -0
  68. package/dist/writer/write-parameters.d.ts +31 -0
  69. package/dist/writer/write-permissions.d.ts +89 -0
  70. package/dist/writer/write-spend.d.ts +16 -0
  71. package/dist/writer/writer-chat-capture.d.ts +25 -0
  72. package/dist/writer/writer-chat-history.d.ts +17 -0
  73. package/dist/writer/writer-chat-state.d.ts +358 -0
  74. package/dist/writer/writer-chat-turn.d.ts +52 -0
  75. package/dist/writer/writer-intent.d.ts +20 -0
  76. package/package.json +3 -3
  77. package/dist/bin-CCwDFxDe.js.map +0 -1
  78. package/dist/provider-setup-Cy9dwqrd.js.map +0 -1
@@ -87,6 +87,8 @@ export interface ClaudeCliLLMClientOptions {
87
87
  * turn was free" without that context.
88
88
  */
89
89
  export declare class ClaudeCliLLMClient implements ILLMClient {
90
+ /** Runs its own tool loop inside `claude -p`; it cannot return tool calls to a caller's loop, so those callers use text tool calls (see writer/text-tool-calls.ts). */
91
+ readonly nativeToolCalls = false;
90
92
  private readonly claudePath;
91
93
  private readonly fileTools?;
92
94
  private readonly remindersFile?;
@@ -84,3 +84,10 @@ export declare function stripJsonCodeFence(content: string): string;
84
84
  */
85
85
  export declare function primaryModelFromUsage(modelUsage: Record<string, unknown> | undefined): string | undefined;
86
86
  export declare function parseClaudeCliOutput(stdout: string): ParsedClaudeCliOutput;
87
+ /**
88
+ * What to say when `claude` exits with a failure. The CLI prints its own error on stderr for some failures, but with `--output-format json`
89
+ * it reports others (a logged-out session: "Not logged in · Please run /login") as `{"is_error":true,"result":"..."}` on stdout and leaves
90
+ * stderr empty, so reading stderr alone lost the reason and left only "exited with code 1". The desktop shell's Rust twin
91
+ * (`claude_failure_message` in lib.rs) follows the same order.
92
+ */
93
+ export declare function claudeFailureMessage(stdout: string, stderr: string, code: number | string | null): string;
package/dist/cli.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import "./bin-CCwDFxDe.js";
2
+ import "./bin-Cz3FY6Ew.js";
3
3
  //# sourceMappingURL=cli.js.map
@@ -0,0 +1,2 @@
1
+ import { FactRepository } from './fact-repository.js';
2
+ export declare function runFactRepositoryContract(name: string, make: () => FactRepository): void;
@@ -0,0 +1,44 @@
1
+ import { MemoryAdapter } from '@buildaharness/runtime';
2
+ /** One list to replace. `value: null` removes the list (distinct from an empty list, so an undo can restore "absent"). */
3
+ export interface FactChange {
4
+ key: string;
5
+ value: unknown[] | null;
6
+ }
7
+ /** Thrown by `apply()` when `expectedVersion` is not the repository's current version. */
8
+ export declare class VersionConflictError extends Error {
9
+ readonly expected: number;
10
+ readonly actual: number;
11
+ constructor(expected: number, actual: number);
12
+ }
13
+ export interface FactQuery<T> {
14
+ /** Keep only rows for which this returns true (status, tier, attribute key and project are all row predicates). */
15
+ where?: (row: T) => boolean;
16
+ }
17
+ export interface FactRepository {
18
+ /** Monotonic counter, bumped by every successful `apply`/`put`/`remove`/`appendEvents`. */
19
+ version(): number;
20
+ /** The whole list stored under `key`, `[]` when absent. */
21
+ list<T>(key: string, query?: FactQuery<T>): Promise<T[]>;
22
+ /** The first row under `key` whose id (from `idOf`) equals `id`. */
23
+ get<T>(key: string, id: string, idOf: (row: T) => string): Promise<T | undefined>;
24
+ /** Replace several lists as one commit: all land or none do. Throws `VersionConflictError` if `expectedVersion` is stale. */
25
+ apply(changes: FactChange[], expectedVersion?: number): Promise<number>;
26
+ /** Single-list shorthands for `apply`. */
27
+ put(key: string, value: unknown[]): Promise<void>;
28
+ remove(key: string): Promise<void>;
29
+ /** Append to an ordered event list in one step, then let `trim` bound it. Order of appends is preserved. */
30
+ appendEvents<T>(key: string, events: T[], trim?: (all: T[]) => T[]): Promise<T[]>;
31
+ }
32
+ /** Today's behaviour: each list lives under its own `MemoryAdapter` key. The version is per instance (one process). */
33
+ export declare class KeyValueFactRepository implements FactRepository {
34
+ private readonly store;
35
+ private ver;
36
+ constructor(store: MemoryAdapter);
37
+ version(): number;
38
+ list<T>(key: string, query?: FactQuery<T>): Promise<T[]>;
39
+ get<T>(key: string, id: string, idOf: (row: T) => string): Promise<T | undefined>;
40
+ apply(changes: FactChange[], expectedVersion?: number): Promise<number>;
41
+ put(key: string, value: unknown[]): Promise<void>;
42
+ remove(key: string): Promise<void>;
43
+ appendEvents<T>(key: string, events: T[], trim?: (all: T[]) => T[]): Promise<T[]>;
44
+ }
@@ -758,6 +758,25 @@ export function createReminder(remindersFile, rawText) {
758
758
  return run
759
759
  }
760
760
 
761
+ /**
762
+ * Eval harness only. `BENCHMARK_TOOL_FAILURE` (JSON `{"remaining": N, "symptom": "..."}`) makes the first N
763
+ * read_file / list_directory calls of this subprocess fail with the symptom text; unset (the product case) it
764
+ * is inert. The benchmark's `bare` arm uses it because its tool calls resolve in here, out of process. The
765
+ * parent re-arms it per `claude -p` invocation with the failures still owed.
766
+ */
767
+ export const BENCHMARK_DEFAULT_SYMPTOM = 'injected: persistent tool failure (ETIMEDOUT)'
768
+ let benchmarkFailuresTaken = 0
769
+ export function resetBenchmarkToolFailureForTests() { benchmarkFailuresTaken = 0 }
770
+ export function takeBenchmarkToolFailure(env = process.env) {
771
+ const raw = env.BENCHMARK_TOOL_FAILURE
772
+ if (!raw) return undefined
773
+ let spec
774
+ try { spec = JSON.parse(raw) } catch { return undefined }
775
+ if (!spec || !(Number(spec.remaining) > benchmarkFailuresTaken)) return undefined
776
+ benchmarkFailuresTaken += 1
777
+ return typeof spec.symptom === 'string' && spec.symptom ? spec.symptom : BENCHMARK_DEFAULT_SYMPTOM
778
+ }
779
+
761
780
  async function main() {
762
781
  const workspaceRoot = process.env.WORKSPACE_ROOT
763
782
  if (!workspaceRoot) {
@@ -784,6 +803,11 @@ async function main() {
784
803
  if (gate.decision === 'deny') {
785
804
  return { content: [{ type: 'text', text: `Denied: ${gate.reason ?? 'not permitted by tool policy'}` }], isError: true }
786
805
  }
806
+ const injected = takeBenchmarkToolFailure()
807
+ if (injected !== undefined) {
808
+ await reportToolResult('read_file', { path }, `Error: ${injected}`, false)
809
+ return { content: [{ type: 'text', text: `Error: ${injected}` }], isError: true }
810
+ }
787
811
  const resolved = await resolveAndVerify(workspaceRoot, path)
788
812
  const content = await readFile(resolved, 'utf-8').catch((err) => {
789
813
  if (isEnoent(err)) return undefined
@@ -816,6 +840,11 @@ async function main() {
816
840
  if (gate.decision === 'deny') {
817
841
  return { content: [{ type: 'text', text: `Denied: ${gate.reason ?? 'not permitted by tool policy'}` }], isError: true }
818
842
  }
843
+ const injected = takeBenchmarkToolFailure()
844
+ if (injected !== undefined) {
845
+ await reportToolResult('list_directory', { path }, `Error: ${injected}`, false)
846
+ return { content: [{ type: 'text', text: `Error: ${injected}` }], isError: true }
847
+ }
819
848
  const resolved = await resolveAndVerify(workspaceRoot, path)
820
849
  const names = await readdir(resolved).catch((err) => {
821
850
  if (isEnoent(err)) return []
@@ -11,11 +11,11 @@ import { AssistantProgress } from './assistant-types.js';
11
11
  import { TraceEvent } from './trace-events.js';
12
12
  import { EscalationPlan } from './layer-policy-wiring.js';
13
13
  /**
14
- * `AUDIT_VERIFICATION` gate — feature-value audit (Phase C5 of the internal plan). EVAL-ONLY:
15
- * default **ON** (an unset / empty / truthy value keeps today's always-on verification). Only the
16
- * benchmark's `verificationOff` arm sets a falsy value (`0` / `false` / `off` / `no` / `disabled`),
17
- * which makes `HarnessBridge.run` pass `skipVerification: true` to HarnessRuntime. Read at exactly
18
- * one call site (below); no product path sets it. Same shape as `semanticContradictionEnabled()`.
14
+ * `AUDIT_VERIFICATION` gate — feature-value audit (Phase C5 of the internal plan). Default **ON** (an
15
+ * unset / empty / truthy value keeps today's always-on verification). A falsy value (`0` / `false` /
16
+ * `off` / `no` / `disabled`) makes `HarnessBridge.run` pass `skipVerification: true` to HarnessRuntime.
17
+ * Set by the benchmark's `verificationOff` arm and by the user's `mandatory_verification` layer setting
18
+ * (`layer-settings.ts`). Read at exactly one call site (below). Same shape as `semanticContradictionEnabled()`.
19
19
  */
20
20
  export declare function verificationEnabled(env?: Record<string, string | undefined>): boolean;
21
21
  /**
@@ -0,0 +1,11 @@
1
+ /**
2
+ * HTML to markdown for pulling a page in to edit: no DOM, so it runs in the shared code. It keeps the structure an article has (headings, paragraphs,
3
+ * lists, quotes, code, links, emphasis) and drops what is not the article (scripts, styles, navigation, headers and footers outside the main text,
4
+ * forms, comments). When the page has a <main> or <article>, only that is used. It is a reader, not a parser of every page on the web: odd markup
5
+ * comes out as plain paragraphs.
6
+ */
7
+ /** True when the text is an HTML document or fragment (it has a structural tag near its start). */
8
+ export declare function looksLikeHtml(text: string): boolean;
9
+ export declare function htmlToMarkdown(html: string): string;
10
+ /** The page's own title from its <title>, with a trailing site name (after a pipe, dash or colon) removed; undefined when it has none. */
11
+ export declare function htmlTitle(html: string): string | undefined;
package/dist/index.d.ts CHANGED
@@ -3,6 +3,8 @@ export type { AssistantTurnResult, ProposerKind, PersonalAssistantOptions, Assis
3
3
  export type { MemoryStatus, MemoryInjection, AuditEntry, ConsolidationOutcome } from './memory-service.js';
4
4
  export type { ConsolidationProposal } from './memory-consolidation.js';
5
5
  export type { SessionDigest } from './episodic-digest.js';
6
+ export type { MemoryEvent, MemoryEventKind, ReasonCode, SourceRef, EventSink, EventFilter } from './memory-events.js';
7
+ export { InMemoryEventSink, MemoryEventSchema, factKey, foldDurable, filterEvents, formatMemoryEvents } from './memory-events.js';
6
8
  export type { MemoryWriteMode } from './memory-governance.js';
7
9
  export { MEMORY_WRITE_MODES, DEFAULT_MEMORY_WRITE_MODE, resolveMemoryWriteMode } from './memory-governance.js';
8
10
  export type { GoalGraphState, GoalThreadView, GoalThreadVisibility, GoalTaskSummary } from './goal-graph-service.js';
@@ -47,7 +49,7 @@ export { WEB_TOOLS, WEB_SEARCH_TOOL, FETCH_URL_TOOL, executeWebTool, assertPubli
47
49
  export type { WebToolsContext, WebToolResult, WebSearchResult, DnsResolver } from './web-tools.js';
48
50
  export { braveSearch } from './web-search-provider.js';
49
51
  export type { BraveSearchOptions } from './web-search-provider.js';
50
- export { buildClaudePrompt, stripJsonCodeFence, parseClaudeCliOutput, ALREADY_STAGED_ACTION_TOOL, stagedActionInput } from './claude-cli-prompt.js';
52
+ export { buildClaudePrompt, claudeFailureMessage, stripJsonCodeFence, parseClaudeCliOutput, ALREADY_STAGED_ACTION_TOOL, stagedActionInput } from './claude-cli-prompt.js';
51
53
  export type { ParsedClaudeCliOutput } from './claude-cli-prompt.js';
52
54
  export { stripMcpToolPrefix, summarizeToolStep, summarizeSettledToolStep } from './tool-step.js';
53
55
  export type { AssistantToolStep } from './tool-step.js';
@@ -65,7 +67,7 @@ export type { PlanRecord, PlanTaskRecord, PlanPosition, PlanMode } from './plan-
65
67
  export type { PlanDecision, PlanApprovalEdits } from './plan-approval-service.js';
66
68
  export { resolveConfig, validateConfig, ConfigValidationError, DEFAULT_CONFIG, CONFIG_KEYS } from './config.js';
67
69
  export type { AssistantConfig, ConfigStore, ResolvedConfig } from './config.js';
68
- export { LAYER_SETTINGS, applyLayerSettings, effectiveState, withLayerChoice, sanitizeLayerChoices, formatLayerListing, findLayer, isToggleable, LayerSettingError } from './layer-settings.js';
70
+ export { LAYER_SETTINGS, applyLayerSettings, effectiveState, withLayerChoice, sanitizeLayerChoices, formatLayerListing, findLayer, followersOf, unmetRequirements, layerWarnings, isToggleable, LayerSettingError } from './layer-settings.js';
69
71
  export type { LayerSetting, LayerGroup, LayerChoices, AppliedLayers } from './layer-settings.js';
70
72
  export { resolveOneLoopMode, normalizeOneLoopMode, DEFAULT_ONE_LOOP_MODE } from './one-loop-flag.js';
71
73
  export type { OneLoopMode } from './one-loop-flag.js';
@@ -100,3 +102,81 @@ export type { CostSummaryInfo, DoctorCheck } from './cli-session.js';
100
102
  export { estimateCostUsd } from './model-pricing.js';
101
103
  export { PROVIDER_SETUP, getProviderSetup, cleanApiKey, checkApiKeyFormat, testApiKey } from './provider-setup.js';
102
104
  export type { KeyedBackend, ProviderSetupInfo, KeyTestResult } from './provider-setup.js';
105
+ export { WriterChatStateSchema, WriterCommentSchema, WriterCorrectionSchema, WRITER_CHAT_STATE_VERSION, createEmptyWriterChatState, applyCaptureOps, renderWriterChatBlock } from './writer/writer-chat-state.js';
106
+ export type { WriterChatState, WriterComment, WriterCorrection, ArticleRef, CaptureOp, ApplyResult } from './writer/writer-chat-state.js';
107
+ export { ACTIVITY_KEY, MAX_ACTIVITY_RECORDS, addRecord, activityReport, createActivityLog, summarizeActivity, isJobRecord, typicalMs, usuallyText, MIN_RUNS_FOR_TYPICAL } from './writer/write-activity.js';
108
+ export type { ActivityLog, ActivitySummary, JobOutcome, JobRecord, KindSummary } from './writer/write-activity.js';
109
+ export { summarizeSectionChange, describeSectionChange, NAME_OPEN, NAME_CLOSE } from './writer/article-change-summary.js';
110
+ export type { SectionChange } from './writer/article-change-summary.js';
111
+ export { readWriterIntent } from './writer/writer-intent.js';
112
+ export type { ChatIntent, WriterIntent } from './writer/writer-intent.js';
113
+ export { chatHistoryMessages } from './writer/writer-chat-history.js';
114
+ export type { ChatTurn } from './writer/writer-chat-history.js';
115
+ export { captureChatState } from './writer/writer-chat-capture.js';
116
+ export type { CaptureResult, CaptureStatus } from './writer/writer-chat-capture.js';
117
+ export { ArticleMetaSchema, SectionSchema, ClaimSchema, SourceSchema, LinkSchema, SuggestionSchema, ARTICLE_META_VERSION, createArticleMeta, parseArticleMeta } from './writer/article-model.js';
118
+ export type { ArticleMeta, Section, Claim, Source, Link, Suggestion, Idea, SourceStatus, ReviewState, LoadResult } from './writer/article-model.js';
119
+ export { parseSections, reconcileSections } from './writer/article-sections.js';
120
+ export type { ReconcileResult, ParsedHeading } from './writer/article-sections.js';
121
+ export { effectiveSourceStatus, editClaimText, setSectionReview, removeLink, confirmLink, checkIntegrity, computeReadiness, createSnapshot, restoreSnapshot } from './writer/article-rules.js';
122
+ export type { Actor, Problem, Readiness, Snapshot } from './writer/article-rules.js';
123
+ export { serializeArticle, loadArticleFolder } from './writer/article-folder.js';
124
+ export type { ArticleFolder, ArticleBundle, FolderLoad } from './writer/article-folder.js';
125
+ export { fingerprintPassage, createSource, applyRecheck, acceptNewPassage } from './writer/article-sources.js';
126
+ export { extractClaims, batchSections } from './writer/article-claims.js';
127
+ export type { ExtractionResult } from './writer/article-claims.js';
128
+ export { checkClaimSupport, sourcesForClaim, needsAutoCheck } from './writer/article-support.js';
129
+ export type { SupportCheck, SupportVerdict } from './writer/article-support.js';
130
+ export { resolveChange, assessSourceChange, linkedSectionIds } from './writer/article-resolver.js';
131
+ export type { Change, ResolveResult, SourceImpact, SourceChangeResult } from './writer/article-resolver.js';
132
+ export { processWriterMessage, recordWriterMessage, createMemoryWriterChatPort } from './writer/writer-chat-turn.js';
133
+ export type { WriterChatPort } from './writer/writer-chat-turn.js';
134
+ export { proposeSuggestion, refreshSuggestions, acceptSuggestion, rejectSuggestion } from './writer/article-suggestions.js';
135
+ export type { SuggestionResult } from './writer/article-suggestions.js';
136
+ export type { SourceCandidate, SourceRecheckReport } from './writer/article-service.js';
137
+ export { githubRepoReader, parseGithubRepoAddress } from './writer/repo-reader.js';
138
+ export type { RepoReader, GithubRepoSpec } from './writer/repo-reader.js';
139
+ export type { ChatStageListener } from './writer/article-service.js';
140
+ export { ArticleService, createArticleChatPort, createMemoryArticleStore, serializeByArticle } from './writer/article-service.js';
141
+ export type { ArticleStore, ArticleServiceOptions, UpdateOutcome, ChatEditResult, OutlineEditResult } from './writer/article-service.js';
142
+ export { createMemoryAdapterArticleStore } from './writer/article-memory-store.js';
143
+ export { suggestEdits } from './writer/article-edit-suggest.js';
144
+ export type { EditSuggestResult } from './writer/article-edit-suggest.js';
145
+ export { WritePermissionsSchema, DEFAULT_WRITE_PERMISSIONS, loadPermissions, savePermissions, createSpendMeter, withSpendCap, SpendCapReachedError } from './writer/write-permissions.js';
146
+ export type { WritePermissions, SpendMeter, SpendSnapshot, SettingsStore, CountedUsage } from './writer/write-permissions.js';
147
+ export { diffForDisplay, inlineDiff, diffLines, compareVersions, addSnapshot, isLargeChange, MAX_CHECKPOINTS, MAX_AUTOSAVES, AUTOSAVE_LABEL } from './writer/article-history.js';
148
+ export { autosaveStep, type AutosaveStep } from './writer/article-autosave.js';
149
+ export type { DiffLine, DisplayLine, InlinePart, VersionComparison, VersionSide } from './writer/article-history.js';
150
+ export { summarizeChange } from './writer/article-history.js';
151
+ export type { ChangeSummary } from './writer/article-history.js';
152
+ export { proposeDependencies, addDrawnLink, dependenciesOf, wouldCycle, DEPENDENCY_KINDS, DEPENDENCY_LABEL } from './writer/article-dependencies.js';
153
+ export type { DependencyKind, DependencyProposal, SectionDependencies, AddLinkResult } from './writer/article-dependencies.js';
154
+ export { textUnitAt, claimsInRange, attachSourceToText, proposeSourceLinks } from './writer/article-source-links.js';
155
+ export type { TextUnit, TextRange, AttachResult, SourceLinkProposal } from './writer/article-source-links.js';
156
+ export { suggestedModels, modelLabel, CLI_DEFAULT_LABEL, defaultWriteModels } from './writer/write-models.js';
157
+ export type { WriteModelDefaults } from './writer/write-models.js';
158
+ export { addIdea, editIdea, setIdeaState, removeIdea, suggestIdeas } from './writer/article-ideas.js';
159
+ export type { IdeaSuggestion } from './writer/article-ideas.js';
160
+ export { setBrief, applyProfile, cleanProfile, renderStyleGuide, loadProfiles, saveProfile, deleteProfile } from './writer/article-style.js';
161
+ export { folderFileAddress, pathInFolder, walkFolder, folderFromFsBackend, folderFromListing, matchFolderFiles, isSkippedFolder, type FolderReader } from './writer/local-folder.js';
162
+ export { verifyTargets, lookupNote, currentLookup, summarizeVerify, summarizeArticleSources, DEFAULT_VERIFY_LIMIT, type VerifyEntry, type VerifyOutcome, type VerifyReport } from './writer/article-verify.js';
163
+ export { htmlToMarkdown, looksLikeHtml } from './html-to-markdown.js';
164
+ export { pageToArticle, sourceKindForFile, documentFormatForFile, parseLineRange, parseRepoFileLink, sliceLines, excerptFor, type LineRange } from './writer/article-sources.js';
165
+ export { CALL_TYPES, callTypeLabel, classifyCall } from './writer/write-spend.js';
166
+ export type { CallType } from './writer/write-spend.js';
167
+ export { claimMarks } from './writer/article-marks.js';
168
+ export { expandSelection, unitOfSelection, type SelectionRange, type SelectionUnit } from './writer/article-selection.js';
169
+ export { outlineOf, expandOutlineSelection, outlineToText, applyOutlineText, renameHeadingInText, type OutlineEntry } from './writer/article-outline.js';
170
+ export { revisionsOfText, type TextRevision, type TextRevisions, type VersionText } from './writer/article-revisions.js';
171
+ export { shouldDeriveStyle, STYLE_DERIVE_MIN_WORDS } from './writer/article-style-derive.js';
172
+ export { textPieces, describeAt, type TextPiece } from './writer/article-decorations.js';
173
+ export type { ClaimMark, MarkTone } from './writer/article-marks.js';
174
+ export type { Brief, StyleProfile } from './writer/article-model.js';
175
+ export { WRITE_PARAMETERS, PARAMETER_GROUPS, findParameter, adjustmentInstruction, adjustmentChoices, adjustmentFromText } from './writer/write-parameters.js';
176
+ export type { WriteParameter, ParameterGroup, ParameterKind } from './writer/write-parameters.js';
177
+ export { addCommentOnText, commentsInRange, refreshComments } from './writer/article-comments.js';
178
+ export { collectIssues, issuesInRange, issueCount, checkableClaims, unsupportedClaims, ISSUE_CATEGORIES } from './writer/article-issues.js';
179
+ export type { IssueBatch, IssueItem, IssueCategory } from './writer/article-issues.js';
180
+ export { workPlan, checklistAt, stageSentence, elapsedText, changedRange, litRange, claimResultLine, recentResults } from './writer/work-progress.js';
181
+ export type { WorkKind, WorkPlan, StepState, ChecklistItem, ResultLine, ResultTone } from './writer/work-progress.js';
182
+ export { modelFailureHint, DEFAULT_MODEL_HINT, CLAUDE_SIGN_IN_HINT } from './writer/model-failure-hint.js';