@fonlan/dsh-task-kanban 0.2.0 → 0.2.1

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.
@@ -1,26 +1,48 @@
1
1
  /**
2
- * User-facing plugin settings (global parallel worker count, default model),
3
- * persisted through the settings service namespace `task-kanban`. The DSH
4
- * settings service requires a lowercase kebab-case namespace
5
- * (/^[a-z][a-z0-9-]*$/), so the scoped package name cannot be used here.
2
+ * User-facing plugin settings (global parallel worker count, per-session-type
3
+ * model/effort/preset defaults), persisted through the settings service
4
+ * namespace `task-kanban`. The DSH settings service requires a lowercase
5
+ * kebab-case namespace (/^[a-z][a-z0-9-]*$/), so the scoped package name
6
+ * cannot be used here.
6
7
  */
7
8
  import type { Context } from '@deepseek-ai/cordis'
8
9
  import z from '@deepseek-ai/schemastery'
9
10
  import { settingsNamespace } from '@deepseek-ai/dsh-settings'
10
- import type { KanbanSettingsShape } from '../shared/card.js'
11
+ import type { KanbanSessionKind, KanbanSettingsShape } from '../shared/card.js'
11
12
 
12
13
  export const KANBAN_SETTINGS_NS = settingsNamespace('task-kanban')
13
14
 
14
15
  export const KanbanSettingsSchema = z.object({
15
16
  maxParallelWorkers: z.natural().min(1).default(1),
16
- defaultModel: z.string().default(''),
17
+ refinementModel: z.string().default(''),
18
+ refinementProvider: z.string().default(''),
19
+ refinementReasoningEffort: z.string().default(''),
20
+ refinementPreset: z.string().default(''),
21
+ phaseModel: z.string().default(''),
22
+ phaseProvider: z.string().default(''),
23
+ phaseReasoningEffort: z.string().default(''),
24
+ phasePreset: z.string().default(''),
17
25
  })
18
26
 
27
+ /** The per-session-type default slice a session kind resolves. */
28
+ export interface KanbanSessionDefaults {
29
+ model: string
30
+ provider: string
31
+ reasoningEffort: string
32
+ preset: string
33
+ }
34
+
19
35
  export interface KanbanSettingsFace {
20
36
  get(): KanbanSettingsShape
21
37
  update(patch: Partial<KanbanSettingsShape>): Promise<void>
22
38
  /** Default provider/model route from the agent-default-model settings namespace. */
23
39
  defaultModelRoute(): { provider?: string; model?: string }
40
+ /**
41
+ * The configured model/effort/preset defaults for one session kind.
42
+ * `merge` sessions deliberately carry no per-type defaults: they keep the
43
+ * legacy resolution chain (card model → host default).
44
+ */
45
+ sessionDefaults(kind: KanbanSessionKind): KanbanSessionDefaults
24
46
  }
25
47
 
26
48
  /** Structural settings-service subset; the real service resolves the schema. */
@@ -29,8 +51,20 @@ interface SettingsServiceLike {
29
51
  update(ns: unknown, patch: Record<string, unknown>, expectedRevision?: number): Promise<unknown>
30
52
  }
31
53
 
54
+ const EMPTY_DEFAULTS: KanbanSessionDefaults = { model: '', provider: '', reasoningEffort: '', preset: '' }
55
+
32
56
  export function registerSettings(ctx: Context): KanbanSettingsFace {
33
- let current: KanbanSettingsShape = { maxParallelWorkers: 1, defaultModel: '' }
57
+ let current: KanbanSettingsShape = {
58
+ maxParallelWorkers: 1,
59
+ refinementModel: '',
60
+ refinementProvider: '',
61
+ refinementReasoningEffort: '',
62
+ refinementPreset: '',
63
+ phaseModel: '',
64
+ phaseProvider: '',
65
+ phaseReasoningEffort: '',
66
+ phasePreset: '',
67
+ }
34
68
  let service: SettingsServiceLike | undefined
35
69
  ctx.inject(['settings'], (sctx) => {
36
70
  service = sctx.settings as unknown as SettingsServiceLike
@@ -43,6 +77,17 @@ export function registerSettings(ctx: Context): KanbanSettingsFace {
43
77
  })
44
78
  return {
45
79
  get: () => current,
80
+ sessionDefaults: (kind) => {
81
+ const s = current
82
+ switch (kind) {
83
+ case 'refine':
84
+ return { model: s.refinementModel, provider: s.refinementProvider, reasoningEffort: s.refinementReasoningEffort, preset: s.refinementPreset }
85
+ case 'phase':
86
+ return { model: s.phaseModel, provider: s.phaseProvider, reasoningEffort: s.phaseReasoningEffort, preset: s.phasePreset }
87
+ case 'merge':
88
+ return EMPTY_DEFAULTS
89
+ }
90
+ },
46
91
  defaultModelRoute: () => {
47
92
  if (service === undefined) return {}
48
93
  try {
@@ -111,7 +111,19 @@ export interface ModelOption {
111
111
  name?: string
112
112
  }
113
113
 
114
+ /** Which kanban session kind a per-type default applies to. */
115
+ export type KanbanSessionKind = 'refine' | 'phase' | 'merge'
116
+
114
117
  export interface KanbanSettingsShape {
115
118
  maxParallelWorkers: number
116
- defaultModel: string
119
+ /** Requirement-refinement session defaults. */
120
+ refinementModel: string
121
+ refinementProvider: string
122
+ refinementReasoningEffort: string
123
+ refinementPreset: string
124
+ /** Phase implementation session defaults. */
125
+ phaseModel: string
126
+ phaseProvider: string
127
+ phaseReasoningEffort: string
128
+ phasePreset: string
117
129
  }