@dickpy/dsh-imagegen 1.3.0 → 1.5.0

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 (38) hide show
  1. package/README.md +363 -196
  2. package/docs/images/ecommerce-mode.png +0 -0
  3. package/docs/images/image-generation-studio-three-column.png +0 -0
  4. package/docs/images/imagegen-overview.png +0 -0
  5. package/docs/images/multi-model-comparison.png +0 -0
  6. package/docs/videos/agent-chat-edit.gif +0 -0
  7. package/docs/videos/agent-chat-edit.mp4 +0 -0
  8. package/lib/client.js +2589 -884
  9. package/lib/client.js.map +1 -1
  10. package/lib/index.js +585 -240
  11. package/package.json +5 -2
  12. package/src/agent-image-tools.ts +131 -102
  13. package/src/client/ImageGenPanel.tsx +2679 -1594
  14. package/src/client/SettingsCard.tsx +6 -27
  15. package/src/client/api.ts +11 -1
  16. package/src/client/conversation-sync.ts +14 -0
  17. package/src/client/image-toolview.tsx +176 -165
  18. package/src/client/index.ts +25 -15
  19. package/src/client/locales.ts +746 -602
  20. package/src/client/mount.tsx +213 -124
  21. package/src/client/panel.module.css +2619 -1563
  22. package/src/client/sidebar-entry.ts +190 -144
  23. package/src/edit-image-command.ts +110 -0
  24. package/src/engine.ts +47 -5
  25. package/src/gallery-store.ts +20 -0
  26. package/src/generation-runtime.ts +11 -2
  27. package/src/history-store.ts +26 -0
  28. package/src/image-models.ts +1 -1
  29. package/src/index.ts +31 -12
  30. package/src/model-catalog.ts +19 -2
  31. package/src/presets.ts +11 -3
  32. package/src/prompt-enhancer.ts +63 -5
  33. package/src/protocol.ts +59 -5
  34. package/src/routes.ts +62 -4
  35. package/src/task-queue.ts +42 -32
  36. package/docs/images/agent-chat-edit.png +0 -0
  37. package/docs/images/agent-chat-generate.png +0 -0
  38. package/docs/images/agent-chat-poster-workflow.png +0 -0
package/src/task-queue.ts CHANGED
@@ -9,9 +9,13 @@ export class GenerationTaskQueue {
9
9
  private readonly tasks: GenerationTask[] = []
10
10
  private readonly controllers = new Map<string, AbortController>()
11
11
  private readonly listeners = new Set<GenerationTaskListener>()
12
- private running = false
12
+ private running = 0
13
+ private serialRunning = false
13
14
 
14
- constructor(private readonly run: (request: GenerateRequest, signal: AbortSignal) => Promise<GenerateResult>) {}
15
+ constructor(
16
+ private readonly run: (request: GenerateRequest, signal: AbortSignal) => Promise<GenerateResult>,
17
+ private readonly concurrency = 1,
18
+ ) {}
15
19
 
16
20
  list(): GenerationTask[] {
17
21
  return this.tasks.map(task => this.snapshot(task))
@@ -27,7 +31,7 @@ export class GenerationTaskQueue {
27
31
  const task: GenerationTask = { id: randomUUID(), request: { ...request }, status: 'queued', createdAt: Date.now() }
28
32
  this.tasks.unshift(task)
29
33
  this.publish(task)
30
- void this.drain()
34
+ this.drain()
31
35
  return this.snapshot(task)
32
36
  }
33
37
 
@@ -38,6 +42,7 @@ export class GenerationTaskQueue {
38
42
  task.finishedAt = Date.now()
39
43
  this.controllers.get(id)?.abort()
40
44
  this.publish(task)
45
+ this.drain()
41
46
  return this.snapshot(task)
42
47
  }
43
48
 
@@ -46,39 +51,44 @@ export class GenerationTaskQueue {
46
51
  return previous === undefined ? undefined : this.submit(previous.request)
47
52
  }
48
53
 
49
- private async drain(): Promise<void> {
50
- if (this.running) return
51
- this.running = true
54
+ private drain(): void {
55
+ while (this.running < Math.max(1, this.concurrency)) {
56
+ const task = this.tasks.find(item => item.status === 'queued'
57
+ && (this.running === 0 || (item.request.comparisonId !== undefined && !this.serialRunning)))
58
+ if (task === undefined) return
59
+ this.running += 1
60
+ if (task.request.comparisonId === undefined) this.serialRunning = true
61
+ void this.runTask(task).finally(() => {
62
+ this.running -= 1
63
+ if (task.request.comparisonId === undefined) this.serialRunning = false
64
+ this.drain()
65
+ })
66
+ }
67
+ }
68
+
69
+ private async runTask(task: GenerationTask): Promise<void> {
70
+ task.status = 'running'
71
+ task.startedAt = Date.now()
72
+ this.publish(task)
73
+ const controller = new AbortController()
74
+ this.controllers.set(task.id, controller)
52
75
  try {
53
- for (;;) {
54
- const task = this.tasks.find(item => item.status === 'queued')
55
- if (task === undefined) return
56
- task.status = 'running'
57
- task.startedAt = Date.now()
76
+ const result = await this.run(task.request, controller.signal)
77
+ if (this.tasks.find(item => item.id === task.id)?.status !== 'cancelled') {
78
+ task.status = 'completed'
79
+ task.result = result
80
+ task.finishedAt = Date.now()
81
+ this.publish(task)
82
+ }
83
+ } catch (error) {
84
+ if (this.tasks.find(item => item.id === task.id)?.status !== 'cancelled') {
85
+ task.status = 'failed'
86
+ task.error = error instanceof Error ? error.message : String(error)
87
+ task.finishedAt = Date.now()
58
88
  this.publish(task)
59
- const controller = new AbortController()
60
- this.controllers.set(task.id, controller)
61
- try {
62
- const result = await this.run(task.request, controller.signal)
63
- if (this.tasks.find(item => item.id === task.id)?.status !== 'cancelled') {
64
- task.status = 'completed'
65
- task.result = result
66
- task.finishedAt = Date.now()
67
- this.publish(task)
68
- }
69
- } catch (error) {
70
- if (this.tasks.find(item => item.id === task.id)?.status !== 'cancelled') {
71
- task.status = 'failed'
72
- task.error = error instanceof Error ? error.message : String(error)
73
- task.finishedAt = Date.now()
74
- this.publish(task)
75
- }
76
- } finally {
77
- this.controllers.delete(task.id)
78
- }
79
89
  }
80
90
  } finally {
81
- this.running = false
91
+ this.controllers.delete(task.id)
82
92
  }
83
93
  }
84
94
 
Binary file
Binary file