@mc1global/opencode-jarvis 0.12.0 → 0.13.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.
- package/dist/application/azure-sync/task-push-use-cases.d.ts.map +1 -1
- package/dist/application/azure-sync/task-push-use-cases.js +21 -3
- package/dist/application/azure-sync/task-push-use-cases.js.map +1 -1
- package/dist/application/config/config-service.d.ts +3 -1
- package/dist/application/config/config-service.d.ts.map +1 -1
- package/dist/application/config/config-service.js +4 -0
- package/dist/application/config/config-service.js.map +1 -1
- package/dist/application/wiki-feedback/poll-service.d.ts +56 -0
- package/dist/application/wiki-feedback/poll-service.d.ts.map +1 -0
- package/dist/application/wiki-feedback/poll-service.js +87 -0
- package/dist/application/wiki-feedback/poll-service.js.map +1 -0
- package/dist/application/wiki-feedback/use-cases.d.ts +115 -0
- package/dist/application/wiki-feedback/use-cases.d.ts.map +1 -0
- package/dist/application/wiki-feedback/use-cases.js +271 -0
- package/dist/application/wiki-feedback/use-cases.js.map +1 -0
- package/dist/domain/config/value-objects.d.ts +28 -1
- package/dist/domain/config/value-objects.d.ts.map +1 -1
- package/dist/domain/config/value-objects.js +10 -0
- package/dist/domain/config/value-objects.js.map +1 -1
- package/dist/domain/governance/policies.d.ts.map +1 -1
- package/dist/domain/governance/policies.js +41 -0
- package/dist/domain/governance/policies.js.map +1 -1
- package/dist/domain/wiki-feedback/entities.d.ts +101 -0
- package/dist/domain/wiki-feedback/entities.d.ts.map +1 -0
- package/dist/domain/wiki-feedback/entities.js +154 -0
- package/dist/domain/wiki-feedback/entities.js.map +1 -0
- package/dist/domain/wiki-feedback/index.d.ts +13 -0
- package/dist/domain/wiki-feedback/index.d.ts.map +1 -0
- package/dist/domain/wiki-feedback/index.js +11 -0
- package/dist/domain/wiki-feedback/index.js.map +1 -0
- package/dist/domain/wiki-feedback/ports.d.ts +47 -0
- package/dist/domain/wiki-feedback/ports.d.ts.map +1 -0
- package/dist/domain/wiki-feedback/ports.js +13 -0
- package/dist/domain/wiki-feedback/ports.js.map +1 -0
- package/dist/domain/wiki-feedback/repositories.d.ts +33 -0
- package/dist/domain/wiki-feedback/repositories.d.ts.map +1 -0
- package/dist/domain/wiki-feedback/repositories.js +12 -0
- package/dist/domain/wiki-feedback/repositories.js.map +1 -0
- package/dist/domain/wiki-feedback/value-objects.d.ts +74 -0
- package/dist/domain/wiki-feedback/value-objects.d.ts.map +1 -0
- package/dist/domain/wiki-feedback/value-objects.js +144 -0
- package/dist/domain/wiki-feedback/value-objects.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/wiki-feedback/azure-wiki-client.d.ts +36 -0
- package/dist/infrastructure/wiki-feedback/azure-wiki-client.d.ts.map +1 -0
- package/dist/infrastructure/wiki-feedback/azure-wiki-client.js +106 -0
- package/dist/infrastructure/wiki-feedback/azure-wiki-client.js.map +1 -0
- package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.d.ts +31 -0
- package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.d.ts.map +1 -0
- package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.js +149 -0
- package/dist/infrastructure/wiki-feedback/sqlite-feedback-repository.js.map +1 -0
- package/dist/tools/wiki-feedback-tools.d.ts +9 -0
- package/dist/tools/wiki-feedback-tools.d.ts.map +1 -0
- package/dist/tools/wiki-feedback-tools.js +189 -0
- package/dist/tools/wiki-feedback-tools.js.map +1 -0
- package/package.json +1 -1
- package/templates/agents-md.template.md +7 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-push-use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/azure-sync/task-push-use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAIxG,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0CAA0C,CAAC;AAGjG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/D,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC9E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;CACzC;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAOjD;AAID;;;GAGG;AACH,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;gBAE3C,IAAI,EAAE,YAAY;IAE/C;;;;OAIG;IACG,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,eAAe,EACrB,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAAC,cAAc,CAAC;YA0CZ,cAAc;
|
|
1
|
+
{"version":3,"file":"task-push-use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/azure-sync/task-push-use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAIxG,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,0CAA0C,CAAC;AAGjG,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/D,sCAAsC;AACtC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC9E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;CACzC;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAOjD;AAID;;;GAGG;AACH,qBAAa,gBAAgB;IAIf,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2C;gBAE3C,IAAI,EAAE,YAAY;IAE/C;;;;OAIG;IACG,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,eAAe,EACrB,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,GAAG,SAAS,GAChC,OAAO,CAAC,cAAc,CAAC;YA0CZ,cAAc;CAmI7B"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* DDD: Application service coordinating bounded contexts
|
|
12
12
|
*/
|
|
13
13
|
import { ok, Timestamp } from "../../domain/shared/value-objects.js";
|
|
14
|
-
import { FieldMapper } from "../../domain/azure-sync/services.js";
|
|
14
|
+
import { FieldMapper, AZURE_FIELDS } from "../../domain/azure-sync/services.js";
|
|
15
15
|
import { SyncMapping, SyncLog } from "../../domain/azure-sync/entities.js";
|
|
16
16
|
import { SyncMappingId, SyncLogId, WorkItemId } from "../../domain/azure-sync/value-objects.js";
|
|
17
17
|
import { AzureFieldBuilder } from "./field-builders.js";
|
|
@@ -112,14 +112,32 @@ export class TaskPushUseCases {
|
|
|
112
112
|
await this.deps.syncMappingRepo.save(existing);
|
|
113
113
|
}
|
|
114
114
|
else {
|
|
115
|
-
// Create new Task
|
|
116
|
-
|
|
115
|
+
// Create new Task — Azure DevOps rejects creating work items
|
|
116
|
+
// directly in a terminal state (e.g. "Done" on inherited Basic).
|
|
117
|
+
// For met ACs, strip the State field from the creation payload
|
|
118
|
+
// and apply it via a separate PATCH after creation.
|
|
119
|
+
const statePath = `/fields/${AZURE_FIELDS.STATE}`;
|
|
120
|
+
const createFields = taskInput.met
|
|
121
|
+
? fields.filter((f) => f.path !== statePath)
|
|
122
|
+
: fields;
|
|
123
|
+
const createResult = await this.deps.azureClient.createWorkItem(org, project, wiType, createFields);
|
|
117
124
|
if (!createResult.success)
|
|
118
125
|
return createResult;
|
|
119
126
|
action = "created";
|
|
120
127
|
azureId = createResult.data.id;
|
|
121
128
|
azureRev = createResult.data.rev;
|
|
122
129
|
url = createResult.data.url;
|
|
130
|
+
// For met ACs, transition the newly-created Task to the done state
|
|
131
|
+
if (taskInput.met) {
|
|
132
|
+
const stateField = fields.find((f) => f.path === statePath);
|
|
133
|
+
if (stateField) {
|
|
134
|
+
const stateUpdateResult = await this.deps.azureClient.updateWorkItem(org, project, azureId, [stateField]);
|
|
135
|
+
if (stateUpdateResult.success) {
|
|
136
|
+
azureRev = stateUpdateResult.data.rev;
|
|
137
|
+
}
|
|
138
|
+
// Non-fatal: Task was created successfully, state update is best-effort
|
|
139
|
+
}
|
|
140
|
+
}
|
|
123
141
|
// Create sync mapping
|
|
124
142
|
const now = Timestamp.now();
|
|
125
143
|
const seq = await this.deps.syncMappingRepo.nextMappingSequence();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-push-use-cases.js","sourceRoot":"","sources":["../../../src/application/azure-sync/task-push-use-cases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGrE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"task-push-use-cases.js","sourceRoot":"","sources":["../../../src/application/azure-sync/task-push-use-cases.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* DDD: Application service orchestrating domain VOs + infra repo
|
|
12
12
|
*/
|
|
13
13
|
import type { ConfigRepository } from "../../domain/config/repositories.js";
|
|
14
|
-
import type { ConfigContextName, ConfigMap, RagConfig, PipelineConfig, AgentRegistryConfig, AzureSyncConfig, McpServerConfig, KanbanConfig, TokenMetricsConfig } from "../../domain/config/value-objects.js";
|
|
14
|
+
import type { ConfigContextName, ConfigMap, RagConfig, PipelineConfig, AgentRegistryConfig, AzureSyncConfig, McpServerConfig, KanbanConfig, TokenMetricsConfig, WikiFeedbackConfig } from "../../domain/config/value-objects.js";
|
|
15
15
|
/**
|
|
16
16
|
* Resolves configuration for bounded contexts.
|
|
17
17
|
*
|
|
@@ -40,6 +40,8 @@ export declare class ConfigService {
|
|
|
40
40
|
getKanbanConfig(): KanbanConfig;
|
|
41
41
|
/** Get Token Metrics configuration (type-safe). */
|
|
42
42
|
getTokenMetricsConfig(): TokenMetricsConfig;
|
|
43
|
+
/** Get Wiki Feedback configuration (type-safe). */
|
|
44
|
+
getWikiFeedbackConfig(): WikiFeedbackConfig;
|
|
43
45
|
/**
|
|
44
46
|
* Get config for any context name.
|
|
45
47
|
* Returns deep-merged result or defaults. If no defaults exist
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../../src/application/config/config-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAG9C;;;;;;;;;GASG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;gBAEvB,UAAU,EAAE,gBAAgB;IAIzD,yCAAyC;IACzC,YAAY,IAAI,SAAS;IAIzB,8CAA8C;IAC9C,iBAAiB,IAAI,cAAc;IAInC,oDAAoD;IACpD,sBAAsB,IAAI,mBAAmB;IAI7C,gDAAgD;IAChD,kBAAkB,IAAI,eAAe;IAIrC,gDAAgD;IAChD,kBAAkB,IAAI,eAAe;IAIrC,4CAA4C;IAC5C,eAAe,IAAI,YAAY;IAI/B,mDAAmD;IACnD,qBAAqB,IAAI,kBAAkB;IAM3C;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAClE,SAAS,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO;IAOlD,wEAAwE;IACxE,yBAAyB,IAAI,OAAO;IAMpC,OAAO,CAAC,QAAQ;IAIhB;;;OAGG;IACH,OAAO,CAAC,OAAO;CAuBhB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAmBnE"}
|
|
1
|
+
{"version":3,"file":"config-service.d.ts","sourceRoot":"","sources":["../../../src/application/config/config-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,KAAK,EACV,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAG9C;;;;;;;;;GASG;AACH,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;gBAEvB,UAAU,EAAE,gBAAgB;IAIzD,yCAAyC;IACzC,YAAY,IAAI,SAAS;IAIzB,8CAA8C;IAC9C,iBAAiB,IAAI,cAAc;IAInC,oDAAoD;IACpD,sBAAsB,IAAI,mBAAmB;IAI7C,gDAAgD;IAChD,kBAAkB,IAAI,eAAe;IAIrC,gDAAgD;IAChD,kBAAkB,IAAI,eAAe;IAIrC,4CAA4C;IAC5C,eAAe,IAAI,YAAY;IAI/B,mDAAmD;IACnD,qBAAqB,IAAI,kBAAkB;IAI3C,mDAAmD;IACnD,qBAAqB,IAAI,kBAAkB;IAM3C;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAClE,SAAS,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO;IAOlD,wEAAwE;IACxE,yBAAyB,IAAI,OAAO;IAMpC,OAAO,CAAC,QAAQ;IAIhB;;;OAGG;IACH,OAAO,CAAC,OAAO;CAuBhB;AAID;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAmBnE"}
|
|
@@ -44,6 +44,10 @@ export class ConfigService {
|
|
|
44
44
|
getTokenMetricsConfig() {
|
|
45
45
|
return this.getTyped("token-metrics");
|
|
46
46
|
}
|
|
47
|
+
/** Get Wiki Feedback configuration (type-safe). */
|
|
48
|
+
getWikiFeedbackConfig() {
|
|
49
|
+
return this.getTyped("wiki-feedback");
|
|
50
|
+
}
|
|
47
51
|
getConfig(contextName) {
|
|
48
52
|
return this.resolve(contextName);
|
|
49
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../../src/application/config/config-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-service.js","sourceRoot":"","sources":["../../../src/application/config/config-service.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,OAAO,aAAa;IAGK;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEpD,YAA6B,UAA4B;QAA5B,eAAU,GAAV,UAAU,CAAkB;IAAG,CAAC;IAE7D,qEAAqE;IAErE,yCAAyC;IACzC,YAAY;QACV,OAAO,IAAI,CAAC,QAAQ,CAAY,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,8CAA8C;IAC9C,iBAAiB;QACf,OAAO,IAAI,CAAC,QAAQ,CAAiB,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,oDAAoD;IACpD,sBAAsB;QACpB,OAAO,IAAI,CAAC,QAAQ,CAAsB,gBAAgB,CAAC,CAAC;IAC9D,CAAC;IAED,gDAAgD;IAChD,kBAAkB;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAkB,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,gDAAgD;IAChD,kBAAkB;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAkB,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,4CAA4C;IAC5C,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAe,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,mDAAmD;IACnD,qBAAqB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAqB,eAAe,CAAC,CAAC;IAC5D,CAAC;IAED,mDAAmD;IACnD,qBAAqB;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAqB,eAAe,CAAC,CAAC;IAC5D,CAAC;IAWD,SAAS,CAAC,WAAmB;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,qEAAqE;IAErE,wEAAwE;IACxE,yBAAyB;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAED,qEAAqE;IAE7D,QAAQ,CAAI,WAAmB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAM,CAAC;IACxC,CAAC;IAED;;;OAGG;IACK,OAAO,CAAC,WAAmB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE1D,IAAI,MAAe,CAAC;QACpB,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,yEAAyE;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,QAAiB;IACxD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAElC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Feedback Application — Poll Service
|
|
3
|
+
*
|
|
4
|
+
* Background service that periodically scans monitored wiki pages
|
|
5
|
+
* for new comments. Delegates to WikiFeedbackUseCases.scan() for
|
|
6
|
+
* the actual detection and persistence logic.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same pattern as AzurePollService: start/stop lifecycle,
|
|
9
|
+
* immediate first poll, configurable interval, error callbacks.
|
|
10
|
+
*
|
|
11
|
+
* SOLID: SRP — polling orchestration only (scan logic in use cases)
|
|
12
|
+
* SOLID: DIP — depends on use case abstraction
|
|
13
|
+
*/
|
|
14
|
+
import type { WikiFeedbackUseCases } from "./use-cases.js";
|
|
15
|
+
/** Notification emitted after a successful scan with new comments. */
|
|
16
|
+
export interface WikiPollNotification {
|
|
17
|
+
readonly pagesScanned: number;
|
|
18
|
+
readonly newCommentsFound: number;
|
|
19
|
+
readonly existingSkipped: number;
|
|
20
|
+
readonly autoRepliesFiltered: number;
|
|
21
|
+
readonly summary: string;
|
|
22
|
+
}
|
|
23
|
+
/** Dependencies for the wiki feedback poll service. */
|
|
24
|
+
export interface WikiPollServiceDeps {
|
|
25
|
+
readonly useCases: WikiFeedbackUseCases;
|
|
26
|
+
/** Callback invoked when new comments are detected. */
|
|
27
|
+
readonly onNewComments?: (notification: WikiPollNotification) => void;
|
|
28
|
+
/** Callback for error logging. */
|
|
29
|
+
readonly onError?: (error: string) => void;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Background polling service for wiki feedback detection.
|
|
33
|
+
* Call start() to begin periodic scanning, stop() to halt.
|
|
34
|
+
*/
|
|
35
|
+
export declare class WikiFeedbackPollService {
|
|
36
|
+
private readonly deps;
|
|
37
|
+
private readonly intervalSecs;
|
|
38
|
+
private timer;
|
|
39
|
+
private _running;
|
|
40
|
+
private _pollCount;
|
|
41
|
+
private _lastPollAt;
|
|
42
|
+
constructor(deps: WikiPollServiceDeps, intervalSecs: number);
|
|
43
|
+
/** Whether the service is currently running. */
|
|
44
|
+
get running(): boolean;
|
|
45
|
+
/** Number of completed poll cycles. */
|
|
46
|
+
get pollCount(): number;
|
|
47
|
+
/** ISO timestamp of the last poll. */
|
|
48
|
+
get lastPollAt(): string | undefined;
|
|
49
|
+
/** Start the polling loop. No-op if already running. */
|
|
50
|
+
start(): void;
|
|
51
|
+
/** Stop the polling loop. */
|
|
52
|
+
stop(): void;
|
|
53
|
+
/** Execute a single poll cycle. Exposed for testing. */
|
|
54
|
+
poll(): Promise<WikiPollNotification | undefined>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=poll-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-service.d.ts","sourceRoot":"","sources":["../../../src/application/wiki-feedback/poll-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI3D,sEAAsE;AACtE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,uDAAuD;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,YAAY,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACtE,kCAAkC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAID;;;GAGG;AACH,qBAAa,uBAAuB;IAOhC,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAP/B,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAqB;gBAGrB,IAAI,EAAE,mBAAmB,EACzB,YAAY,EAAE,MAAM;IAOvC,gDAAgD;IAChD,IAAI,OAAO,IAAI,OAAO,CAA0B;IAEhD,uCAAuC;IACvC,IAAI,SAAS,IAAI,MAAM,CAA4B;IAEnD,sCAAsC;IACtC,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAA6B;IAEjE,wDAAwD;IACxD,KAAK,IAAI,IAAI;IAkBb,6BAA6B;IAC7B,IAAI,IAAI,IAAI;IASZ,wDAAwD;IAClD,IAAI,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;CAyBxD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Feedback Application — Poll Service
|
|
3
|
+
*
|
|
4
|
+
* Background service that periodically scans monitored wiki pages
|
|
5
|
+
* for new comments. Delegates to WikiFeedbackUseCases.scan() for
|
|
6
|
+
* the actual detection and persistence logic.
|
|
7
|
+
*
|
|
8
|
+
* Follows the same pattern as AzurePollService: start/stop lifecycle,
|
|
9
|
+
* immediate first poll, configurable interval, error callbacks.
|
|
10
|
+
*
|
|
11
|
+
* SOLID: SRP — polling orchestration only (scan logic in use cases)
|
|
12
|
+
* SOLID: DIP — depends on use case abstraction
|
|
13
|
+
*/
|
|
14
|
+
// ─── Poll Service ─────────────────────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Background polling service for wiki feedback detection.
|
|
17
|
+
* Call start() to begin periodic scanning, stop() to halt.
|
|
18
|
+
*/
|
|
19
|
+
export class WikiFeedbackPollService {
|
|
20
|
+
deps;
|
|
21
|
+
intervalSecs;
|
|
22
|
+
timer;
|
|
23
|
+
_running = false;
|
|
24
|
+
_pollCount = 0;
|
|
25
|
+
_lastPollAt;
|
|
26
|
+
constructor(deps, intervalSecs) {
|
|
27
|
+
this.deps = deps;
|
|
28
|
+
this.intervalSecs = intervalSecs;
|
|
29
|
+
if (intervalSecs < 60) {
|
|
30
|
+
throw new Error("Wiki poll interval must be at least 60 seconds");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Whether the service is currently running. */
|
|
34
|
+
get running() { return this._running; }
|
|
35
|
+
/** Number of completed poll cycles. */
|
|
36
|
+
get pollCount() { return this._pollCount; }
|
|
37
|
+
/** ISO timestamp of the last poll. */
|
|
38
|
+
get lastPollAt() { return this._lastPollAt; }
|
|
39
|
+
/** Start the polling loop. No-op if already running. */
|
|
40
|
+
start() {
|
|
41
|
+
if (this._running)
|
|
42
|
+
return;
|
|
43
|
+
this._running = true;
|
|
44
|
+
// Run immediately, then on interval
|
|
45
|
+
this.poll().catch((err) => {
|
|
46
|
+
this.deps.onError?.(`Wiki poll failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
47
|
+
});
|
|
48
|
+
this.timer = setInterval(() => {
|
|
49
|
+
this.poll().catch((err) => {
|
|
50
|
+
this.deps.onError?.(`Wiki poll failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
51
|
+
});
|
|
52
|
+
}, this.intervalSecs * 1000);
|
|
53
|
+
}
|
|
54
|
+
/** Stop the polling loop. */
|
|
55
|
+
stop() {
|
|
56
|
+
if (!this._running)
|
|
57
|
+
return;
|
|
58
|
+
this._running = false;
|
|
59
|
+
if (this.timer !== undefined) {
|
|
60
|
+
clearInterval(this.timer);
|
|
61
|
+
this.timer = undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Execute a single poll cycle. Exposed for testing. */
|
|
65
|
+
async poll() {
|
|
66
|
+
const result = await this.deps.useCases.scan();
|
|
67
|
+
this._pollCount++;
|
|
68
|
+
this._lastPollAt = new Date().toISOString();
|
|
69
|
+
if (!result.success) {
|
|
70
|
+
this.deps.onError?.(`Scan failed: ${result.error}`);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const scan = result.data;
|
|
74
|
+
if (scan.newCommentsFound === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
const notification = {
|
|
77
|
+
pagesScanned: scan.pagesScanned,
|
|
78
|
+
newCommentsFound: scan.newCommentsFound,
|
|
79
|
+
existingSkipped: scan.existingSkipped,
|
|
80
|
+
autoRepliesFiltered: scan.autoRepliesFiltered,
|
|
81
|
+
summary: `${scan.newCommentsFound} new wiki comment(s) detected across ${scan.pagesScanned} page(s)`,
|
|
82
|
+
};
|
|
83
|
+
this.deps.onNewComments?.(notification);
|
|
84
|
+
return notification;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=poll-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll-service.js","sourceRoot":"","sources":["../../../src/application/wiki-feedback/poll-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiki Feedback Application — Use Cases
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates wiki feedback operations: scan pages for new comments,
|
|
5
|
+
* list pending items, triage with type/priority, create kanban cards,
|
|
6
|
+
* and dismiss irrelevant feedback. Uses domain entities and repository
|
|
7
|
+
* ports — zero infrastructure dependencies.
|
|
8
|
+
*
|
|
9
|
+
* SOLID: SRP — wiki feedback workflow orchestration only
|
|
10
|
+
* SOLID: DIP — depends on domain ports and repository interfaces
|
|
11
|
+
* DDD: Application Service pattern with Result returns
|
|
12
|
+
*/
|
|
13
|
+
import type { Result } from "../../domain/shared/value-objects.js";
|
|
14
|
+
import type { WikiFeedbackRepository } from "../../domain/wiki-feedback/repositories.js";
|
|
15
|
+
import type { WikiClientPort } from "../../domain/wiki-feedback/ports.js";
|
|
16
|
+
import type { MonitoredPageConfig } from "../../domain/config/value-objects.js";
|
|
17
|
+
/** Response DTO for a single feedback item. */
|
|
18
|
+
export interface WikiFeedbackResponse {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly azureCommentId: number;
|
|
21
|
+
readonly commentText: string;
|
|
22
|
+
readonly authorDisplayName: string;
|
|
23
|
+
readonly authorUniqueName: string;
|
|
24
|
+
readonly pageId: number;
|
|
25
|
+
readonly pagePath: string;
|
|
26
|
+
readonly status: string;
|
|
27
|
+
readonly feedbackType: string | null;
|
|
28
|
+
readonly priority: string | null;
|
|
29
|
+
readonly cardId: string | null;
|
|
30
|
+
readonly dismissReason: string | null;
|
|
31
|
+
readonly detectedAt: string;
|
|
32
|
+
readonly triagedAt: string | null;
|
|
33
|
+
readonly resolvedAt: string | null;
|
|
34
|
+
readonly commentCreatedDate: string;
|
|
35
|
+
}
|
|
36
|
+
/** Request DTO for triaging a feedback item. */
|
|
37
|
+
export interface TriageFeedbackRequest {
|
|
38
|
+
readonly feedbackId: string;
|
|
39
|
+
readonly feedbackType: string;
|
|
40
|
+
readonly priority: string;
|
|
41
|
+
}
|
|
42
|
+
/** Request DTO for creating a card from feedback. */
|
|
43
|
+
export interface CreateCardFromFeedbackRequest {
|
|
44
|
+
readonly feedbackId: string;
|
|
45
|
+
readonly title?: string;
|
|
46
|
+
readonly description?: string;
|
|
47
|
+
readonly epicId?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Request DTO for dismissing a feedback item. */
|
|
50
|
+
export interface DismissFeedbackRequest {
|
|
51
|
+
readonly feedbackId: string;
|
|
52
|
+
readonly reason: string;
|
|
53
|
+
}
|
|
54
|
+
/** Summary returned after a scan operation. */
|
|
55
|
+
export interface ScanResult {
|
|
56
|
+
readonly pagesScanned: number;
|
|
57
|
+
readonly newCommentsFound: number;
|
|
58
|
+
readonly existingSkipped: number;
|
|
59
|
+
readonly autoRepliesFiltered: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Callback to create a kanban card from feedback.
|
|
63
|
+
* Injected from the kanban BC — avoids direct cross-context dependency.
|
|
64
|
+
* Returns the created card ID on success.
|
|
65
|
+
*/
|
|
66
|
+
export type CreateCardCallback = (params: {
|
|
67
|
+
readonly title: string;
|
|
68
|
+
readonly workspace: string;
|
|
69
|
+
readonly priority?: string;
|
|
70
|
+
readonly description?: string;
|
|
71
|
+
readonly epicId?: string;
|
|
72
|
+
}) => Promise<Result<{
|
|
73
|
+
readonly id: string;
|
|
74
|
+
}>>;
|
|
75
|
+
export interface WikiFeedbackUseCasesDeps {
|
|
76
|
+
readonly feedbackRepo: WikiFeedbackRepository;
|
|
77
|
+
readonly wikiClient: WikiClientPort;
|
|
78
|
+
readonly createCard: CreateCardCallback;
|
|
79
|
+
readonly workspace: string;
|
|
80
|
+
readonly wikiIdentifier: string;
|
|
81
|
+
readonly monitoredPages: readonly MonitoredPageConfig[];
|
|
82
|
+
readonly autoReply: boolean;
|
|
83
|
+
readonly autoReplyPrefix: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Application use cases for wiki feedback processing.
|
|
87
|
+
* Orchestrates scan → triage → card creation / dismiss lifecycle.
|
|
88
|
+
*/
|
|
89
|
+
export declare class WikiFeedbackUseCases {
|
|
90
|
+
private readonly deps;
|
|
91
|
+
constructor(deps: WikiFeedbackUseCasesDeps);
|
|
92
|
+
/**
|
|
93
|
+
* Scan all monitored wiki pages for new comments.
|
|
94
|
+
* Creates WikiFeedbackItem for each new comment not yet tracked.
|
|
95
|
+
* Filters out auto-reply comments posted by JARVIS.
|
|
96
|
+
*/
|
|
97
|
+
scan(): Promise<Result<ScanResult>>;
|
|
98
|
+
/** List pending (untriaged) feedback items. */
|
|
99
|
+
listPending(limit?: number): Promise<Result<readonly WikiFeedbackResponse[]>>;
|
|
100
|
+
/** List feedback items by status. */
|
|
101
|
+
listByStatus(status: string, limit?: number): Promise<Result<readonly WikiFeedbackResponse[]>>;
|
|
102
|
+
/** List recent feedback items across all statuses. */
|
|
103
|
+
listRecent(limit?: number): Promise<Result<readonly WikiFeedbackResponse[]>>;
|
|
104
|
+
/** Triage a pending feedback item: assign type and priority. */
|
|
105
|
+
triage(request: TriageFeedbackRequest): Promise<Result<WikiFeedbackResponse>>;
|
|
106
|
+
/**
|
|
107
|
+
* Create a kanban card from a triaged feedback item.
|
|
108
|
+
* Optionally posts an auto-reply on the wiki page.
|
|
109
|
+
*/
|
|
110
|
+
createCard(request: CreateCardFromFeedbackRequest): Promise<Result<WikiFeedbackResponse>>;
|
|
111
|
+
/** Dismiss a feedback item with a reason. */
|
|
112
|
+
dismiss(request: DismissFeedbackRequest): Promise<Result<WikiFeedbackResponse>>;
|
|
113
|
+
private postAutoReply;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=use-cases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-cases.d.ts","sourceRoot":"","sources":["../../../src/application/wiki-feedback/use-cases.ts"],"names":[],"mappings":"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"}
|