perttool 0.9.3 → 0.10.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/CHANGELOG.md +51 -1
- package/README.md +63 -31
- package/dist/application/cli-facade.d.ts +33 -8
- package/dist/application/cli-facade.d.ts.map +1 -1
- package/dist/application/cli-facade.js +1 -2
- package/dist/application/cli-facade.js.map +1 -1
- package/dist/application/contract9-assurance-mutation.d.ts +35 -0
- package/dist/application/contract9-assurance-mutation.d.ts.map +1 -0
- package/dist/application/contract9-assurance-mutation.js +146 -0
- package/dist/application/contract9-assurance-mutation.js.map +1 -0
- package/dist/application/contract9-assurance.d.ts +23 -0
- package/dist/application/contract9-assurance.d.ts.map +1 -0
- package/dist/application/contract9-assurance.js +114 -0
- package/dist/application/contract9-assurance.js.map +1 -0
- package/dist/application/contract9-candidate.d.ts +33 -0
- package/dist/application/contract9-candidate.d.ts.map +1 -0
- package/dist/application/contract9-candidate.js +39 -0
- package/dist/application/contract9-candidate.js.map +1 -0
- package/dist/application/contract9-format-migration.d.ts +22 -0
- package/dist/application/contract9-format-migration.d.ts.map +1 -0
- package/dist/application/contract9-format-migration.js +52 -0
- package/dist/application/contract9-format-migration.js.map +1 -0
- package/dist/application/contract9-mixed-mutation.d.ts +14 -0
- package/dist/application/contract9-mixed-mutation.d.ts.map +1 -0
- package/dist/application/contract9-mixed-mutation.js +88 -0
- package/dist/application/contract9-mixed-mutation.js.map +1 -0
- package/dist/application/contract9-project.d.ts +15 -0
- package/dist/application/contract9-project.d.ts.map +1 -0
- package/dist/application/contract9-project.js +24 -0
- package/dist/application/contract9-project.js.map +1 -0
- package/dist/application/contract9-projection.d.ts +23 -0
- package/dist/application/contract9-projection.d.ts.map +1 -0
- package/dist/application/contract9-projection.js +89 -0
- package/dist/application/contract9-projection.js.map +1 -0
- package/dist/application/contract9-runtime.d.ts +43 -0
- package/dist/application/contract9-runtime.d.ts.map +1 -0
- package/dist/application/contract9-runtime.js +36 -0
- package/dist/application/contract9-runtime.js.map +1 -0
- package/dist/application/contract9-temporal-context.d.ts +15 -0
- package/dist/application/contract9-temporal-context.d.ts.map +1 -0
- package/dist/application/contract9-temporal-context.js +127 -0
- package/dist/application/contract9-temporal-context.js.map +1 -0
- package/dist/application/contract9-temporal-mutation.d.ts +20 -0
- package/dist/application/contract9-temporal-mutation.d.ts.map +1 -0
- package/dist/application/contract9-temporal-mutation.js +78 -0
- package/dist/application/contract9-temporal-mutation.js.map +1 -0
- package/dist/application/contract9-temporal.d.ts +17 -0
- package/dist/application/contract9-temporal.d.ts.map +1 -0
- package/dist/application/contract9-temporal.js +65 -0
- package/dist/application/contract9-temporal.js.map +1 -0
- package/dist/application/contract9-write.d.ts +28 -0
- package/dist/application/contract9-write.d.ts.map +1 -0
- package/dist/application/contract9-write.js +25 -0
- package/dist/application/contract9-write.js.map +1 -0
- package/dist/application/editor-milestone-acceptance.d.ts +4 -0
- package/dist/application/editor-milestone-acceptance.d.ts.map +1 -1
- package/dist/application/editor-milestone-acceptance.js +90 -0
- package/dist/application/editor-milestone-acceptance.js.map +1 -1
- package/dist/application/editor-repair.d.ts +12 -0
- package/dist/application/editor-repair.d.ts.map +1 -0
- package/dist/application/editor-repair.js +74 -0
- package/dist/application/editor-repair.js.map +1 -0
- package/dist/application/target-postdue-analysis.d.ts +18 -0
- package/dist/application/target-postdue-analysis.d.ts.map +1 -0
- package/dist/application/target-postdue-analysis.js +26 -0
- package/dist/application/target-postdue-analysis.js.map +1 -0
- package/dist/application/target-postdue-check.d.ts +10 -0
- package/dist/application/target-postdue-check.d.ts.map +1 -0
- package/dist/application/target-postdue-check.js +18 -0
- package/dist/application/target-postdue-check.js.map +1 -0
- package/dist/application/target-postdue-next.d.ts +10 -0
- package/dist/application/target-postdue-next.d.ts.map +1 -0
- package/dist/application/target-postdue-next.js +13 -0
- package/dist/application/target-postdue-next.js.map +1 -0
- package/dist/application/target-postdue-projection.d.ts +11 -0
- package/dist/application/target-postdue-projection.d.ts.map +1 -0
- package/dist/application/target-postdue-projection.js +17 -0
- package/dist/application/target-postdue-projection.js.map +1 -0
- package/dist/assurance/canonical.d.ts +3 -3
- package/dist/assurance/canonical.d.ts.map +1 -1
- package/dist/assurance/canonical.js +19 -6
- package/dist/assurance/canonical.js.map +1 -1
- package/dist/assurance/evaluate.d.ts.map +1 -1
- package/dist/assurance/evaluate.js +10 -2
- package/dist/assurance/evaluate.js.map +1 -1
- package/dist/assurance/types.d.ts +11 -1
- package/dist/assurance/types.d.ts.map +1 -1
- package/dist/cli.js +215 -92
- package/dist/cli.js.map +1 -1
- package/dist/command/contract9-discovery.d.ts +17 -0
- package/dist/command/contract9-discovery.d.ts.map +1 -0
- package/dist/command/contract9-discovery.js +126 -0
- package/dist/command/contract9-discovery.js.map +1 -0
- package/dist/command/contract9-usage.d.ts +24 -0
- package/dist/command/contract9-usage.d.ts.map +1 -0
- package/dist/command/contract9-usage.js +23 -0
- package/dist/command/contract9-usage.js.map +1 -0
- package/dist/core/index.d.ts +4 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/editor/repair.d.ts +95 -0
- package/dist/editor/repair.d.ts.map +1 -0
- package/dist/editor/repair.js +232 -0
- package/dist/editor/repair.js.map +1 -0
- package/dist/editor/semantic-fingerprint.d.ts +8 -0
- package/dist/editor/semantic-fingerprint.d.ts.map +1 -0
- package/dist/editor/semantic-fingerprint.js +177 -0
- package/dist/editor/semantic-fingerprint.js.map +1 -0
- package/dist/help/assurance-guide.js +7 -7
- package/dist/help/assurance-guide.js.map +1 -1
- package/dist/help/contract9-guide.d.ts +10 -0
- package/dist/help/contract9-guide.d.ts.map +1 -0
- package/dist/help/contract9-guide.js +32 -0
- package/dist/help/contract9-guide.js.map +1 -0
- package/dist/help/guide.d.ts +1 -1
- package/dist/help/guide.d.ts.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/milestone-acceptance/advance.js +1 -1
- package/dist/milestone-acceptance/advance.js.map +1 -1
- package/dist/mutation/advance.d.ts.map +1 -1
- package/dist/mutation/advance.js.map +1 -1
- package/dist/perttool-vscode-private-0.0.0-d1578b9.vsix +0 -0
- package/dist/recommendation/override-types.d.ts +2 -2
- package/dist/recommendation/override.js +2 -2
- package/dist/schema/registry.d.ts +1 -1
- package/dist/schema/registry.js +8 -8
- package/dist/session/document-session.d.ts +23 -0
- package/dist/session/document-session.d.ts.map +1 -1
- package/dist/session/document-session.js +104 -2
- package/dist/session/document-session.js.map +1 -1
- package/dist/temporal-schedule/alert-types.d.ts +109 -0
- package/dist/temporal-schedule/alert-types.d.ts.map +1 -0
- package/dist/temporal-schedule/alert-types.js +2 -0
- package/dist/temporal-schedule/alert-types.js.map +1 -0
- package/dist/temporal-schedule/alert.d.ts +4 -0
- package/dist/temporal-schedule/alert.d.ts.map +1 -0
- package/dist/temporal-schedule/alert.js +214 -0
- package/dist/temporal-schedule/alert.js.map +1 -0
- package/dist/temporal-schedule/calendar-mutation.d.ts +11 -0
- package/dist/temporal-schedule/calendar-mutation.d.ts.map +1 -0
- package/dist/temporal-schedule/calendar-mutation.js +59 -0
- package/dist/temporal-schedule/calendar-mutation.js.map +1 -0
- package/dist/temporal-schedule/calendar.d.ts +16 -0
- package/dist/temporal-schedule/calendar.d.ts.map +1 -0
- package/dist/temporal-schedule/calendar.js +179 -0
- package/dist/temporal-schedule/calendar.js.map +1 -0
- package/dist/temporal-schedule/constraint-types.d.ts +47 -0
- package/dist/temporal-schedule/constraint-types.d.ts.map +1 -0
- package/dist/temporal-schedule/constraint-types.js +2 -0
- package/dist/temporal-schedule/constraint-types.js.map +1 -0
- package/dist/temporal-schedule/constraint.d.ts +7 -0
- package/dist/temporal-schedule/constraint.d.ts.map +1 -0
- package/dist/temporal-schedule/constraint.js +224 -0
- package/dist/temporal-schedule/constraint.js.map +1 -0
- package/dist/temporal-schedule/entity-mutation.d.ts +31 -0
- package/dist/temporal-schedule/entity-mutation.d.ts.map +1 -0
- package/dist/temporal-schedule/entity-mutation.js +107 -0
- package/dist/temporal-schedule/entity-mutation.js.map +1 -0
- package/dist/temporal-schedule/format.d.ts +9 -0
- package/dist/temporal-schedule/format.d.ts.map +1 -0
- package/dist/temporal-schedule/format.js +183 -0
- package/dist/temporal-schedule/format.js.map +1 -0
- package/dist/temporal-schedule/required-types.d.ts +68 -0
- package/dist/temporal-schedule/required-types.d.ts.map +1 -0
- package/dist/temporal-schedule/required-types.js +2 -0
- package/dist/temporal-schedule/required-types.js.map +1 -0
- package/dist/temporal-schedule/required.d.ts +5 -0
- package/dist/temporal-schedule/required.d.ts.map +1 -0
- package/dist/temporal-schedule/required.js +183 -0
- package/dist/temporal-schedule/required.js.map +1 -0
- package/dist/temporal-schedule/schedule-graph.d.ts +8 -0
- package/dist/temporal-schedule/schedule-graph.d.ts.map +1 -0
- package/dist/temporal-schedule/schedule-graph.js +33 -0
- package/dist/temporal-schedule/schedule-graph.js.map +1 -0
- package/dist/temporal-schedule/scheduler-types.d.ts +115 -0
- package/dist/temporal-schedule/scheduler-types.d.ts.map +1 -0
- package/dist/temporal-schedule/scheduler-types.js +2 -0
- package/dist/temporal-schedule/scheduler-types.js.map +1 -0
- package/dist/temporal-schedule/scheduler.d.ts +12 -0
- package/dist/temporal-schedule/scheduler.d.ts.map +1 -0
- package/dist/temporal-schedule/scheduler.js +584 -0
- package/dist/temporal-schedule/scheduler.js.map +1 -0
- package/dist/temporal-schedule/source-lexical.d.ts +30 -0
- package/dist/temporal-schedule/source-lexical.d.ts.map +1 -0
- package/dist/temporal-schedule/source-lexical.js +166 -0
- package/dist/temporal-schedule/source-lexical.js.map +1 -0
- package/dist/temporal-schedule/source-types.d.ts +124 -0
- package/dist/temporal-schedule/source-types.d.ts.map +1 -0
- package/dist/temporal-schedule/source-types.js +2 -0
- package/dist/temporal-schedule/source-types.js.map +1 -0
- package/dist/temporal-schedule/source-values.d.ts +17 -0
- package/dist/temporal-schedule/source-values.d.ts.map +1 -0
- package/dist/temporal-schedule/source-values.js +138 -0
- package/dist/temporal-schedule/source-values.js.map +1 -0
- package/dist/temporal-schedule/source.d.ts +17 -0
- package/dist/temporal-schedule/source.d.ts.map +1 -0
- package/dist/temporal-schedule/source.js +520 -0
- package/dist/temporal-schedule/source.js.map +1 -0
- package/dist/temporal-schedule/tzdb-2026c.d.ts +7 -0
- package/dist/temporal-schedule/tzdb-2026c.d.ts.map +1 -0
- package/dist/temporal-schedule/tzdb-2026c.js +611 -0
- package/dist/temporal-schedule/tzdb-2026c.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -2
- package/schemas/Perttool.AdvanceResult.v3.schema.json +1 -1
- package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +1 -1
- package/schemas/{Perttool.AnalysisResult.v6.schema.json → Perttool.AnalysisResult.v7.schema.json} +178 -6
- package/schemas/{Perttool.CheckResult.v5.schema.json → Perttool.CheckResult.v6.schema.json} +10 -6
- package/schemas/Perttool.CliError.v1.schema.json +1 -1
- package/schemas/Perttool.CommandHelpResult.v1.schema.json +2 -2
- package/schemas/Perttool.ExportResult.v1.schema.json +1 -1
- package/schemas/Perttool.FormatResult.v1.schema.json +1 -1
- package/schemas/Perttool.GuideResult.v1.schema.json +1 -1
- package/schemas/Perttool.HistoricalGraphResult.v1.schema.json +1 -1
- package/schemas/Perttool.ImportResult.v1.schema.json +1 -1
- package/schemas/Perttool.InitResult.v1.schema.json +1 -1
- package/schemas/Perttool.MilestoneAcceptanceMigrationResult.v1.schema.json +1 -1
- package/schemas/Perttool.MilestoneAcceptanceResult.v1.schema.json +1 -1
- package/schemas/{Perttool.MutationResult.v5.schema.json → Perttool.MutationResult.v6.schema.json} +4 -4
- package/schemas/{Perttool.NextResult.v7.schema.json → Perttool.NextResult.v8.schema.json} +10 -6
- package/schemas/Perttool.OverrideDecision.v1.schema.json +1 -1
- package/schemas/{Perttool.PlanAssuranceResult.v1.schema.json → Perttool.PlanAssuranceResult.v2.schema.json} +5 -5
- package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +1 -1
- package/schemas/{Perttool.ProjectResult.v4.schema.json → Perttool.ProjectResult.v5.schema.json} +70 -7
- package/schemas/Perttool.SchemaResult.v1.schema.json +1 -1
- package/schemas/{Perttool.UnitMigrationResult.v3.schema.json → Perttool.UnitMigrationResult.v4.schema.json} +5 -5
- package/schemas/Perttool.VelocityObservationResult.v1.schema.json +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Rational } from "../model/rational.js";
|
|
2
|
+
import type { CalendarScheduleProfile, CalendarSchedulerInput, WorkSegment } from "./scheduler-types.js";
|
|
3
|
+
import type { TemporalScheduleSourceResult } from "./source-types.js";
|
|
4
|
+
import type { TemporalConstraintProfile } from "./constraint-types.js";
|
|
5
|
+
export interface RequiredScheduleCapability {
|
|
6
|
+
readonly id: "perttool.required-precedence-backward";
|
|
7
|
+
readonly version: 1;
|
|
8
|
+
}
|
|
9
|
+
export type RequiredAnchorSource = "latest_bound" | "advisory_deadline" | "coincident";
|
|
10
|
+
export interface RequiredAnchor {
|
|
11
|
+
readonly source: RequiredAnchorSource;
|
|
12
|
+
readonly instant: Rational;
|
|
13
|
+
}
|
|
14
|
+
export interface RequiredScheduleInput {
|
|
15
|
+
readonly schedule: CalendarSchedulerInput;
|
|
16
|
+
readonly horizonStart: Rational;
|
|
17
|
+
readonly finishDeadline: Rational | null;
|
|
18
|
+
readonly precedenceForward: CalendarScheduleProfile | TemporalConstraintProfile;
|
|
19
|
+
readonly resourceForward: CalendarScheduleProfile;
|
|
20
|
+
}
|
|
21
|
+
export interface RequiredTask {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly requiredStart: Rational;
|
|
24
|
+
readonly requiredFinish: Rational;
|
|
25
|
+
readonly segments: readonly WorkSegment[];
|
|
26
|
+
readonly driverIds: readonly string[];
|
|
27
|
+
}
|
|
28
|
+
export interface RequiredMilestone {
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly requiredReach: Rational;
|
|
31
|
+
readonly driverIds: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
export interface RequiredEventComparison {
|
|
34
|
+
readonly entityKind: "task" | "milestone";
|
|
35
|
+
readonly entityId: string;
|
|
36
|
+
readonly event: "start" | "finish" | "reach";
|
|
37
|
+
readonly required: Rational;
|
|
38
|
+
readonly projected: Rational;
|
|
39
|
+
readonly signedSlackSeconds: Rational;
|
|
40
|
+
}
|
|
41
|
+
export interface RequiredForwardComparison {
|
|
42
|
+
readonly state: "available" | "unavailable";
|
|
43
|
+
readonly classification: "feasible" | "precedence_infeasible" | "resource_heuristic_late" | null;
|
|
44
|
+
readonly optimal: false | null;
|
|
45
|
+
readonly events: readonly RequiredEventComparison[];
|
|
46
|
+
}
|
|
47
|
+
export interface RequiredScheduleCause {
|
|
48
|
+
readonly code: "required_anchor_absent" | "forward_schedule_unavailable" | "calendar_subtraction_unavailable";
|
|
49
|
+
readonly entityIds: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
export interface RequiredScheduleResult {
|
|
52
|
+
readonly modelVersion: 1;
|
|
53
|
+
readonly documentId: string;
|
|
54
|
+
readonly source: TemporalScheduleSourceResult;
|
|
55
|
+
readonly state: "available" | "absent" | "unavailable" | "not_applicable";
|
|
56
|
+
readonly algorithm: Readonly<{
|
|
57
|
+
readonly id: "perttool.required-precedence-backward";
|
|
58
|
+
readonly version: 1;
|
|
59
|
+
readonly optimal: null;
|
|
60
|
+
}>;
|
|
61
|
+
readonly anchor: RequiredAnchor | null;
|
|
62
|
+
readonly tasks: readonly RequiredTask[];
|
|
63
|
+
readonly milestones: readonly RequiredMilestone[];
|
|
64
|
+
readonly precedenceComparison: RequiredForwardComparison;
|
|
65
|
+
readonly resourceComparison: RequiredForwardComparison;
|
|
66
|
+
readonly unavailableCauses: readonly RequiredScheduleCause[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=required-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-types.d.ts","sourceRoot":"","sources":["../../src/temporal-schedule/required-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzG,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,uCAAuC,CAAC;IACrD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;CACrB;AAED,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAEvF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB,GAAG,yBAAyB,CAAC;IAChF,QAAQ,CAAC,eAAe,EAAE,uBAAuB,CAAC;CACnD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,EAAE,QAAQ,CAAC;CACvC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAAC;IAC5C,QAAQ,CAAC,cAAc,EAAE,UAAU,GAAG,uBAAuB,GAAG,yBAAyB,GAAG,IAAI,CAAC;IACjG,QAAQ,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,wBAAwB,GAAG,8BAA8B,GAAG,kCAAkC,CAAC;IAC9G,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,aAAa,GAAG,gBAAgB,CAAC;IAC1E,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC3B,QAAQ,CAAC,EAAE,EAAE,uCAAuC,CAAC;QACrD,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;KACxB,CAAC,CAAC;IACH,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAClD,QAAQ,CAAC,oBAAoB,EAAE,yBAAyB,CAAC;IACzD,QAAQ,CAAC,kBAAkB,EAAE,yBAAyB,CAAC;IACvD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-types.js","sourceRoot":"","sources":["../../src/temporal-schedule/required-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TemporalScheduleSourceResult } from "./source-types.js";
|
|
2
|
+
import type { RequiredScheduleCapability, RequiredScheduleInput, RequiredScheduleResult } from "./required-types.js";
|
|
3
|
+
export declare const REQUIRED_SCHEDULE_CAPABILITY: RequiredScheduleCapability;
|
|
4
|
+
export declare function analyzeRequiredSchedule(source: TemporalScheduleSourceResult, input: RequiredScheduleInput, capability: RequiredScheduleCapability): RequiredScheduleResult;
|
|
5
|
+
//# sourceMappingURL=required.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required.d.ts","sourceRoot":"","sources":["../../src/temporal-schedule/required.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAoB,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,KAAK,EAKV,0BAA0B,EAE1B,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,4BAA4B,EAAE,0BAGzC,CAAC;AAgLH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,4BAA4B,EACpC,KAAK,EAAE,qBAAqB,EAC5B,UAAU,EAAE,0BAA0B,GACrC,sBAAsB,CA+BxB"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { compareStableStrings } from "../model/diagnostics.js";
|
|
2
|
+
import { compare, minimum, subtract } from "../model/rational.js";
|
|
3
|
+
import { addCalendarWorkingTime, subtractCalendarWorkingTime, TEMPORAL_SCHEDULE_SCHEDULER_CAPABILITY, } from "./scheduler.js";
|
|
4
|
+
import { temporalScheduleGraph } from "./schedule-graph.js";
|
|
5
|
+
import { temporalScheduleSourceModel } from "./source.js";
|
|
6
|
+
export const REQUIRED_SCHEDULE_CAPABILITY = Object.freeze({
|
|
7
|
+
id: "perttool.required-precedence-backward",
|
|
8
|
+
version: 1,
|
|
9
|
+
});
|
|
10
|
+
const ALGORITHM = Object.freeze({
|
|
11
|
+
id: "perttool.required-precedence-backward",
|
|
12
|
+
version: 1,
|
|
13
|
+
optimal: null,
|
|
14
|
+
});
|
|
15
|
+
function latest(bounds, entityId, event) {
|
|
16
|
+
return bounds.find((item) => item.entityId === entityId && item.event === event && item.direction === "latest")
|
|
17
|
+
?.value.instantSeconds ?? null;
|
|
18
|
+
}
|
|
19
|
+
function selectAnchor(latestBound, deadline) {
|
|
20
|
+
if (latestBound === null && deadline === null)
|
|
21
|
+
return null;
|
|
22
|
+
if (latestBound === null)
|
|
23
|
+
return Object.freeze({ source: "advisory_deadline", instant: deadline });
|
|
24
|
+
if (deadline === null)
|
|
25
|
+
return Object.freeze({ source: "latest_bound", instant: latestBound });
|
|
26
|
+
const ordering = compare(latestBound, deadline);
|
|
27
|
+
let source = "advisory_deadline";
|
|
28
|
+
if (ordering === 0)
|
|
29
|
+
source = "coincident";
|
|
30
|
+
if (ordering < 0)
|
|
31
|
+
source = "latest_bound";
|
|
32
|
+
return Object.freeze({ source, instant: minimum(latestBound, deadline) });
|
|
33
|
+
}
|
|
34
|
+
function emptyComparison() {
|
|
35
|
+
return Object.freeze({
|
|
36
|
+
state: "unavailable", classification: null, optimal: null, events: Object.freeze([]),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function emptyResult(documentId, source, state, cause) {
|
|
40
|
+
return Object.freeze({
|
|
41
|
+
modelVersion: 1, documentId, source, state, algorithm: ALGORITHM, anchor: null,
|
|
42
|
+
tasks: Object.freeze([]), milestones: Object.freeze([]),
|
|
43
|
+
precedenceComparison: emptyComparison(), resourceComparison: emptyComparison(),
|
|
44
|
+
unavailableCauses: cause === null ? Object.freeze([]) : Object.freeze([cause]),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function setEarlier(values, drivers, id, value, driver) {
|
|
48
|
+
const existing = values.get(id);
|
|
49
|
+
if (existing === undefined || compare(value, existing) < 0) {
|
|
50
|
+
values.set(id, value);
|
|
51
|
+
drivers.set(id, [driver]);
|
|
52
|
+
}
|
|
53
|
+
else if (compare(value, existing) === 0) {
|
|
54
|
+
const merged = new Set([...(drivers.get(id) ?? []), driver]);
|
|
55
|
+
drivers.set(id, [...merged].sort(compareStableStrings));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function requiredTask(state, edge, targetRequired) {
|
|
59
|
+
const finishBound = latest(state.model.taskBounds, edge.id, "finish");
|
|
60
|
+
let requiredFinish = finishBound === null ? targetRequired : minimum(targetRequired, finishBound);
|
|
61
|
+
let subtracted = subtractCalendarWorkingTime(state.source, edge.requirements, state.input.schedule.resources, requiredFinish, edge.expectedWorkSeconds, state.input.horizonStart, TEMPORAL_SCHEDULE_SCHEDULER_CAPABILITY, state.input.schedule.capacityOverrides);
|
|
62
|
+
if (subtracted.state === "unavailable") {
|
|
63
|
+
return Object.freeze({ code: "calendar_subtraction_unavailable", entityIds: Object.freeze([edge.id]) });
|
|
64
|
+
}
|
|
65
|
+
const startBound = latest(state.model.taskBounds, edge.id, "start");
|
|
66
|
+
let requiredStart = subtracted.value;
|
|
67
|
+
if (startBound !== null && compare(startBound, requiredStart) < 0) {
|
|
68
|
+
requiredStart = startBound;
|
|
69
|
+
const forwarded = addCalendarWorkingTime(state.source, edge.requirements, state.input.schedule.resources, requiredStart, edge.expectedWorkSeconds, requiredFinish, TEMPORAL_SCHEDULE_SCHEDULER_CAPABILITY, state.input.schedule.capacityOverrides);
|
|
70
|
+
if (forwarded.state === "unavailable") {
|
|
71
|
+
return Object.freeze({ code: "calendar_subtraction_unavailable", entityIds: Object.freeze([edge.id]) });
|
|
72
|
+
}
|
|
73
|
+
requiredFinish = forwarded.value;
|
|
74
|
+
subtracted = Object.freeze({ ...subtracted, segments: forwarded.segments });
|
|
75
|
+
}
|
|
76
|
+
const drivers = [
|
|
77
|
+
finishBound !== null && compare(requiredFinish, finishBound) === 0 ? `task:${edge.id}:finish:latest` : `milestone:${edge.target}:required`,
|
|
78
|
+
...(startBound !== null && compare(requiredStart, startBound) === 0 ? [`task:${edge.id}:start:latest`] : []),
|
|
79
|
+
].sort(compareStableStrings);
|
|
80
|
+
state.tasks.push(Object.freeze({
|
|
81
|
+
id: edge.id, requiredStart, requiredFinish,
|
|
82
|
+
segments: Object.freeze([...subtracted.segments]), driverIds: Object.freeze(drivers),
|
|
83
|
+
}));
|
|
84
|
+
setEarlier(state.requiredMilestones, state.milestoneDrivers, edge.source, requiredStart, `task:${edge.id}:required_start`);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
function propagateBackward(state) {
|
|
88
|
+
for (const milestoneId of [...state.graph.order].reverse()) {
|
|
89
|
+
const inherited = state.requiredMilestones.get(milestoneId);
|
|
90
|
+
const ownLatest = latest(state.model.milestoneBounds, milestoneId, "reach");
|
|
91
|
+
if (inherited === undefined && ownLatest === null)
|
|
92
|
+
continue;
|
|
93
|
+
const required = inherited === undefined ? ownLatest : ownLatest === null ? inherited : minimum(inherited, ownLatest);
|
|
94
|
+
state.requiredMilestones.set(milestoneId, required);
|
|
95
|
+
if (ownLatest !== null && compare(required, ownLatest) === 0) {
|
|
96
|
+
setEarlier(state.requiredMilestones, state.milestoneDrivers, milestoneId, required, `milestone:${milestoneId}:reach:latest`);
|
|
97
|
+
}
|
|
98
|
+
for (const edge of state.graph.incoming.get(milestoneId)) {
|
|
99
|
+
if (edge.kind === "gate") {
|
|
100
|
+
setEarlier(state.requiredMilestones, state.milestoneDrivers, edge.source, required, `gate:${edge.id}:target_required`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const cause = requiredTask(state, edge, required);
|
|
104
|
+
if (cause !== null)
|
|
105
|
+
return cause;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
function comparisonEvents(tasks, milestones, forward) {
|
|
112
|
+
if (forward.state !== "available" && forward.state !== "infeasible")
|
|
113
|
+
return null;
|
|
114
|
+
const events = [];
|
|
115
|
+
for (const required of tasks) {
|
|
116
|
+
const projected = forward.tasks.find(({ id }) => id === required.id);
|
|
117
|
+
if (projected === undefined)
|
|
118
|
+
continue;
|
|
119
|
+
events.push(Object.freeze({ entityKind: "task", entityId: required.id, event: "start",
|
|
120
|
+
required: required.requiredStart, projected: projected.start,
|
|
121
|
+
signedSlackSeconds: subtract(required.requiredStart, projected.start) }));
|
|
122
|
+
events.push(Object.freeze({ entityKind: "task", entityId: required.id, event: "finish",
|
|
123
|
+
required: required.requiredFinish, projected: projected.finish,
|
|
124
|
+
signedSlackSeconds: subtract(required.requiredFinish, projected.finish) }));
|
|
125
|
+
}
|
|
126
|
+
for (const required of milestones) {
|
|
127
|
+
const projected = forward.milestones.find(({ id }) => id === required.id);
|
|
128
|
+
if (projected === undefined)
|
|
129
|
+
continue;
|
|
130
|
+
events.push(Object.freeze({ entityKind: "milestone", entityId: required.id, event: "reach",
|
|
131
|
+
required: required.requiredReach, projected: projected.reach,
|
|
132
|
+
signedSlackSeconds: subtract(required.requiredReach, projected.reach) }));
|
|
133
|
+
}
|
|
134
|
+
return Object.freeze(events);
|
|
135
|
+
}
|
|
136
|
+
function compareForward(tasks, milestones, forward, kind) {
|
|
137
|
+
const events = comparisonEvents(tasks, milestones, forward);
|
|
138
|
+
if (events === null)
|
|
139
|
+
return emptyComparison();
|
|
140
|
+
const late = events.some(({ signedSlackSeconds }) => compare(signedSlackSeconds, { numerator: 0n, denominator: 1n }) < 0);
|
|
141
|
+
return Object.freeze({
|
|
142
|
+
state: "available",
|
|
143
|
+
classification: !late ? "feasible" : kind === "precedence" ? "precedence_infeasible" : "resource_heuristic_late",
|
|
144
|
+
optimal: kind === "resource" ? false : null,
|
|
145
|
+
events,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export function analyzeRequiredSchedule(source, input, capability) {
|
|
149
|
+
if (capability !== REQUIRED_SCHEDULE_CAPABILITY)
|
|
150
|
+
throw new TypeError("the required-schedule capability is required");
|
|
151
|
+
const model = temporalScheduleSourceModel(source);
|
|
152
|
+
if (model.documentId !== input.schedule.documentId || compare(input.horizonStart, input.schedule.asOf) >= 0) {
|
|
153
|
+
throw new TypeError("required-schedule input does not match the source or horizon");
|
|
154
|
+
}
|
|
155
|
+
if (model.profile.kind === "continuous_fixed_offset")
|
|
156
|
+
return emptyResult(model.documentId, source, "not_applicable", null);
|
|
157
|
+
const finishLatest = latest(model.milestoneBounds, input.schedule.finishMilestoneId, "reach");
|
|
158
|
+
const anchor = selectAnchor(finishLatest, input.finishDeadline);
|
|
159
|
+
if (anchor === null)
|
|
160
|
+
return emptyResult(model.documentId, source, "absent", Object.freeze({ code: "required_anchor_absent", entityIds: Object.freeze([input.schedule.finishMilestoneId]) }));
|
|
161
|
+
const indexed = temporalScheduleGraph(input.schedule);
|
|
162
|
+
const requiredMilestones = new Map([[input.schedule.finishMilestoneId, anchor.instant]]);
|
|
163
|
+
const milestoneDrivers = new Map([[input.schedule.finishMilestoneId, [`anchor:${anchor.source}`]]]);
|
|
164
|
+
const state = { source, input, model, graph: indexed, requiredMilestones, milestoneDrivers, tasks: [] };
|
|
165
|
+
const cause = propagateBackward(state);
|
|
166
|
+
if (cause !== null)
|
|
167
|
+
return emptyResult(model.documentId, source, "unavailable", cause);
|
|
168
|
+
const tasks = Object.freeze(state.tasks.sort((left, right) => compareStableStrings(left.id, right.id)));
|
|
169
|
+
const milestones = Object.freeze(indexed.order.flatMap((id) => {
|
|
170
|
+
const requiredReach = requiredMilestones.get(id);
|
|
171
|
+
return requiredReach === undefined ? [] : [Object.freeze({
|
|
172
|
+
id, requiredReach, driverIds: Object.freeze(milestoneDrivers.get(id) ?? []),
|
|
173
|
+
})];
|
|
174
|
+
}));
|
|
175
|
+
return Object.freeze({
|
|
176
|
+
modelVersion: 1, documentId: model.documentId, source, state: "available", algorithm: ALGORITHM, anchor,
|
|
177
|
+
tasks, milestones,
|
|
178
|
+
precedenceComparison: compareForward(tasks, milestones, input.precedenceForward, "precedence"),
|
|
179
|
+
resourceComparison: compareForward(tasks, milestones, input.resourceForward, "resource"),
|
|
180
|
+
unavailableCauses: Object.freeze([]),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=required.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required.js","sourceRoot":"","sources":["../../src/temporal-schedule/required.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CalendarSchedulerInput, SchedulerEdgeInput } from "./scheduler-types.js";
|
|
2
|
+
export interface TemporalScheduleGraph {
|
|
3
|
+
readonly incoming: ReadonlyMap<string, readonly SchedulerEdgeInput[]>;
|
|
4
|
+
readonly outgoing: ReadonlyMap<string, readonly SchedulerEdgeInput[]>;
|
|
5
|
+
readonly order: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function temporalScheduleGraph(input: CalendarSchedulerInput): TemporalScheduleGraph;
|
|
8
|
+
//# sourceMappingURL=schedule-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-graph.d.ts","sourceRoot":"","sources":["../../src/temporal-schedule/schedule-graph.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEvF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC,CAAC;IACtE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,kBAAkB,EAAE,CAAC,CAAC;IACtE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,qBAAqB,CA6B1F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { compareStableStrings } from "../model/diagnostics.js";
|
|
2
|
+
export function temporalScheduleGraph(input) {
|
|
3
|
+
const incoming = new Map(input.milestoneIds.map((id) => [id, []]));
|
|
4
|
+
const outgoing = new Map(input.milestoneIds.map((id) => [id, []]));
|
|
5
|
+
const ids = new Set();
|
|
6
|
+
for (const edge of input.edges) {
|
|
7
|
+
if (ids.has(edge.id) || !incoming.has(edge.source) || !incoming.has(edge.target)) {
|
|
8
|
+
throw new TypeError(`invalid temporal schedule edge ${edge.id}`);
|
|
9
|
+
}
|
|
10
|
+
ids.add(edge.id);
|
|
11
|
+
incoming.get(edge.target).push(edge);
|
|
12
|
+
outgoing.get(edge.source).push(edge);
|
|
13
|
+
}
|
|
14
|
+
const degree = new Map(input.milestoneIds.map((id) => [id, incoming.get(id).length]));
|
|
15
|
+
const ready = [...degree].filter(([, value]) => value === 0).map(([id]) => id).sort(compareStableStrings);
|
|
16
|
+
const order = [];
|
|
17
|
+
while (ready.length > 0) {
|
|
18
|
+
const id = ready.shift();
|
|
19
|
+
order.push(id);
|
|
20
|
+
for (const edge of outgoing.get(id)) {
|
|
21
|
+
const value = degree.get(edge.target) - 1;
|
|
22
|
+
degree.set(edge.target, value);
|
|
23
|
+
if (value === 0) {
|
|
24
|
+
ready.push(edge.target);
|
|
25
|
+
ready.sort(compareStableStrings);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (order.length !== input.milestoneIds.length)
|
|
30
|
+
throw new TypeError("temporal schedule graph contains a cycle");
|
|
31
|
+
return Object.freeze({ incoming, outgoing, order: Object.freeze(order) });
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=schedule-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule-graph.js","sourceRoot":"","sources":["../../src/temporal-schedule/schedule-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAS/D,MAAM,UAAU,qBAAqB,CAAC,KAA6B;IACjE,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAA0B,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAA0B,CAAC,CAAC,CAAC,CAAC;IAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjF,MAAM,IAAI,SAAS,CAAC,kCAAkC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM;QAAE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IAChH,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Rational } from "../model/rational.js";
|
|
2
|
+
import type { TemporalScheduleSourceResult } from "./source-types.js";
|
|
3
|
+
export interface TemporalScheduleSchedulerCapability {
|
|
4
|
+
readonly id: "perttool.target-grammar-8-calendar-scheduler";
|
|
5
|
+
readonly version: 1;
|
|
6
|
+
}
|
|
7
|
+
export type SchedulerTaskStatus = "planned" | "active" | "blocked" | "done";
|
|
8
|
+
export interface SchedulerRequirement {
|
|
9
|
+
readonly resourceId: string;
|
|
10
|
+
readonly units: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SchedulerResourceInput {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly capacity: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SchedulerTaskInput {
|
|
17
|
+
readonly kind: "task";
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly source: string;
|
|
20
|
+
readonly target: string;
|
|
21
|
+
readonly status: SchedulerTaskStatus;
|
|
22
|
+
readonly expectedWorkSeconds: Rational;
|
|
23
|
+
readonly remainingWorkSeconds?: Rational;
|
|
24
|
+
readonly priority: number;
|
|
25
|
+
readonly totalFloat: Rational;
|
|
26
|
+
readonly requirements: readonly SchedulerRequirement[];
|
|
27
|
+
}
|
|
28
|
+
export interface SchedulerGateInput {
|
|
29
|
+
readonly kind: "gate";
|
|
30
|
+
readonly id: string;
|
|
31
|
+
readonly source: string;
|
|
32
|
+
readonly target: string;
|
|
33
|
+
}
|
|
34
|
+
export type SchedulerEdgeInput = SchedulerTaskInput | SchedulerGateInput;
|
|
35
|
+
export interface CalendarSchedulerInput {
|
|
36
|
+
readonly documentId: string;
|
|
37
|
+
readonly asOf: Rational;
|
|
38
|
+
readonly horizonEnd: Rational;
|
|
39
|
+
readonly finishMilestoneId: string;
|
|
40
|
+
readonly frontierMilestoneIds: readonly string[];
|
|
41
|
+
readonly milestoneIds: readonly string[];
|
|
42
|
+
readonly resources: readonly SchedulerResourceInput[];
|
|
43
|
+
readonly edges: readonly SchedulerEdgeInput[];
|
|
44
|
+
readonly capacityOverrides?: ReadonlyMap<string, number>;
|
|
45
|
+
}
|
|
46
|
+
export interface WorkSegment {
|
|
47
|
+
readonly start: Rational;
|
|
48
|
+
readonly end: Rational;
|
|
49
|
+
}
|
|
50
|
+
export interface ScheduledTask {
|
|
51
|
+
readonly id: string;
|
|
52
|
+
readonly status: SchedulerTaskStatus;
|
|
53
|
+
readonly expectedWorkSeconds: Rational;
|
|
54
|
+
readonly remainingWorkSeconds: Rational;
|
|
55
|
+
readonly start: Rational;
|
|
56
|
+
readonly finish: Rational;
|
|
57
|
+
readonly segments: readonly WorkSegment[];
|
|
58
|
+
readonly requirements: readonly SchedulerRequirement[];
|
|
59
|
+
readonly resourceWaitSeconds: Rational;
|
|
60
|
+
readonly conditionalBlocked: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface ScheduledMilestone {
|
|
63
|
+
readonly id: string;
|
|
64
|
+
readonly reach: Rational;
|
|
65
|
+
}
|
|
66
|
+
export interface ResourceUtilization {
|
|
67
|
+
readonly resourceId: string;
|
|
68
|
+
readonly allocatedUnitSeconds: Rational;
|
|
69
|
+
readonly availableUnitSeconds: Rational;
|
|
70
|
+
readonly utilization: Rational | null;
|
|
71
|
+
}
|
|
72
|
+
export type CalendarScheduleCauseCode = "calendar_profile_absent" | "zone_range_exceeded" | "workday_relationship_missing" | "no_feasible_window" | "calendar_search_limit" | "active_capacity_conflict";
|
|
73
|
+
export interface CalendarScheduleCause {
|
|
74
|
+
readonly code: CalendarScheduleCauseCode;
|
|
75
|
+
readonly taskIds: readonly string[];
|
|
76
|
+
readonly resourceIds: readonly string[];
|
|
77
|
+
readonly limit: number | null;
|
|
78
|
+
}
|
|
79
|
+
export interface CalendarScheduleProfile {
|
|
80
|
+
readonly state: "available" | "unavailable" | "not_applicable";
|
|
81
|
+
readonly algorithm: Readonly<{
|
|
82
|
+
id: "perttool.temporal-precedence-earliest" | "perttool.temporal-parallel-sgs";
|
|
83
|
+
version: 2;
|
|
84
|
+
optimal: false | null;
|
|
85
|
+
}>;
|
|
86
|
+
readonly makespanSeconds: Rational | null;
|
|
87
|
+
readonly tasks: readonly ScheduledTask[];
|
|
88
|
+
readonly milestones: readonly ScheduledMilestone[];
|
|
89
|
+
readonly utilization: readonly ResourceUtilization[];
|
|
90
|
+
readonly unavailableCauses: readonly CalendarScheduleCause[];
|
|
91
|
+
}
|
|
92
|
+
export interface CalendarSchedulerResult {
|
|
93
|
+
readonly modelVersion: 1;
|
|
94
|
+
readonly documentId: string;
|
|
95
|
+
readonly source: TemporalScheduleSourceResult;
|
|
96
|
+
readonly precedence: CalendarScheduleProfile;
|
|
97
|
+
readonly resource: CalendarScheduleProfile;
|
|
98
|
+
}
|
|
99
|
+
export interface WorkingTimeResult {
|
|
100
|
+
readonly state: "available" | "unavailable";
|
|
101
|
+
readonly value: Rational | null;
|
|
102
|
+
readonly segments: readonly WorkSegment[];
|
|
103
|
+
readonly unavailableCauses: readonly CalendarScheduleCause[];
|
|
104
|
+
}
|
|
105
|
+
export interface CalendarVelocityInput {
|
|
106
|
+
readonly points: Rational;
|
|
107
|
+
readonly period: Rational;
|
|
108
|
+
readonly periodUnit: "hour" | "day";
|
|
109
|
+
}
|
|
110
|
+
export interface WorkSecondsResult {
|
|
111
|
+
readonly state: "available" | "unavailable";
|
|
112
|
+
readonly seconds: Rational | null;
|
|
113
|
+
readonly unavailableCauses: readonly CalendarScheduleCause[];
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=scheduler-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler-types.d.ts","sourceRoot":"","sources":["../../src/temporal-schedule/scheduler-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler-types.js","sourceRoot":"","sources":["../../src/temporal-schedule/scheduler-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Rational } from "../model/rational.js";
|
|
2
|
+
import type { CalendarSchedulerInput, CalendarSchedulerResult, CalendarVelocityInput, SchedulerRequirement, SchedulerResourceInput, TemporalScheduleSchedulerCapability, WorkingTimeResult, WorkSecondsResult } from "./scheduler-types.js";
|
|
3
|
+
export declare const TEMPORAL_SCHEDULE_SCHEDULER_CAPABILITY: TemporalScheduleSchedulerCapability;
|
|
4
|
+
export declare const TEMPORAL_SCHEDULE_SCHEDULER_LIMITS: Readonly<{
|
|
5
|
+
workSegments: 1000000;
|
|
6
|
+
scheduleEvents: 1000000;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function addCalendarWorkingTime(source: import("./source-types.js").TemporalScheduleSourceResult, requirements: readonly SchedulerRequirement[], resources: readonly SchedulerResourceInput[], start: Rational, work: Rational, horizonEnd: Rational, capability: TemporalScheduleSchedulerCapability, capacityOverrides?: ReadonlyMap<string, number>): WorkingTimeResult;
|
|
9
|
+
export declare function subtractCalendarWorkingTime(source: import("./source-types.js").TemporalScheduleSourceResult, requirements: readonly SchedulerRequirement[], resources: readonly SchedulerResourceInput[], end: Rational, work: Rational, horizonStart: Rational, capability: TemporalScheduleSchedulerCapability, capacityOverrides?: ReadonlyMap<string, number>): WorkingTimeResult;
|
|
10
|
+
export declare function calendarWorkSeconds(source: import("./source-types.js").TemporalScheduleSourceResult, value: Rational, unit: "hour" | "day" | "point", velocity: CalendarVelocityInput | null, capability: TemporalScheduleSchedulerCapability): WorkSecondsResult;
|
|
11
|
+
export declare function analyzeCalendarSchedule(source: import("./source-types.js").TemporalScheduleSourceResult, input: CalendarSchedulerInput, capability: TemporalScheduleSchedulerCapability): CalendarSchedulerResult;
|
|
12
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/temporal-schedule/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAuBrD,OAAO,KAAK,EAGV,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EAKrB,oBAAoB,EACpB,sBAAsB,EAEtB,mCAAmC,EACnC,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,sCAAsC,EACjD,mCAGE,CAAC;AAEL,eAAO,MAAM,kCAAkC;;;EAG7C,CAAC;AA8MH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,EAChE,YAAY,EAAE,SAAS,oBAAoB,EAAE,EAC7C,SAAS,EAAE,SAAS,sBAAsB,EAAE,EAC5C,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,QAAQ,EACpB,UAAU,EAAE,mCAAmC,EAC/C,iBAAiB,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GACzD,iBAAiB,CAKnB;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,EAChE,YAAY,EAAE,SAAS,oBAAoB,EAAE,EAC7C,SAAS,EAAE,SAAS,sBAAsB,EAAE,EAC5C,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,QAAQ,EACtB,UAAU,EAAE,mCAAmC,EAC/C,iBAAiB,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GACzD,iBAAiB,CAKnB;AAYD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,EAChE,KAAK,EAAE,QAAQ,EACf,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,EAC9B,QAAQ,EAAE,qBAAqB,GAAG,IAAI,EACtC,UAAU,EAAE,mCAAmC,GAC9C,iBAAiB,CAyBnB;AAgfD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,mBAAmB,EAAE,4BAA4B,EAChE,KAAK,EAAE,sBAAsB,EAC7B,UAAU,EAAE,mCAAmC,GAC9C,uBAAuB,CAezB"}
|